]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improvements to SCopy correctness tracking when SQLITE_DEBUG is enabled.
authordrh <drh@noemail.net>
Tue, 12 Jun 2018 13:52:23 +0000 (13:52 +0000)
committerdrh <drh@noemail.net>
Tue, 12 Jun 2018 13:52:23 +0000 (13:52 +0000)
FossilOrigin-Name: b2973f2357a2c5e22e0d612c970adbc6d51cbc5e4ff7ac6d2b678722e553e8ec

manifest
manifest.uuid
src/vdbe.c
src/vdbeInt.h
src/vdbeapi.c
src/vdbeaux.c
src/vdbemem.c

index 080168b890fc7e23569464c99751b32ae117c350..10c89ed3bd2e88e69da451de7d9e6ff8b6474979 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sthe\s"Synopsis"\son\sthe\sOP_BitNot\sopcode.
-D 2018-06-12T13:16:57.062
+C Improvements\sto\sSCopy\scorrectness\stracking\swhen\sSQLITE_DEBUG\sis\senabled.
+D 2018-06-12T13:52:23.858
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in bfc40f350586923e0419d2ea4b559c37ec10ee4b6e210e08c14401f8e340f0da
@@ -565,13 +565,13 @@ F src/upsert.c 47edd408cc73f8d3c00a140550d1ad180b407c146285947969dd09874802bf88
 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
 F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
 F src/vacuum.c 36e7d21a20c0bf6ef4ef7c399d192b5239410b7c4d3c1070fba4e30810d0b855
-F src/vdbe.c eb9588981fdab2c5a3ac3aaccf6d0289d49c23efb67e01791abf870841b76a3a
+F src/vdbe.c 7509cbdad75624ed397e581210db27cb2c99882a40cd1c3c2948641220a14a48
 F src/vdbe.h 9c8c245fa3785266c269ab02c135c836ff49a307612186686bcdae500f409945
-F src/vdbeInt.h 8ebc37ead2cfde92a63d74e3940fe0a94d456078c77e6cefbc2ecf15630f9fda
-F src/vdbeapi.c 765a0bbe01311626417de6cb743f7f25f9f98435c98a9df4bb0714d11014633d
-F src/vdbeaux.c 0e7af8614c87dd25bc2395d22c847deba96ff87d19758d5cd7f459a466f14cbb
+F src/vdbeInt.h 4531c172f8a51f90e3dcb8f49531ab64b17ad3aef85d19a6e8c925c2ddf59c66
+F src/vdbeapi.c af4a3de00d1851bcbc55b85dfbe52849aa2b1e17b4a5a1f3d9c257df7af361ff
+F src/vdbeaux.c c2d65c763b0811afe409e02e9d0d1f300c6e97892474fc94eec3da71955cd418
 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191
-F src/vdbemem.c 613cbbcca8d21c66df311fc17f9460180abcf7a909e12493618fd570f9858036
+F src/vdbemem.c e042161c85e1ce03ca9237e67e59c8381bc585ac6eaeae272f096f59ba4ec4be
 F src/vdbesort.c 731a09e5cb9e96b70c394c1b7cf3860fbe84acca7682e178615eb941a3a0ef2f
 F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392
 F src/vtab.c 10ea07dec111de6fb0a4fc87a7ffa4c65fdc088a19dbfaf7d6f2b128f2e8eb7b
@@ -1731,7 +1731,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 02e337e0808947c7ef376b5a300cd3c461f1a368c9fe7ffd7ca5744f102641c2
-R 2591c22cb15e250fcbdde34025ae1c5c
+P acd78df61188591d33ddb9b1b8c16bcc015f4dffac66314529caa747d4395c70
+R 93c40cd2c3858b20bb206e515693fb00
 U drh
