Improve coverage of session module a bit more.
FossilOrigin-Name: 4255a9f609c4fd43582a0874143eabe211199726
This commit is contained in:
parent
f51e5f6c99
commit
e5754eec26
@ -44,12 +44,24 @@ do_iterator_test 1.1 t1 {
|
||||
{DELETE t1 0 X. {t i t one} {}}
|
||||
{INSERT t1 0 X. {} {t ii t two}}
|
||||
}
|
||||
|
||||
do_iterator_test 1.2 t1 {
|
||||
INSERT INTO t1 VALUES(1.5, 99.9)
|
||||
} {
|
||||
{INSERT t1 0 X. {} {f 1.5 f 99.9}}
|
||||
}
|
||||
|
||||
do_iterator_test 1.3 t1 {
|
||||
UPDATE t1 SET b = 100.1 WHERE a = 1.5;
|
||||
UPDATE t1 SET b = 99.9 WHERE a = 1.5;
|
||||
} { }
|
||||
|
||||
do_iterator_test 1.4 t1 {
|
||||
UPDATE t1 SET b = 100.1 WHERE a = 1.5;
|
||||
} {
|
||||
{UPDATE t1 0 X. {f 1.5 f 99.9} {{} {} f 100.1}}
|
||||
}
|
||||
|
||||
|
||||
# Execute each of the following blocks of SQL on database [db1]. Collect
|
||||
# changes using a session object. Apply the resulting changeset to
|
||||
@ -520,6 +532,32 @@ do_test 9.3 {
|
||||
execsql { SELECT * FROM t1 } db2
|
||||
} {x 2}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
test_reset
|
||||
db function enable [list S enable]
|
||||
|
||||
do_common_sql {
|
||||
CREATE TABLE t1(a PRIMARY KEY, b);
|
||||
INSERT INTO t1 VALUES('x', 'X');
|
||||
}
|
||||
|
||||
do_iterator_test 10.1 t1 {
|
||||
INSERT INTO t1 VALUES('y', 'Y');
|
||||
SELECT enable(0);
|
||||
INSERT INTO t1 VALUES('z', 'Z');
|
||||
SELECT enable(1);
|
||||
} {
|
||||
{INSERT t1 0 X. {} {t y t Y}}
|
||||
}
|
||||
|
||||
sqlite3session S db main
|
||||
do_execsql_test 10.2 {
|
||||
SELECT enable(0);
|
||||
SELECT enable(-1);
|
||||
SELECT enable(1);
|
||||
SELECT enable(-1);
|
||||
} {0 0 1 1}
|
||||
S delete
|
||||
|
||||
finish_test
|
||||
|
@ -146,7 +146,7 @@ do_test 2.3 {
|
||||
execsql {
|
||||
INSERT INTO t2 VALUES(1, 2);
|
||||
DROP TABLE t2;
|
||||
CREATE TABLE t2(a PRIMARY KEY, b, c);
|
||||
CREATE TABLE t2(a PRIMARY KEY, b);
|
||||
}
|
||||
list [catch { S changeset } msg] $msg
|
||||
} {1 SQLITE_SCHEMA}
|
||||
|
@ -59,4 +59,9 @@ do_test 1.2 {
|
||||
list [catch { sqlite3changeset_invert $x } msg] $msg
|
||||
} {1 SQLITE_CORRUPT}
|
||||
|
||||
do_test 1.3 {
|
||||
set x [binary format "ca*" 0 [string range $changeset 1 end]]
|
||||
list [catch { sqlite3changeset_apply db $x xConflict } msg] $msg
|
||||
} {1 SQLITE_CORRUPT}
|
||||
|
||||
finish_test
|
||||
|
@ -45,7 +45,7 @@ do_faultsim_test 1.1 -faults oom-* -prep {
|
||||
sqlite3 db2 test.db2
|
||||
} -body {
|
||||
do_then_apply_sql {
|
||||
INSERT INTO t1 VALUES(7, 8, 9);
|
||||
INSERT INTO t1 VALUES('a string value', 8, 9);
|
||||
UPDATE t1 SET c = 10 WHERE a = 1;
|
||||
DELETE FROM t1 WHERE a = 4;
|
||||
}
|
||||
@ -63,7 +63,7 @@ do_faultsim_test 1.2 -faults oom-* -prep {
|
||||
sqlite3session S db main
|
||||
S attach *
|
||||
execsql {
|
||||
INSERT INTO t1 VALUES(7, 8, 9);
|
||||
INSERT INTO t1 VALUES('a string value', 8, 9);
|
||||
UPDATE t1 SET c = 10 WHERE a = 1;
|
||||
DELETE FROM t1 WHERE a = 4;
|
||||
}
|
||||
|
@ -1181,10 +1181,10 @@ static void sessionAppendUpdate(
|
||||
break;
|
||||
}
|
||||
|
||||
case SQLITE_TEXT:
|
||||
case SQLITE_BLOB: {
|
||||
default: {
|
||||
int nByte;
|
||||
int nHdr = 1 + sessionVarintGet(&pCsr[1], &nByte);
|
||||
assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB );
|
||||
nAdvance = nHdr + nByte;
|
||||
if( eType==sqlite3_column_type(pStmt, i)
|
||||
&& nByte==sqlite3_column_bytes(pStmt, i)
|
||||
@ -1260,19 +1260,18 @@ static int sessionSelectBind(
|
||||
sqlite3_stmt *pSelect,
|
||||
int nCol,
|
||||
u8 *abPK,
|
||||
u8 *aRecord,
|
||||
int nRecord
|
||||
SessionChange *pChange
|
||||
){
|
||||
int i;
|
||||
int rc = SQLITE_OK;
|
||||
u8 *a = aRecord;
|
||||
u8 *a = pChange->aRecord;
|
||||
|
||||
for(i=0; i<nCol && rc==SQLITE_OK; i++){
|
||||
int eType = *a++;
|
||||
|
||||
switch( eType ){
|
||||
case SQLITE_NULL:
|
||||
if( abPK[i] ) rc = sqlite3_bind_null(pSelect, i+1);
|
||||
assert( abPK[i]==0 );
|
||||
break;
|
||||
|
||||
case SQLITE_INTEGER: {
|
||||
@ -1305,8 +1304,9 @@ static int sessionSelectBind(
|
||||
break;
|
||||
}
|
||||
|
||||
case SQLITE_BLOB: {
|
||||
default: {
|
||||
int n;
|
||||
assert( eType==SQLITE_BLOB );
|
||||
a += sessionVarintGet(a, &n);
|
||||
if( abPK[i] ){
|
||||
rc = sqlite3_bind_blob(pSelect, i+1, a, n, SQLITE_TRANSIENT);
|
||||
@ -1337,14 +1337,17 @@ int sqlite3session_changeset(
|
||||
SessionBuffer buf = {0,0,0}; /* Buffer in which to accumlate changeset */
|
||||
int rc; /* Return code */
|
||||
|
||||
sqlite3_mutex_enter(sqlite3_db_mutex(db));
|
||||
|
||||
/* Zero the output variables in case an error occurs. If this session
|
||||
** object is already in the error state (sqlite3_session.rc != SQLITE_OK),
|
||||
** this call will be a no-op. */
|
||||
*pnChangeset = 0;
|
||||
*ppChangeset = 0;
|
||||
rc = pSession->rc;
|
||||
|
||||
if( pSession->rc ) return pSession->rc;
|
||||
rc = sqlite3_exec(pSession->db, "SAVEPOINT changeset", 0, 0, 0);
|
||||
if( rc!=SQLITE_OK ) return rc;
|
||||
|
||||
sqlite3_mutex_enter(sqlite3_db_mutex(db));
|
||||
|
||||
for(pTab=pSession->pTable; rc==SQLITE_OK && pTab; pTab=pTab->pNext){
|
||||
if( pTab->nEntry ){
|
||||
@ -1375,17 +1378,12 @@ int sqlite3session_changeset(
|
||||
db, pSession->zDb, zName, nCol, azCol, abPK, &pSel);
|
||||
}
|
||||
|
||||
if( rc==SQLITE_OK && nCol!=sqlite3_column_count(pSel) ){
|
||||
rc = SQLITE_SCHEMA;
|
||||
}
|
||||
|
||||
nNoop = buf.nBuf;
|
||||
for(i=0; i<pTab->nChange && rc==SQLITE_OK; i++){
|
||||
SessionChange *p; /* Used to iterate through changes */
|
||||
|
||||
for(p=pTab->apChange[i]; rc==SQLITE_OK && p; p=p->pNext){
|
||||
rc = sessionSelectBind(pSel, nCol, abPK, p->aRecord, p->nRecord);
|
||||
if( rc==SQLITE_OK ){
|
||||
rc = sessionSelectBind(pSel, nCol, abPK, p);
|
||||
if( sqlite3_step(pSel)==SQLITE_ROW ){
|
||||
int iCol;
|
||||
if( p->bInsert ){
|
||||
@ -1408,7 +1406,6 @@ int sqlite3session_changeset(
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sqlite3_finalize(pSel);
|
||||
if( buf.nBuf==nNoop ){
|
||||
@ -1425,6 +1422,7 @@ int sqlite3session_changeset(
|
||||
sqlite3_free(buf.aBuf);
|
||||
}
|
||||
|
||||
sqlite3_exec(db, "RELEASE changeset", 0, 0, 0);
|
||||
sqlite3_mutex_leave(sqlite3_db_mutex(db));
|
||||
return rc;
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ static int test_session_cmd(
|
||||
|
||||
case 3: { /* enable */
|
||||
int val;
|
||||
if( Tcl_GetBooleanFromObj(interp, objv[2], &val) ) return TCL_ERROR;
|
||||
if( Tcl_GetIntFromObj(interp, objv[2], &val) ) return TCL_ERROR;
|
||||
val = sqlite3session_enable(pSession, val);
|
||||
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(val));
|
||||
break;
|
||||
@ -436,6 +436,7 @@ static int test_sqlite3session_foreach(
|
||||
|
||||
while( SQLITE_ROW==sqlite3changeset_next(pIter) ){
|
||||
int nCol; /* Number of columns in table */
|
||||
int nCol2; /* Number of columns in table */
|
||||
int op; /* SQLITE_INSERT, UPDATE or DELETE */
|
||||
const char *zTab; /* Name of table change applies to */
|
||||
Tcl_Obj *pVar; /* Tcl value to set $VARNAME to */
|
||||
@ -460,7 +461,8 @@ static int test_sqlite3session_foreach(
|
||||
|
||||
zPK = ckalloc(nCol+1);
|
||||
memset(zPK, 0, nCol+1);
|
||||
sqlite3changeset_pk(pIter, &abPK, 0);
|
||||
sqlite3changeset_pk(pIter, &abPK, &nCol2);
|
||||
assert( nCol==nCol2 );
|
||||
for(i=0; i<nCol; i++){
|
||||
zPK[i] = (abPK[i] ? 'X' : '.');
|
||||
}
|
||||
|
22
manifest
22
manifest
@ -1,5 +1,5 @@
|
||||
C Improve\scoverage\sof\ssession\smodule\scode.
|
||||
D 2011-03-25T10:52:02
|
||||
C Improve\scoverage\sof\ssession\smodule\sa\sbit\smore.
|
||||
D 2011-03-25T19:06:10
|
||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||
F Makefile.in 27701a1653595a1f2187dc61c8117e00a6c1d50f
|
||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||
@ -100,14 +100,14 @@ F ext/rtree/sqlite3rtree.h 1af0899c63a688e272d69d8e746f24e76f10a3f0
|
||||
F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de
|
||||
F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024
|
||||
F ext/session/session1.test b2da15b9d727d7f4e5fe95599b32b92d93b5a970
|
||||
F ext/session/session2.test f2f0bad3f27c9084f5f51444d017ede485cee009
|
||||
F ext/session/session3.test 5b2e9d0b94af5d7770f89e020d83b838584ccc64
|
||||
F ext/session/session4.test 3b39b468bf871f3b7825f64f9ce9f3849ff4b156
|
||||
F ext/session/session2.test e36222e1f48bc9b1d80eacd001994d307c107e73
|
||||
F ext/session/session3.test 919f7e2e07fa5a166a0ea5d8ac3fbe7f38f7e447
|
||||
F ext/session/session4.test a37bc9d8891ea1f3e120056c978f66c925f040b9
|
||||
F ext/session/session_common.tcl fb91560b6dbd086010df8b3a137a452f1ac21a28
|
||||
F ext/session/sessionfault.test d7e6154a30e85622d0733b1a1e3c63e9b8b7004b
|
||||
F ext/session/sqlite3session.c 8057ed55d25c4d487ec8b68a3ee1c2c25dd543da
|
||||
F ext/session/sessionfault.test 2544a2e2ecad56e3c07a32c09799871d243c114c
|
||||
F ext/session/sqlite3session.c 9be8ccee4248681700659b89a81ae5c6cb8afacc
|
||||
F ext/session/sqlite3session.h f284bac51c12de0e0096fc986e61f5ae6b9e5be5
|
||||
F ext/session/test_session.c 5f186a9f45958620ebc0609099538eb7cabdfe84
|
||||
F ext/session/test_session.c f8fdf5c110898b2bbc20c475fca879664c77fb5a
|
||||
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895
|
||||
F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
|
||||
F main.mk ae0868e05c76eaa8a0ae3d6927a949b1c8e810d7
|
||||
@ -925,7 +925,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||
P 76d2d2ad3b2a5171393b7894f35f463ff284e53b
|
||||
R b7843eac9e1de41d0b79cfdd795816c8
|
||||
P 666123c8d07be87d477e67b1cebef2b0fba5b4bc
|
||||
R 06396f39a2dba603f238d63a566a7e13
|
||||
U dan
|
||||
Z 4c90a35f73d811b840852d363dcb9fdc
|
||||
Z 44bcd7637527a5a2be65b60012fc28ed
|
||||
|
@ -1 +1 @@
|
||||
666123c8d07be87d477e67b1cebef2b0fba5b4bc
|
||||
4255a9f609c4fd43582a0874143eabe211199726
|
Loading…
Reference in New Issue
Block a user