c0e712
# Ensure that comparison operators do not mess up the MEM_Dyn flag on registers
c0e712
# when reverting affinity changes.
c0e712
# Upstream original patch: https://www.sqlite.org/src/info/02e3c88fbf6abdcf
c0e712
c0e712
diff -up sqlite-src-3071700/src/vdbe.c.old sqlite-src-3071700/src/vdbe.c
c0e712
--- sqlite-src-3071700/src/vdbe.c.old	2015-07-23 11:54:21.781280736 +0200
c0e712
+++ sqlite-src-3071700/src/vdbe.c	2015-07-23 11:58:24.829703086 +0200
c0e712
@@ -1852,7 +1852,13 @@ case OP_Ge: {             /* same as TK_
c0e712
     affinity = pOp->p5 & SQLITE_AFF_MASK;
c0e712
     if( affinity ){
c0e712
       applyAffinity(pIn1, affinity, encoding);
c0e712
+      testcase( (flags1&MEM_Dyn) != (pIn1->flags&MEM_Dyn) );
c0e712
+      flags1 = (pIn1->flags & ~MEM_TypeMask) | (flags1 & MEM_TypeMask);
c0e712
+
c0e712
       applyAffinity(pIn3, affinity, encoding);
c0e712
+      testcase( (flags3&MEM_Dyn) != (pIn3->flags&MEM_Dyn) );
c0e712
+      flags3 = (pIn3->flags & ~MEM_TypeMask) | (flags3 & MEM_TypeMask);
c0e712
+
c0e712
       if( db->mallocFailed ) goto no_mem;
c0e712
     }
c0e712
 
c0e712
@@ -1881,7 +1887,9 @@ case OP_Ge: {             /* same as TK_
c0e712
   }
c0e712
 
c0e712
   /* Undo any changes made by applyAffinity() to the input registers. */
c0e712
+  assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) );
c0e712
   pIn1->flags = (pIn1->flags&~MEM_TypeMask) | (flags1&MEM_TypeMask);
c0e712
+  assert( (pIn3->flags & MEM_Dyn) == (flags3 & MEM_Dyn) );
c0e712
   pIn3->flags = (pIn3->flags&~MEM_TypeMask) | (flags3&MEM_TypeMask);
c0e712
   break;
c0e712
 }