mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Add tests to ensure that patchsets are handled correctly by the session rebase
APIs. FossilOrigin-Name: 0e45baaec01947f6cbf47d5d5922a4cabe7d27181c04c0a08259c952fd023947
This commit is contained in:
@ -385,5 +385,60 @@ foreach {tn p} {
|
|||||||
} [list REPLACE $p]
|
} [list REPLACE $p]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
# Check that apply_v2() does not create a rebase buffer for a patchset.
|
||||||
|
# And that it is not possible to rebase a patchset.
|
||||||
|
#
|
||||||
|
do_execsql_test 4.0 {
|
||||||
|
CREATE TABLE t5(o PRIMARY KEY, p, q);
|
||||||
|
INSERT INTO t5 VALUES(1, 2, 3);
|
||||||
|
INSERT INTO t5 VALUES(4, 5, 6);
|
||||||
|
}
|
||||||
|
foreach {tn cmd rebasable} {
|
||||||
|
1 patchset 0
|
||||||
|
2 changeset 1
|
||||||
|
} {
|
||||||
|
proc xConflict {args} { return "OMIT" }
|
||||||
|
do_test 4.1.$tn {
|
||||||
|
execsql {
|
||||||
|
BEGIN;
|
||||||
|
DELETE FROM t5 WHERE o=4;
|
||||||
|
}
|
||||||
|
|
||||||
|
sqlite3session S db main
|
||||||
|
S attach *
|
||||||
|
execsql {
|
||||||
|
INSERT INTO t5 VALUES(4, 'five', 'six');
|
||||||
|
}
|
||||||
|
set P [S $cmd]
|
||||||
|
S delete
|
||||||
|
|
||||||
|
execsql ROLLBACK;
|
||||||
|
|
||||||
|
set ::rebase [sqlite3changeset_apply_v2 db $P xConflict]
|
||||||
|
expr [llength $::rebase]>0
|
||||||
|
} $rebasable
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach {tn cmd rebasable} {
|
||||||
|
1 patchset 0
|
||||||
|
2 changeset 1
|
||||||
|
} {
|
||||||
|
do_test 4.2.$tn {
|
||||||
|
sqlite3session S db main
|
||||||
|
S attach *
|
||||||
|
execsql {
|
||||||
|
INSERT INTO t5 VALUES(5+$tn, 'five', 'six');
|
||||||
|
}
|
||||||
|
set P [S $cmd]
|
||||||
|
S delete
|
||||||
|
|
||||||
|
sqlite3rebaser_create R
|
||||||
|
R configure $::rebase
|
||||||
|
expr [catch {R rebase $P}]==0
|
||||||
|
} $rebasable
|
||||||
|
|
||||||
|
catch { R delete }
|
||||||
|
}
|
||||||
finish_test
|
finish_test
|
||||||
|
|
||||||
|
@ -5024,6 +5024,9 @@ int sqlite3changeset_concat_strm(
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Changeset rebaser handle.
|
||||||
|
*/
|
||||||
struct sqlite3_rebaser {
|
struct sqlite3_rebaser {
|
||||||
sqlite3_changegroup grp; /* Hash table */
|
sqlite3_changegroup grp; /* Hash table */
|
||||||
};
|
};
|
||||||
@ -5064,6 +5067,25 @@ static void sessionAppendRecordMerge(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This function is called when rebasing a local UPDATE change against one
|
||||||
|
** or more remote UPDATE changes. The aRec/nRec buffer contains the current
|
||||||
|
** old.* and new.* records for the change. The rebase buffer (a single
|
||||||
|
** record) is in aChange/nChange. The rebased change is appended to buffer
|
||||||
|
** pBuf.
|
||||||
|
**
|
||||||
|
** Rebasing the UPDATE involves:
|
||||||
|
**
|
||||||
|
** * Removing any changes to fields for which the corresponding field
|
||||||
|
** in the rebase buffer is set to "replaced" (type 0xFF). If this
|
||||||
|
** means the UPDATE change updates no fields, nothing is appended
|
||||||
|
** to the output buffer.
|
||||||
|
**
|
||||||
|
** * For each field modified by the local change for which the
|
||||||
|
** corresponding field in the rebase buffer is not "undefined" (0x00)
|
||||||
|
** or "replaced" (0xFF), the old.* value is replaced by the value
|
||||||
|
** in the rebase buffer.
|
||||||
|
*/
|
||||||
static void sessionAppendPartialUpdate(
|
static void sessionAppendPartialUpdate(
|
||||||
SessionBuffer *pBuf, /* Append record here */
|
SessionBuffer *pBuf, /* Append record here */
|
||||||
sqlite3_changeset_iter *pIter, /* Iterator pointed at local change */
|
sqlite3_changeset_iter *pIter, /* Iterator pointed at local change */
|
||||||
@ -5117,6 +5139,21 @@ static void sessionAppendPartialUpdate(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** pIter is configured to iterate through a changeset. This function rebases
|
||||||
|
** that changeset according to the current configuration of the rebaser
|
||||||
|
** object passed as the first argument. If no error occurs and argument xOutput
|
||||||
|
** is not NULL, then the changeset is returned to the caller by invoking
|
||||||
|
** xOutput zero or more times and SQLITE_OK returned. Or, if xOutput is NULL,
|
||||||
|
** then (*ppOut) is set to point to a buffer containing the rebased changeset
|
||||||
|
** before this function returns. In this case (*pnOut) is set to the size of
|
||||||
|
** the buffer in bytes. It is the responsibility of the caller to eventually
|
||||||
|
** free the (*ppOut) buffer using sqlite3_free().
|
||||||
|
**
|
||||||
|
** If an error occurs, an SQLite error code is returned. If ppOut and
|
||||||
|
** pnOut are not NULL, then the two output parameters are set to 0 before
|
||||||
|
** returning.
|
||||||
|
*/
|
||||||
static int sessionRebase(
|
static int sessionRebase(
|
||||||
sqlite3_rebaser *p, /* Rebaser hash table */
|
sqlite3_rebaser *p, /* Rebaser hash table */
|
||||||
sqlite3_changeset_iter *pIter, /* Input data */
|
sqlite3_changeset_iter *pIter, /* Input data */
|
||||||
@ -5132,7 +5169,7 @@ static int sessionRebase(
|
|||||||
SessionTable *pTab = 0;
|
SessionTable *pTab = 0;
|
||||||
SessionBuffer sOut = {0,0,0};
|
SessionBuffer sOut = {0,0,0};
|
||||||
|
|
||||||
while( SQLITE_ROW==sessionChangesetNext(pIter, &aRec, &nRec, &bNew) ){
|
while( SQLITE_ROW==sessionChangesetNext(pIter, &aRec, &nRec, &bNew) ){
|
||||||
SessionChange *pChange = 0;
|
SessionChange *pChange = 0;
|
||||||
int bDone = 0;
|
int bDone = 0;
|
||||||
|
|
||||||
|
14
manifest
14
manifest
@ -1,5 +1,5 @@
|
|||||||
C Remove\ssome\sunused\scode\sfrom\sthe\ssessions\smodule.
|
C Add\stests\sto\sensure\sthat\spatchsets\sare\shandled\scorrectly\sby\sthe\ssession\srebase\nAPIs.
|
||||||
D 2018-03-22T11:15:59.453
|
D 2018-03-22T14:07:36.942
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F Makefile.in 7016fc56c6b9bfe5daac4f34be8be38d8c0b5fab79ccbfb764d3b23bf1c6fff3
|
F Makefile.in 7016fc56c6b9bfe5daac4f34be8be38d8c0b5fab79ccbfb764d3b23bf1c6fff3
|
||||||
@ -400,10 +400,10 @@ F ext/session/sessionat.test efe88965e74ff1bc2af9c310b28358c02d420c1fb2705cc7a28
|
|||||||
F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec
|
F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec
|
||||||
F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7
|
F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7
|
||||||
F ext/session/sessionfault2.test 883c8919ebcf6c140ba86b480bc14ae642ee9969c009e0b355c8981a5266f9ed
|
F ext/session/sessionfault2.test 883c8919ebcf6c140ba86b480bc14ae642ee9969c009e0b355c8981a5266f9ed
|
||||||
F ext/session/sessionrebase.test 7cb11b80e6bc13756ac8a51a0601a11f124ee1aa3b1e9eab61ed660b8cab0ef4
|
F ext/session/sessionrebase.test cfcbb5649d0fb2568651413d0b1bcf462f2d67a7f31f7a30feb84eaaaada2638
|
||||||
F ext/session/sessionstat1.test 41cd97c2e48619a41cdf8ae749e1b25f34719de638689221aa43971be693bf4e
|
F ext/session/sessionstat1.test 41cd97c2e48619a41cdf8ae749e1b25f34719de638689221aa43971be693bf4e
|
||||||
F ext/session/sessionwor.test 2f3744236dc8b170a695b7d8ddc8c743c7e79fdc
|
F ext/session/sessionwor.test 2f3744236dc8b170a695b7d8ddc8c743c7e79fdc
|
||||||
F ext/session/sqlite3session.c 8cea7c63efa1e217d99ffeb3e67199c9538cf7fe5373c1d2ac2b62a691a2dc55
|
F ext/session/sqlite3session.c c2e9047c95d769b6e2c3fb28bbdb4972489b08f614bfd95c1a7f86ac0db7ac54
|
||||||
F ext/session/sqlite3session.h 5f40a0660ff972c0c50f5fd6b33488fdbd2eb0c1244ea95777f8dbd5e529be04
|
F ext/session/sqlite3session.h 5f40a0660ff972c0c50f5fd6b33488fdbd2eb0c1244ea95777f8dbd5e529be04
|
||||||
F ext/session/test_session.c f253742ea01b089326f189b5ae15a5b55c1c9e97452e4a195ee759ba51b404d5
|
F ext/session/test_session.c f253742ea01b089326f189b5ae15a5b55c1c9e97452e4a195ee759ba51b404d5
|
||||||
F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3
|
F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3
|
||||||
@ -1716,7 +1716,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P d00b71ecf857bc6d903442d91418d5a313c584dcdd8e9c8ff3b5d940dd45bcc5
|
P a09518ab63a1ef1b7f56b9f9b16269fd83920469d4c4e179b1f68b35df4e0c4b
|
||||||
R 1a609de137c9dc0274aa7feaed1a7236
|
R 540efa4ba550adb2ed0df3b20fe42653
|
||||||
U dan
|
U dan
|
||||||
Z 10aaa03ec1ff02e2361d604078258cf8
|
Z d881b19a01a687698d13e50ca6bf2cbd
|
||||||
|
@ -1 +1 @@
|
|||||||
a09518ab63a1ef1b7f56b9f9b16269fd83920469d4c4e179b1f68b35df4e0c4b
|
0e45baaec01947f6cbf47d5d5922a4cabe7d27181c04c0a08259c952fd023947
|
Reference in New Issue
Block a user