]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add extra tests to threadtest4.c. Fix a benign data race accessing the
authordrh <drh@noemail.net>
Fri, 12 Dec 2014 23:17:54 +0000 (23:17 +0000)
committerdrh <drh@noemail.net>
Fri, 12 Dec 2014 23:17:54 +0000 (23:17 +0000)
text encoding using ENC(db).

FossilOrigin-Name: d7bb7ea4ab97ad26f4c84c9b8dc2827010093803

manifest
manifest.uuid
src/main.c
src/pragma.c
src/prepare.c
src/sqliteInt.h
test/threadtest4.c

index 599bf4fb39956cfa29a3f254f030209df45c193c..ff005f7ef45f9062afb3d89b4c8cc40f29e23c56 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sextra\stests\sto\sthreadtest3.
-D 2014-12-12T16:39:38.824
+C Add\sextra\stests\sto\sthreadtest4.c.\s\sFix\sa\sbenign\sdata\srace\saccessing\sthe\ntext\sencoding\susing\sENC(db).
+D 2014-12-12T23:17:54.003
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 6c4f961fa91d0b4fa121946a19f9e5eac2f2f809
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -195,7 +195,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
 F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e
 F src/lempar.c 7274c97d24bb46631e504332ccd3bd1b37841770
 F src/loadext.c 86bd4e2fccd520b748cba52492ab60c4a770f660
-F src/main.c 1f40f66165a6609203a5ff7ecb0292b90b302130
+F src/main.c 48e0410a661c629471ca9061d4153245cc9f853b
 F src/malloc.c 740db54387204c9a2eb67c6d98e68b08e9ef4eab
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
 F src/mem1.c faf615aafd8be74a71494dfa027c113ea5c6615f
@@ -222,8 +222,8 @@ F src/parse.y 5dfead8aed90cb0c7c1115898ee2266804daff45
 F src/pcache.c ace1b67632deeaa84859b4c16c27711dfb7db3d4
 F src/pcache.h b44658c9c932d203510279439d891a2a83e12ba8
 F src/pcache1.c facbdd3ecc09c8f750089d941305694301328e98
-F src/pragma.c d54cdd40b63d608f2d95b7482c710690e3593a73
-F src/prepare.c b7b7bf020bd4c962f7c8aed5a3c542c7dfe9f9c7
+F src/pragma.c c93be505649183b2d80082c2eef1a56879dabfe6
+F src/prepare.c 173a5a499138451b2561614ecb87d78f9f4644b9
 F src/printf.c 9e75a6a0b55bf61cfff7d7e19d89834a1b938236
 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696
 F src/resolve.c f6c46d3434439ab2084618d603e6d6dbeb0d6ada
@@ -233,7 +233,7 @@ F src/shell.c 45d9c9bd7cde07845af957f2d849933b990773cf
 F src/sqlite.h.in 116dc731361549ee3fc79dcebace11b57d24dcfd
 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
 F src/sqlite3ext.h 17d487c3c91b0b8c584a32fbeb393f6f795eea7d
-F src/sqliteInt.h 073d54f7a631b978b66d50d255c84549fb9e5429
+F src/sqliteInt.h d36da9a07130cae13cbfee0986bf20028cb01465
 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
 F src/status.c 81712116e826b0089bb221b018929536b2b5406f
 F src/table.c f142bba7903e93ca8d113a5b8877a108ad1a27dc
@@ -913,7 +913,7 @@ F test/thread_common.tcl 334639cadcb9f912bf82aa73f49efd5282e6cadd
 F test/threadtest1.c 6029d9c5567db28e6dc908a0c63099c3ba6c383b
 F test/threadtest2.c ace893054fa134af3fc8d6e7cfecddb8e3acefb9
 F test/threadtest3.c bef2bde18b4e638b6cf4b119aa2076123ffdc425
-F test/threadtest4.c 1678c340387c19ae28b18e4d8f71d4a989297e46
+F test/threadtest4.c c1e67136ceb6c7ec8184e56ac61db28f96bd2925
 F test/tkt-02a8e81d44.test 6c80d9c7514e2a42d4918bf87bf6bc54f379110c
 F test/tkt-26ff0c2d1e.test 888324e751512972c6e0d1a09df740d8f5aaf660
 F test/tkt-2a5629202f.test 0521bd25658428baa26665aa53ffed9367d33af2
@@ -1231,7 +1231,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P d8d3e6d04cbb9e3033ad8613e3dbd4ad0b01765a
-R 2ae2d517339c22d48400a669b2098fec
-U dan
-Z 951a78f63dc9b91d226749536e3eb614
+P f6bf86f907cbff31bed3cbfc922c10c973575498
+R 97f096b77c750d9e694c3063635e4c8a
+U drh
+Z 4a2c4212438d559f2811b75a6a368836
index 816a546aaecb648bff30909261ce8201aac1a7ed..2694c2c3638f55495797474be532713a49a6620d 100644 (file)
@@ -1 +1 @@
-f6bf86f907cbff31bed3cbfc922c10c973575498
\ No newline at end of file
+d7bb7ea4ab97ad26f4c84c9b8dc2827010093803
\ No newline at end of file
index 5dfa29279f0abb5d9dba0ee00cc28a00600ac98a..c89ccbd55d06a16260335dfb9792d8a5ef9c7e4b 100644 (file)
@@ -2758,6 +2758,7 @@ static int openDatabase(
   }
   sqlite3BtreeEnter(db->aDb[0].pBt);
   db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt);
+  if( !db->mallocFailed ) ENC(db) = SCHEMA_ENC(db);
   sqlite3BtreeLeave(db->aDb[0].pBt);
   db->aDb[1].pSchema = sqlite3SchemaGet(db, 0);
 
