From d908f5ab7fa00a1a34d8a7e46e849d041eb7c1d3 Mon Sep 17 00:00:00 2001 From: danielk1977 Date: Fri, 11 May 2007 07:08:28 +0000 Subject: [PATCH] Fix a problem with inserting zeroblob() into an indexed column. (CVS 3982) FossilOrigin-Name: ccef5d2daaa5a88dd3f23666f022296ef42f9d73 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbe.c | 21 +++++++++++++-------- test/fuzz.test | 10 ++++------ 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index a543922d8d..ab2aa5b3cd 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 9036fb4804..a904b22361 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d12a8924c6083cdff14990b4fd036ca386c2e34a \ No newline at end of file +ccef5d2daaa5a88dd3f23666f022296ef42f9d73 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 243f8974e1..ef474365a8 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -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; ip1; 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--; diff --git a/test/fuzz.test b/test/fuzz.test index c92d037913..4cc9620971 100644 --- a/test/fuzz.test +++ b/test/fuzz.test @@ -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. -- 2.47.3