]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Omit some redundant calls to strlen() used to find the size of
authordrh <>
Fri, 20 Oct 2023 18:09:08 +0000 (18:09 +0000)
committerdrh <>
Fri, 20 Oct 2023 18:09:08 +0000 (18:09 +0000)
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

manifest
manifest.uuid
src/expr.c

index a8d211717d8aca7446f1046ff05d412adc9d9797..04be4c08388b7a22ce975a5e6e198a2fc05e9c21 100644 (file)
--- 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.
index e5f3980a50b0cce95c31261106eebe1a79b51975..9e114bfc586de59f802b13eeed4116db5068d6ba 100644 (file)
@@ -1 +1 @@
-f5c01676fd281e938181b846dd2024d050f597dc6a7a91928beab9d8553dfdb5
\ No newline at end of file
+b7a84eff5dcdf5b2ff81331097cdc64d0c5d16a4ae224320f39b64541ec72dc7
\ No newline at end of file
index c47f7964ae3c090a4fb3fd4fe5cbbfb59a8aa310..73ff553730932601585ef7f56a80701dc06f0b52 100644 (file)
@@ -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;