mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Improve coverage of session module.
FossilOrigin-Name: 3dfd1d63bddfa9bd9018eb00bee1d496379630b5
This commit is contained in:
@ -183,6 +183,13 @@ do_concat_test 2.1 {
|
||||
} {
|
||||
SELECT indirect(0);
|
||||
UPDATE abc SET a='one point six' WHERE c = 'three';
|
||||
} {
|
||||
CREATE TABLE x1(a, b, PRIMARY KEY(a));
|
||||
SELECT indirect(1);
|
||||
INSERT INTO x1 VALUES(1, 2);
|
||||
} {
|
||||
SELECT indirect(1);
|
||||
UPDATE x1 SET b = 3 WHERE a = 1;
|
||||
}
|
||||
|
||||
catch {db close}
|
||||
@ -204,6 +211,50 @@ do_concat_test 2.2 {
|
||||
INSERT INTO t2 VALUES('x', 'y');
|
||||
}
|
||||
|
||||
do_test 2.3.0 {
|
||||
catch {db close}
|
||||
forcedelete test.db
|
||||
sqlite3 db test.db
|
||||
|
||||
set sql1 ""
|
||||
set sql2 ""
|
||||
for {set i 1} {$i < 120} {incr i} {
|
||||
append sql1 "INSERT INTO x1 VALUES($i*4, $i);"
|
||||
}
|
||||
for {set i 1} {$i < 120} {incr i} {
|
||||
append sql2 "DELETE FROM x1 WHERE a = $i*4;"
|
||||
}
|
||||
|
||||
set {} {}
|
||||
} {}
|
||||
do_concat_test 2.3 {
|
||||
CREATE TABLE x1(a PRIMARY KEY, b)
|
||||
} $sql1 $sql2 $sql1 $sql2
|
||||
|
||||
do_concat_test 2.4 {
|
||||
CREATE TABLE x2(a PRIMARY KEY, b);
|
||||
CREATE TABLE x3(a PRIMARY KEY, b);
|
||||
|
||||
INSERT INTO x2 VALUES('a', 'b');
|
||||
INSERT INTO x2 VALUES('x', 'y');
|
||||
INSERT INTO x3 VALUES('a', 'b');
|
||||
} {
|
||||
INSERT INTO x2 VALUES('c', 'd');
|
||||
INSERT INTO x3 VALUES('e', 'f');
|
||||
INSERT INTO x3 VALUES('x', 'y');
|
||||
}
|
||||
|
||||
do_concat_test 2.5 {
|
||||
UPDATE x3 SET b = 'Y' WHERE a = 'x'
|
||||
} {
|
||||
DELETE FROM x3 WHERE a = 'x'
|
||||
} {
|
||||
DELETE FROM x2 WHERE a = 'a'
|
||||
} {
|
||||
INSERT INTO x2 VALUES('a', 'B');
|
||||
}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Test that schema incompatibilities are detected correctly.
|
||||
#
|
||||
|
@ -2793,13 +2793,21 @@ static int sessionChangeMerge(
|
||||
pNew->bIndirect = (bIndirect && pExist->bIndirect);
|
||||
aCsr = pNew->aRecord = (u8 *)&pNew[1];
|
||||
|
||||
if( op1==SQLITE_INSERT && op2==SQLITE_UPDATE ){
|
||||
if( op1==SQLITE_INSERT ){ /* INSERT + UPDATE */
|
||||
u8 *a1 = aRec;
|
||||
assert( op2==SQLITE_UPDATE );
|
||||
pNew->bInsert = SQLITE_INSERT;
|
||||
sessionReadRecord(&a1, pTab->nCol, 0);
|
||||
sessionMergeRecord(&aCsr, pTab, pExist->aRecord, a1);
|
||||
}
|
||||
else if( op1==SQLITE_UPDATE && op2==SQLITE_UPDATE ){
|
||||
}else if( op1==SQLITE_DELETE ){ /* DELETE + INSERT */
|
||||
assert( op2==SQLITE_INSERT );
|
||||
pNew->bInsert = SQLITE_UPDATE;
|
||||
if( 0==sessionMergeUpdate(&aCsr, pTab, pExist->aRecord, 0, aRec, 0) ){
|
||||
sqlite3_free(pNew);
|
||||
pNew = 0;
|
||||
}
|
||||
}else if( op2==SQLITE_UPDATE ){ /* UPDATE + UPDATE */
|
||||
assert( op1==SQLITE_UPDATE );
|
||||
u8 *a1 = pExist->aRecord;
|
||||
u8 *a2 = aRec;
|
||||
sessionReadRecord(&a1, pTab->nCol, 0);
|
||||
@ -2809,18 +2817,11 @@ static int sessionChangeMerge(
|
||||
sqlite3_free(pNew);
|
||||
pNew = 0;
|
||||
}
|
||||
}
|
||||
else if( op1==SQLITE_UPDATE && op2==SQLITE_DELETE ){
|
||||
}else{ /* UPDATE + DELETE */
|
||||
assert( op1==SQLITE_UPDATE && op2==SQLITE_DELETE );
|
||||
pNew->bInsert = SQLITE_DELETE;
|
||||
sessionMergeRecord(&aCsr, pTab, aRec, pExist->aRecord);
|
||||
}
|
||||
else if( op1==SQLITE_DELETE && op2==SQLITE_INSERT ){
|
||||
pNew->bInsert = SQLITE_UPDATE;
|
||||
if( 0==sessionMergeUpdate(&aCsr, pTab, pExist->aRecord, 0, aRec, 0) ){
|
||||
sqlite3_free(pNew);
|
||||
pNew = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if( pNew ){
|
||||
pNew->nRecord = (aCsr - pNew->aRecord);
|
||||
@ -2860,6 +2861,10 @@ int sessionConcatChangeset(
|
||||
assert( pIter->apValue==0 );
|
||||
sqlite3changeset_op(pIter, &zNew, &nCol, &op, &bIndirect);
|
||||
|
||||
assert( zNew>=(char *)pChangeset && zNew-nChangeset<((char *)pChangeset) );
|
||||
assert( !pTab || pTab->zName-nChangeset<(char *)pChangeset );
|
||||
assert( !pTab || zNew>=pTab->zName );
|
||||
|
||||
if( !pTab || zNew!=pTab->zName ){
|
||||
/* Search the list for a matching table */
|
||||
int nNew = strlen(zNew);
|
||||
|
Reference in New Issue
Block a user