From: drh Date: Fri, 30 Sep 2016 17:46:44 +0000 (+0000) Subject: Avoid unnecessary Mem initializations when generating a new sqlite3_stmt X-Git-Tag: version-3.15.0~41 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2a1df937ab0085f7ed038511e2f74a44d1df2e65;p=thirdparty%2Fsqlite.git Avoid unnecessary Mem initializations when generating a new sqlite3_stmt object. FossilOrigin-Name: 47ae1cda8dc255d100aeb8cb90ea4c9e449509be --- diff --git a/manifest b/manifest index f7124aa631..6a0491fe98 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\ssize\sand\sperformance\soptimization\sto\ssqlite3VdbeChangeP5(). -D 2016-09-29T20:28:34.145 +C Avoid\sunnecessary\sMem\sinitializations\swhen\sgenerating\sa\snew\ssqlite3_stmt\nobject. +D 2016-09-30T17:46:44.827 F Makefile.in 6fd48ffcf7c2deea7499062d1f3747f986c19678 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 5151cc64c4c05f3455f4f692ad11410a810d937f @@ -453,13 +453,13 @@ F src/update.c 8179e699dbd45b92934fd02d3d8e3732e8da8802 F src/utf.c 699001c79f28e48e9bcdf8a463da029ea660540c F src/util.c 3e2da6101888d073e79ecc6af5e0a2f70fa1e498 F src/vacuum.c 913970b9d86dd6c2b8063ef1af421880f1464ec3 -F src/vdbe.c 6781329737f4bb140834cd32b15e93b83d60858e +F src/vdbe.c 51e754eec26d892abc6279f5e949545af68ec1b3 F src/vdbe.h c044be7050ac6bf596eecc6ab159f5dbc020a3b7 F src/vdbeInt.h 581b737c2f6e413c555469480efe31796a71bcad F src/vdbeapi.c 794f80669e9e3b9b3edc78d80c15968985c7bf21 -F src/vdbeaux.c 041dd9dd28dfe57dc0104a98c067cadd808a059c +F src/vdbeaux.c 240fecf157b6a3deb3c68abe614ae30cb8e884cd F src/vdbeblob.c 3e82a797b60c3b9fed7b8de8c539ca7607874937 -F src/vdbemem.c 1b8d5b770a9a3c6d8ed3463104a382bffa6f15c2 +F src/vdbemem.c 1c330522e6b6e4ddd2ff63c4c0dfafa20c3965a7 F src/vdbesort.c 91fda3909326860382b0ca8aa251e609c6a9d62c F src/vdbetrace.c 41963d5376f0349842b5fc4aaaaacd7d9cdc0834 F src/vtab.c e02cacb5c7ae742631edeb9ae9f53d399f093fd8 @@ -1525,7 +1525,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 984a96d79656c1b095aba1f88aca4bb787ba0bd8 -R 6df17638e558d58efae8855e65d389dc +P 3c93c8f5bbf54ed2a331079b28fdd94eb0e59e69 +R 3cf19b11ac694d678c7ce4092749d94e U drh -Z 789252daa215e2c9b52dcdaab286dc1e +Z 262005117be631ec889db38469ab8967 diff --git a/manifest.uuid b/manifest.uuid index e64d038a8f..bfa720094c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3c93c8f5bbf54ed2a331079b28fdd94eb0e59e69 \ No newline at end of file +47ae1cda8dc255d100aeb8cb90ea4c9e449509be \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index c32e0ea43e..25b507f37f 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1136,11 +1136,13 @@ case OP_Null: { /* out2 */ cnt = pOp->p3-pOp->p2; assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); pOut->flags = nullFlag = pOp->p1 ? (MEM_Null|MEM_Cleared) : MEM_Null; + pOut->n = 0; while( cnt>0 ){ pOut++; memAboutToChange(p, pOut); sqlite3VdbeMemSetNull(pOut); pOut->flags = nullFlag; + pOut->n = 0; cnt--; } break; diff --git a/src/vdbeaux.c b/src/vdbeaux.c index de7b5d14b1..2e3a4eaaf1 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1458,6 +1458,21 @@ void sqlite3VdbePrintOp(FILE *pOut, int pc, Op *pOp){ } #endif +/* +** Initialize an array of N Mem element. +*/ +static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){ + while( (N--)>0 ){ + p->db = db; + p->flags = flags; + p->szMalloc = 0; +#ifdef SQLITE_DEBUG + p->pScopyFrom = 0; +#endif + p++; + } +} + /* ** Release an array of N Mem elements */ @@ -1669,6 +1684,7 @@ int sqlite3VdbeList( pMem->flags = MEM_Str|MEM_Term; zP4 = displayP4(pOp, pMem->z, pMem->szMalloc); if( zP4!=pMem->z ){ + pMem->n = 0; sqlite3VdbeMemSetStr(pMem, zP4, -1, SQLITE_UTF8, 0); }else{ assert( pMem->z!=0 ); @@ -1900,10 +1916,7 @@ void sqlite3VdbeMakeReady( assert( EIGHT_BYTE_ALIGNMENT(x.pSpace) ); x.nFree = ROUNDDOWN8(pParse->szOpAlloc - n); /* Bytes of unused memory */ assert( x.nFree>=0 ); - if( x.nFree>0 ){ - memset(x.pSpace, 0, x.nFree); - assert( EIGHT_BYTE_ALIGNMENT(&x.pSpace[x.nFree]) ); - } + assert( EIGHT_BYTE_ALIGNMENT(&x.pSpace[x.nFree]) ); resolveP2Values(p, &nArg); p->usesStmtJournal = (u8)(pParse->isMultiWrite && pParse->mayAbort); @@ -1932,30 +1945,27 @@ void sqlite3VdbeMakeReady( p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); #endif if( x.nNeeded==0 ) break; - x.pSpace = p->pFree = sqlite3DbMallocZero(db, x.nNeeded); + x.pSpace = p->pFree = sqlite3DbMallocRawNN(db, x.nNeeded); x.nFree = x.nNeeded; }while( !db->mallocFailed ); - p->nCursor = nCursor; - if( p->aVar ){ - p->nVar = (ynVar)nVar; - for(n=0; naVar[n].flags = MEM_Null; - p->aVar[n].db = db; - } - } p->nzVar = pParse->nzVar; p->azVar = pParse->azVar; pParse->nzVar = 0; pParse->azVar = 0; - if( p->aMem ){ + p->explain = pParse->explain; + if( db->mallocFailed==0 ){ + p->nCursor = nCursor; + p->nVar = (ynVar)nVar; + initMemArray(p->aVar, nVar, db, MEM_Null); p->nMem = nMem; - for(n=0; naMem[n].flags = MEM_Undefined; - p->aMem[n].db = db; - } + initMemArray(p->aMem, nMem, db, MEM_Undefined); + memset(p->apArg, 0, nArg*sizeof(Mem*)); + memset(p->apCsr, 0, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + memset(p->anExec, 0, p->nOp*sizeof(i64)); +#endif } - p->explain = pParse->explain; sqlite3VdbeRewind(p); } @@ -2107,13 +2117,9 @@ void sqlite3VdbeSetNumCols(Vdbe *p, int nResColumn){ sqlite3DbFree(db, p->aColName); n = nResColumn*COLNAME_N; p->nResColumn = (u16)nResColumn; - p->aColName = pColName = (Mem*)sqlite3DbMallocZero(db, sizeof(Mem)*n ); + p->aColName = pColName = (Mem*)sqlite3DbMallocRawNN(db, sizeof(Mem)*n ); if( p->aColName==0 ) return; - while( n-- > 0 ){ - pColName->flags = MEM_Null; - pColName->db = p->db; - pColName++; - } + initMemArray(p->aColName, n, p->db, MEM_Null); } /* diff --git a/src/vdbemem.c b/src/vdbemem.c index fb4f704f5d..d009f804df 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -293,6 +293,7 @@ int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){ if( sqlite3VdbeMemClearAndResize(pMem, nByte) ){ + pMem->enc = 0; return SQLITE_NOMEM_BKPT; }