]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with inserting zeroblob() into an indexed column. (CVS 3982)
authordanielk1977 <danielk1977@noemail.net>
Fri, 11 May 2007 07:08:28 +0000 (07:08 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Fri, 11 May 2007 07:08:28 +0000 (07:08 +0000)
FossilOrigin-Name: ccef5d2daaa5a88dd3f23666f022296ef42f9d73

manifest
manifest.uuid
src/vdbe.c
test/fuzz.test

index a543922d8dfe1c6d903171f7803382877be5fe8b..ab2aa5b3cdda902bfb2092794c09fee1d03a1109 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Additional\sparsing\sbugs\sfixed.\s(CVS\s3981)
-D 2007-05-11T01:44:51
+C Fix\sa\sproblem\swith\sinserting\szeroblob()\sinto\san\sindexed\scolumn.\s(CVS\s3982)
+D 2007-05-11T07:08:28
 F Makefile.in 87b200ad9970907f76df734d29dff3d294c10935
 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935
 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -132,7 +132,7 @@ F src/update.c 3359041db390a8f856d67272f299600e2104f350
 F src/utf.c be7c64eed83fa3c01e0c42905e1c311dcd1be704
 F src/util.c 4f6bbcec2b2b1884d652b82c9f8949ede4618d68
 F src/vacuum.c 8bd895d29e7074e78d4e80f948e35ddc9cf2beef
-F src/vdbe.c 308c698ad96a43249e12cb5067a4a823a6dea307
+F src/vdbe.c d1be8d8605608b6d7d925d40e1eb96e30d646fbc
 F src/vdbe.h 001c5b257567c1d3de7feb2203aac71d0d7b16a3
 F src/vdbeInt.h bddb7931fc1216fda6f6720e18d2a9b1e0f8fc96
 F src/vdbeapi.c 3ca7808c67a10b5c20150108b431d520d141e93e
@@ -248,7 +248,7 @@ F test/fts2l.test 4c53c89ce3919003765ff4fd8d98ecf724d97dd3
 F test/fts2m.test 4b30142ead6f3ed076e880a2a464064c5ad58c51
 F test/fts2n.test a70357e72742681eaebfdbe9007b87ff3b771638
 F test/func.test bf30bac1c5ce10448ab739994268cf18f8b3fa30
-F test/fuzz.test db1bffeeb367b0e9147a1822db5c8c17c6f0b2ab
+F test/fuzz.test 1015e6a1452e14d36797977923593a938ba35d2f
 F test/fuzz2.test fdbea571808441c12c91e9cd038eb77b4692d42b
 F test/hook.test 7e7645fd9a033f79cce8fdff151e32715e7ec50a
 F test/icu.test e6bfae7f625c88fd14df6f540fe835bdfc1e4329
@@ -488,7 +488,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
-P d146f01a02579339c5dc86bbe59f246bd6c05c63
-R 7125d6d53e0b2202166323742c3b01c2
-U drh
-Z 23c6aad98fcd55bc5de6b8a43a789f0e
+P d12a8924c6083cdff14990b4fd036ca386c2e34a
+R 680b3290f2d024e3ae05a79ad5b14302
+U danielk1977
+Z 9cd69253fcac83ce88c7739ef57267d1
index 9036fb4804019926e4cd79871ea627abe4a05239..a904b22361eb30a88de91e91d18d8a13fffee76b 100644 (file)
@@ -1 +1 @@
-d12a8924c6083cdff14990b4fd036ca386c2e34a
\ No newline at end of file
+ccef5d2daaa5a88dd3f23666f022296ef42f9d73
\ No newline at end of file
index 243f8974e15ae7cf64900fd6908df04f709f2658..ef474365a8f078eb51da9172d4e327a5e92f9ad9 100644 (file)
@@ -43,7 +43,7 @@
 ** in this file for details.  If in doubt, do not deviate from existing
 ** commenting and indentation practices when changing or adding code.
 **
-** $Id: vdbe.c,v 1.615 2007/05/10 21:14:03 drh Exp $
+** $Id: vdbe.c,v 1.616 2007/05/11 07:08:28 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 #include "os.h"
@@ -919,7 +919,7 @@ case OP_Pull: {            /* no-push */
   Deephemeralize(pTos);
   for(i=0; i<pOp->p1; i++, pFrom++){
     Deephemeralize(&pFrom[1]);
-    assert( (pFrom->flags & MEM_Ephem)==0 );
+    assert( (pFrom[1].flags & MEM_Ephem)==0 );
     *pFrom = pFrom[1];
     if( pFrom->flags & MEM_Short ){
       assert( pFrom->flags & (MEM_Str|MEM_Blob) );
@@ -2276,6 +2276,9 @@ case OP_MakeRecord: {
     if( pRec->flags&MEM_Null ){
       containsNull = 1;
     }
+    if( pRec->flags&MEM_Zero && pRec->n>0 ){
+      sqlite3VdbeMemExpandBlob(pRec);
+    }
     serial_type = sqlite3VdbeSerialType(pRec, file_format);
     len = sqlite3VdbeSerialTypeLen(serial_type);
     nData += len;
@@ -2283,7 +2286,6 @@ case OP_MakeRecord: {
     if( pRec->flags & MEM_Zero ){
       /* Only pure zero-filled BLOBs can be input to this Opcode.
       ** We do not allow blobs with a prefix and a zero-filled tail. */
-      assert( pRec->n==0 );
       nZero += pRec->u.i;
     }else if( len ){
       nZero = 0;
@@ -3830,12 +3832,15 @@ case OP_IdxInsert: {        /* no-push */
   assert( p->apCsr[i]!=0 );
   assert( pTos->flags & MEM_Blob );
   if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
-    int nKey = pTos->n;
-    const char *zKey = pTos->z;
     assert( pC->isTable==0 );
-    rc = sqlite3BtreeInsert(pCrsr, zKey, nKey, "", 0, 0, pOp->p2);
-    assert( pC->deferredMoveto==0 );
-    pC->cacheStatus = CACHE_STALE;
+    rc = sqlite3VdbeMemExpandBlob(pTos);
+    if( rc==SQLITE_OK ){
+      int nKey = pTos->n;
+      const char *zKey = pTos->z;
+      rc = sqlite3BtreeInsert(pCrsr, zKey, nKey, "", 0, 0, pOp->p2);
+      assert( pC->deferredMoveto==0 );
+      pC->cacheStatus = CACHE_STALE;
+    }
   }
   Release(pTos);
   pTos--;
index c92d037913d8df86796fc4a2a4f06d4065fd7fcf..4cc9620971687192d0b16219ae7ac2a76da4098c 100644 (file)
@@ -13,7 +13,7 @@
 # (a.k.a. "fuzz") and sending it into the parser to try to generate
 # errors.
 #
-# $Id: fuzz.test,v 1.4 2007/05/11 00:20:08 drh Exp $
+# $Id: fuzz.test,v 1.5 2007/05/11 07:08:29 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -135,13 +135,11 @@ do_test fuzz-1.6 {
 
 do_test fuzz-1.7 {
   execsql {
-    SELECT (
-      SELECT zeroblob(1000) FROM (
-        SELECT * FROM (SELECT 'first') ORDER BY NOT 'in'
-      )
+    SELECT ( SELECT zeroblob(1000) FROM ( 
+      SELECT * FROM (SELECT 'first') ORDER BY NOT 'in') 
     )
   }
-} {}
+} [execsql {SELECT zeroblob(1000)}]
 
 #----------------------------------------------------------------
 # Test some fuzzily generated expressions.