From: drh <> Date: Fri, 20 Oct 2023 18:09:08 +0000 (+0000) Subject: Omit some redundant calls to strlen() used to find the size of X-Git-Tag: version-3.44.0~74 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e98f62fb3f23bc3e92796fe175c383177f0ef4ac;p=thirdparty%2Fsqlite.git Omit some redundant calls to strlen() used to find the size of Expr.u.zToken in sqliteExprDup(). This inefficiency was seen while working on the previous check-in, and I thought it best to fix it while it was fresh in mind. FossilOrigin-Name: b7a84eff5dcdf5b2ff81331097cdc64d0c5d16a4ae224320f39b64541ec72dc7 --- diff --git a/manifest b/manifest index a8d211717d..04be4c0838 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\ssqlite3ExprDup()\slogic\sfor\sfaster\sperformance\sand\sbetter\nrun-time\serror\sdetection.\s\sThis\scheck-in\sfixes\sthe\s5x\soversize\smemory\sallocation\nbug\sfrom\s[f371e4c0f8ea73ae]\sas\swell\sas\sall\sother\sknown\sissues\sthat\sresult\sfrom\nhanding\sthe\sORDER\sBY\sclause\sof\san\saggregate\sfunction\soff\sof\sthe\spLeft\spointer\nof\sthe\sExpr\sobject. -D 2023-10-20T17:15:15.399 +C Omit\ssome\sredundant\scalls\sto\sstrlen()\sused\sto\sfind\sthe\ssize\sof\nExpr.u.zToken\sin\ssqliteExprDup().\s\sThis\sinefficiency\swas\sseen\swhile\sworking\non\sthe\sprevious\scheck-in,\sand\sI\sthought\sit\sbest\sto\sfix\sit\swhile\sit\swas\nfresh\sin\smind. +D 2023-10-20T18:09:08.595 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -669,7 +669,7 @@ F src/date.c eebc54a00e888d3c56147779e9f361b77d62fd69ff2008c5373946aa1ba1d574 F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782 F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43 F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500 -F src/expr.c 2cf43de9cb6eaed600d689ca0276a8dbb5a56c0fea7e94b2120d9de95d8df309 +F src/expr.c ddb8e310561c761b29f993490eaa64b8a3496032140db74b5ebaeca4a7c96cb3 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 360a9b644efc9e05746e0b5b6ccb4760fd039d287ebdf090723b9c97f6d163d9 F src/func.c e8d7b3587a225f4f1116f720b72090511fe9feb936e960bd26a053cea6a17a63 @@ -2134,8 +2134,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fc9f82ea084159eaf3dd1757b96d17d1201b00c4e06455a7dcd8067172b25f28 -R 24ff7529cedac4d1c2b0acdaefc5dd9f +P f5c01676fd281e938181b846dd2024d050f597dc6a7a91928beab9d8553dfdb5 +R d3b5a604b96f76db93b01c4a13c3d7ea U drh -Z 6942ed424b94726ba0e7696f899b042d +Z 496ee78f77a1d59f8f48d2e1597d6cd9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e5f3980a50..9e114bfc58 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f5c01676fd281e938181b846dd2024d050f597dc6a7a91928beab9d8553dfdb5 \ No newline at end of file +b7a84eff5dcdf5b2ff81331097cdc64d0c5d16a4ae224320f39b64541ec72dc7 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index c47f7964ae..73ff553730 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1578,6 +1578,7 @@ static Expr *exprDup( Expr *pNew; /* Value to return */ EdupBuf sEdupBuf; /* Memory space from which to build Expr object */ u32 staticFlag; /* EP_Static if space not obtained from malloc */ + int nToken = -1; /* Space needed for p->u.zToken. -1 means unknown */ assert( db!=0 ); assert( p ); @@ -1594,7 +1595,16 @@ static Expr *exprDup( assert( sEdupBuf.zAlloc!=0 ); assert( dupFlags==EXPRDUP_REDUCE ); }else{ - int nAlloc = dupFlags ? dupedExprSize(p) : dupedExprNodeSize(p, 0); + int nAlloc; + if( dupFlags ){ + nAlloc = dupedExprSize(p); + }else if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ + nToken = sqlite3Strlen30NN(p->u.zToken)+1; + nAlloc = EXPR_FULLSIZE + nToken; + }else{ + nToken = 0; + nAlloc = EXPR_FULLSIZE; + } sEdupBuf.zAlloc = sqlite3DbMallocRawNN(db, nAlloc); #ifdef SQLITE_DEBUG sEdupBuf.zEnd = sEdupBuf.zAlloc ? sEdupBuf.zAlloc+nAlloc : 0; @@ -1612,11 +1622,12 @@ static Expr *exprDup( */ const unsigned nStructSize = dupedExprStructSize(p, dupFlags); const int nNewSize = nStructSize & 0xfff; - int nToken; - if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ - nToken = sqlite3Strlen30(p->u.zToken) + 1; - }else{ - nToken = 0; + if( nToken<0 ){ + if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ + nToken = sqlite3Strlen30(p->u.zToken) + 1; + }else{ + nToken = 0; + } } if( dupFlags ){ assert( (int)(sEdupBuf.zEnd - sEdupBuf.zAlloc) >= nNewSize+nToken ); @@ -1643,7 +1654,8 @@ static Expr *exprDup( } /* Copy the p->u.zToken string, if any. */ - if( nToken ){ + assert( nToken>=0 ); + if( nToken>0 ){ char *zToken = pNew->u.zToken = (char*)sEdupBuf.zAlloc; memcpy(zToken, p->u.zToken, nToken); sEdupBuf.zAlloc += nToken;