-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
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
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.
-f5c01676fd281e938181b846dd2024d050f597dc6a7a91928beab9d8553dfdb5
\ No newline at end of file
+b7a84eff5dcdf5b2ff81331097cdc64d0c5d16a4ae224320f39b64541ec72dc7
\ No newline at end of file
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 );
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;
*/
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 );
}
/* 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;