aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/session/session2.test38
-rw-r--r--ext/session/session3.test2
-rw-r--r--ext/session/session4.test5
-rw-r--r--ext/session/sessionfault.test4
-rw-r--r--ext/session/sqlite3session.c66
-rw-r--r--ext/session/test_session.c6
-rw-r--r--manifest22
-rw-r--r--manifest.uuid2
8 files changed, 94 insertions, 51 deletions
diff --git a/ext/session/session2.test b/ext/session/session2.test
index 6662173d4..7adbfd5b6 100644
--- a/ext/session/session2.test
+++ b/ext/session/session2.test
@@ -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
diff --git a/ext/session/session3.test b/ext/session/session3.test
index a0946f309..c7046d9c8 100644
--- a/ext/session/session3.test
+++ b/ext/session/session3.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}
diff --git a/ext/session/session4.test b/ext/session/session4.test
index c69fa85fc..f695c2e46 100644
--- a/ext/session/session4.test
+++ b/ext/session/session4.test
@@ -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
diff --git a/ext/session/sessionfault.test b/ext/session/sessionfault.test
index e1c2980b7..cf155f4f3 100644
--- a/ext/session/sessionfault.test
+++ b/ext/session/sessionfault.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;
}
diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c
index 36d83e6b8..75385e5f2 100644
--- a/ext/session/sqlite3session.c
+++ b/ext/session/sqlite3session.c
@@ -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,37 +1378,31 @@ 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 ){
- if( sqlite3_step(pSel)==SQLITE_ROW ){
- int iCol;
- if( p->bInsert ){
- sessionAppendByte(&buf, SQLITE_INSERT, &rc);
- sessionAppendByte(&buf, p->bIndirect, &rc);
- for(iCol=0; iCol<nCol; iCol++){
- sessionAppendCol(&buf, pSel, iCol, &rc);
- }
- }else{
- sessionAppendUpdate(&buf, pSel, p, abPK, &rc);
- }
- }else if( !p->bInsert ){
- /* A DELETE change */
- sessionAppendByte(&buf, SQLITE_DELETE, &rc);
+ rc = sessionSelectBind(pSel, nCol, abPK, p);
+ if( sqlite3_step(pSel)==SQLITE_ROW ){
+ int iCol;
+ if( p->bInsert ){
+ sessionAppendByte(&buf, SQLITE_INSERT, &rc);
sessionAppendByte(&buf, p->bIndirect, &rc);
- sessionAppendBlob(&buf, p->aRecord, p->nRecord, &rc);
- }
- if( rc==SQLITE_OK ){
- rc = sqlite3_reset(pSel);
+ for(iCol=0; iCol<nCol; iCol++){
+ sessionAppendCol(&buf, pSel, iCol, &rc);
+ }
+ }else{
+ sessionAppendUpdate(&buf, pSel, p, abPK, &rc);
}
+ }else if( !p->bInsert ){
+ /* A DELETE change */
+ sessionAppendByte(&buf, SQLITE_DELETE, &rc);
+ sessionAppendByte(&buf, p->bIndirect, &rc);
+ sessionAppendBlob(&buf, p->aRecord, p->nRecord, &rc);
+ }
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_reset(pSel);
}
}
}
@@ -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;
}
diff --git a/ext/session/test_session.c b/ext/session/test_session.c
index 4befd0fe6..a8b73824a 100644
--- a/ext/session/test_session.c
+++ b/ext/session/test_session.c
@@ -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' : '.');
}
diff --git a/manifest b/manifest
index a8b17c0fc..263bf3c2a 100644
--- a/manifest
+++ b/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
diff --git a/manifest.uuid b/manifest.uuid
index c8072ced9..622c16332 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-666123c8d07be87d477e67b1cebef2b0fba5b4bc \ No newline at end of file
+4255a9f609c4fd43582a0874143eabe211199726 \ No newline at end of file