-Z ff6163391180b8bdeebeb47ffcfc1ba4
+Z 26ce7d0e08fb2667e584724fb5000334
index f62837562a619d69b07984bfd3bd60118bb8652f..826912931d51c2cf992ccb545f252f23714bf4ba 100644 (file)
@@ -1 +1 @@
-acd78df61188591d33ddb9b1b8c16bcc015f4dffac66314529caa747d4395c70
\ No newline at end of file
+b2973f2357a2c5e22e0d612c970adbc6d51cbc5e4ff7ac6d2b678722e553e8ec
\ No newline at end of file
index 13d9e9c9a97eadef609c7273f49dd3efdbbfc143..6cdfadb563aa90fa835647f95e24b7b31a09eb70 100644 (file)
@@ -1276,10 +1276,12 @@ case OP_Copy: {
   pOut = &aMem[pOp->p2];
   assert( pOut!=pIn1 );
   while( 1 ){
+    memAboutToChange(p, pOut);
     sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem);
     Deephemeralize(pOut);
 #ifdef SQLITE_DEBUG
     pOut->pScopyFrom = 0;
+    pOut->iTabColHash = 0;
 #endif
     REGISTER_TRACE(pOp->p2+pOp->p3-n, pOut);
     if( (n--)==0 ) break;
@@ -1308,7 +1310,8 @@ case OP_SCopy: {            /* out2 */
   assert( pOut!=pIn1 );
   sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem);
 #ifdef SQLITE_DEBUG
-  if( pOut->pScopyFrom==0 ) pOut->pScopyFrom = pIn1;
+  pOut->pScopyFrom = pIn1;
+  pOut->mScopyFlags = pIn1->flags;
 #endif
   break;
 }
index c883ce8b506ed0e9c3faa783b7d55d10ce90c1c9..7bc56c0e39a18f346656fef82343702c2b25b0f9 100644 (file)
@@ -209,7 +209,7 @@ struct sqlite3_value {
   void (*xDel)(void*);/* Destructor for Mem.z - only valid if MEM_Dyn */
 #ifdef SQLITE_DEBUG
   Mem *pScopyFrom;    /* This Mem is a shallow copy of pScopyFrom */
-  void *pFiller;      /* So that sizeof(Mem) is a multiple of 8 */
+  u16 mScopyFlags;    /* flags value immediately after the shallow copy */
 #endif
 #ifdef SQLITE_DEBUG_COLUMNCACHE
   u32 iTabColHash;    /* Hash of table.column that is origin of this value */
index ced3e90144120b962c8403c4cc785258719b84b5..fcc315bc653eae7accfeb32231e572064e4c7f90 100644 (file)
@@ -970,7 +970,10 @@ static const Mem *columnNullValue(void){
         /* .xDel       = */ (void(*)(void*))0,
 #ifdef SQLITE_DEBUG
         /* .pScopyFrom = */ (Mem*)0,
-        /* .pFiller    = */ (void*)0,
+        /* .mScopyFlags= */ 0,
+#endif
+#ifdef SQLITE_DEBUG_COLUMNCACHE
+        /* .iTabColHash= */ 0,
 #endif
       };
   return &nullMem;
index 856cad764932ea7bd7e923c510983e267993a621..d6efead3214f02f40b2a27e7d449954227062443 100644 (file)
@@ -1646,6 +1646,9 @@ static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){
     p->szMalloc = 0;
 #ifdef SQLITE_DEBUG
     p->pScopyFrom = 0;
+#endif
+#ifdef SQLITE_DEBUG_COLUMNCACHE
+    p->iTabColHash = 0;
 #endif
     p++;
   }
index 5ce4bca79d41394426a1e9a89434f3e51052fd80..06dc28eacba727af57abdd8957d1e5d9349fe57d 100644 (file)
@@ -892,7 +892,7 @@ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){
       ** function for pX.  Minor changes, such as adding or removing a
       ** dual type, are allowed, as long as the underlying value is the
       ** same. */
-      u16 mFlags = pMem->flags & pX->flags;
+      u16 mFlags = pMem->flags & pX->flags & pX->mScopyFlags;
       assert( (mFlags&MEM_Int)==0 || pMem->u.i==pX->u.i );
       assert( (mFlags&MEM_Real)==0 || pMem->u.r==pX->u.r );
       assert( (mFlags&MEM_Str)==0  || (pMem->n==pX->n && pMem->z==pX->z) );