]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improve coverage of session module a bit more.
authordan <dan@noemail.net>
Fri, 25 Mar 2011 19:06:09 +0000 (19:06 +0000)
committerdan <dan@noemail.net>
Fri, 25 Mar 2011 19:06:09 +0000 (19:06 +0000)
FossilOrigin-Name: 4255a9f609c4fd43582a0874143eabe211199726

ext/session/session2.test
ext/session/session3.test
ext/session/session4.test
ext/session/sessionfault.test
ext/session/sqlite3session.c
ext/session/test_session.c
manifest
manifest.uuid

index 6662173d49c1c80b34c145bf3177fca5912b93b0..7adbfd5b6f98eeeae5a0ff8d27a1afdf83065c0f 100644 (file)
@@ -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
index a0946f30990a1ac3f2f63363e00b3e179a7e48da..c7046d9c8f5acc032f78d80ab57b1eaf182d1a45 100644 (file)
@@ -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}
index c69fa85fc47414c6dfc48b1bce051b8e2eba3d06..f695c2e467a8fcef9fe06c06c4a4b185c1a3ddba 100644 (file)
@@ -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
index e1c2980b7992801f5fe088793868f2e3183c1c7b..cf155f4f3d736fba406b8d9c3434205825e2d7ef 100644 (file)
@@ -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;
   }
index 36d83e6b8e216e17c026254f0226e902ba9903f8..75385e5f2e809078de1004e06081940882c1f2a7 100644 (file)
@@ -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;
 }
index 4befd0fe6850bd60fdd606d9fec9c968ca108966..a8b73824a03fcd6c6cefec714e1a8dfc7d633678 100644 (file)
@@ -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' : '.');
     }
index a8b17c0fc5b50650922a79bfd3f2cb1a1bf1bd82..263bf3c2a2de73fc14b4beb5c682b0073bed4c8d 100644 (file)
--- 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
index c8072ced973513f01428886a57e511d8aaad7ccc..622c16332bd131a7d915c2c9cd03950c1718e0b5 100644 (file)
@@ -1 +1 @@
-666123c8d07be87d477e67b1cebef2b0fba5b4bc
\ No newline at end of file
+4255a9f609c4fd43582a0874143eabe211199726
\ No newline at end of file