@@ -2916,7 +2917,7 @@ int sqlite3_open16(
                       SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
     assert( *ppDb || rc==SQLITE_NOMEM );
     if( rc==SQLITE_OK && !DbHasProperty(*ppDb, 0, DB_SchemaLoaded) ){
-      ENC(*ppDb) = SQLITE_UTF16NATIVE;
+      SCHEMA_ENC(*ppDb) = ENC(*ppDb) = SQLITE_UTF16NATIVE;
     }
   }else{
     rc = SQLITE_NOMEM;
index ab9a2836298b7755a5ea2d0c8f93cb0b55f05d1f..837a15102d670bc292948af8c65cf311ac646f0b 100644 (file)
@@ -2080,7 +2080,8 @@ void sqlite3Pragma(
       ){
         for(pEnc=&encnames[0]; pEnc->zName; pEnc++){
           if( 0==sqlite3StrICmp(zRight, pEnc->zName) ){
-            ENC(pParse->db) = pEnc->enc ? pEnc->enc : SQLITE_UTF16NATIVE;
+            SCHEMA_ENC(db) = ENC(db) =
+                pEnc->enc ? pEnc->enc : SQLITE_UTF16NATIVE;
             break;
           }
         }
index ca9c64b4410dd53912ed2c286954cab10e3babdc..97be900d68f3c160f3a7df07489facbf3f6daf26 100644 (file)
@@ -394,9 +394,11 @@ int sqlite3Init(sqlite3 *db, char **pzErrMsg){
   int commit_internal = !(db->flags&SQLITE_InternChanges);
   
   assert( sqlite3_mutex_held(db->mutex) );
+  assert( sqlite3BtreeHoldsMutex(db->aDb[0].pBt) );
   assert( db->init.busy==0 );
   rc = SQLITE_OK;
   db->init.busy = 1;
+  ENC(db) = SCHEMA_ENC(db);
   for(i=0; rc==SQLITE_OK && i<db->nDb; i++){
     if( DbHasProperty(db, i, DB_SchemaLoaded) || i==1 ) continue;
     rc = sqlite3InitOne(db, i, pzErrMsg);
index 80f9597557329c7f7d2bafb4843decb42511416e..d90089ba0ee33df3e2bd3141df87b2a1116b4b58 100644 (file)
@@ -1059,6 +1059,7 @@ struct sqlite3 {
   int errCode;                  /* Most recent error code (SQLITE_*) */
   int errMask;                  /* & result codes with this before returning */
   u16 dbOptFlags;               /* Flags to enable/disable optimizations */
+  u8 enc;                       /* Text encoding */
   u8 autoCommit;                /* The auto-commit flag. */
   u8 temp_store;                /* 1: file 2: memory 0: default */
   u8 mallocFailed;              /* True if we have seen a malloc failure */
@@ -1160,7 +1161,8 @@ struct sqlite3 {
 /*
 ** A macro to discover the encoding of a database.
 */
-#define ENC(db) ((db)->aDb[0].pSchema->enc)
+#define SCHEMA_ENC(db) ((db)->aDb[0].pSchema->enc)
+#define ENC(db)        ((db)->enc)
 
 /*
 ** Possible values for the sqlite3.flags.
index 859841c73806b736c21cbf1558cab8918b8623e2..da5ce75f051888c908eea952dcb17f39b3ac9456 100644 (file)
@@ -305,20 +305,49 @@ static void *worker_thread(void *pArg){
     }else if( sqlite3_column_int(pStmt, 0)!=400 ){
       worker_error(p, "Wrong result: %d", sqlite3_column_int(pStmt,0));
     }
-    if( p->nErr ) break;
     sqlite3_finalize(pStmt);
+    if( p->nErr ) break;
 
     if( ((iOuter+p->tid)%3)==0 ){
       sqlite3_db_release_memory(p->db);
       p->nTest++;
     }
 
+    pthread_mutex_lock(p->pWrMutex);
+    run_sql(p, "BEGIN;");
+    run_sql(p, "UPDATE t1 SET c=NULL WHERE a=55");
+    run_sql(p, "UPDATE t2 SET f=NULL WHERE d=42");
+    run_sql(p, "UPDATE t3 SET z=NULL WHERE x=31");
+    run_sql(p, "ROLLBACK;");
+    p->nTest++;
+    pthread_mutex_unlock(p->pWrMutex);
+
+
     if( iOuter==p->tid ){
       pthread_mutex_lock(p->pWrMutex);
       run_sql(p, "VACUUM");
       pthread_mutex_unlock(p->pWrMutex);
     }
 
+    pStmt = prep_sql(p->db,
+       "SELECT t1.rowid, t2.rowid, t3.rowid"
+       "  FROM t1, t2, t3"
+       " WHERE t1.tid=%d AND t2.tid=%d AND t3.tid=%d"
+       "   AND t1.a<>t2.d AND t2.d<>t3.x"
+       " ORDER BY 1, 2, 3"
+       ,p->tid, p->tid, p->tid);
+    worker_trace(p, "query [%s]", sqlite3_sql(pStmt));
+    for(i=0; i<p->nWorker; i++){
+      rc = sqlite3_step(pStmt);
+      if( rc!=SQLITE_ROW ){
+        worker_error(p, "Failed to step: %s", sqlite3_sql(pStmt));
+        break;
+      }
+      sched_yield();
+    }
+    sqlite3_finalize(pStmt);
+    if( p->nErr ) break;
+
     worker_delete_all_content(p, (p->tid+iOuter)%2);
     worker_close_connection(p);
     p->db = 0;