From: drh <> Date: Thu, 19 Mar 2026 17:08:08 +0000 (+0000) Subject: Restructure some internal subroutine signatures for improved X-Git-Tag: major-release~70 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=28cfb1e4a76d9824c9c8ccf9f9ae8b9d2a055828;p=thirdparty%2Fsqlite.git Restructure some internal subroutine signatures for improved performance of affinity type conversions. FossilOrigin-Name: 2bc6ce87b39c6ae324c3641c5af60e000df7d7c6d5fd2dd1a318c94cbb4aef84 --- diff --git a/manifest b/manifest index 31d28c58e7..ff7b5101a3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\scompiler\sintrinsics\sto\simprove\sthe\sperformance\sof\nsqlite3Multiply160(). -D 2026-03-19T13:40:40.360 +C Restructure\ssome\sinternal\ssubroutine\ssignatures\sfor\simproved\nperformance\sof\saffinity\stype\sconversions. +D 2026-03-19T17:08:08.454 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -799,13 +799,13 @@ F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165 F src/util.c 51662502243422f3238a7220fe00de32d9a7d0d3149dd33c6d721d7039cb2e74 F src/vacuum.c d3d35d8ae893d419ade5fa196d761a83bddcbb62137a1a157ae751ef38b26e82 -F src/vdbe.c 01e380d1847dd934f9c6c73b2bb9df68915b3f917e63244f6f02c95641ca3acb +F src/vdbe.c dbafc6f5762f9ae90d9dc9ed065a31743a8ceafbdbfb1a0a3a228921fb3cc36a F src/vdbe.h 70e862ac8a11b590f8c1eaac17a0078429d42bc4ea3f757a9af0f451dd966a71 -F src/vdbeInt.h f7157f110f88f1d9d8338c292faf23a9129f6712563ade2b408537c95e17bdef +F src/vdbeInt.h c31ba4dc8d280c2b1dc89c6fcee68f2555e3813ab34279552c20b964c0e338b1 F src/vdbeapi.c 6cdcbe5c7afa754c998e73d2d5d2805556268362914b952811bdfb9c78a37cf1 F src/vdbeaux.c 81687c55682b9f4d942186695f4f7fa4743c564a985e0889def52eded9076d61 F src/vdbeblob.c b3f0640db9642fbdc88bd6ebcc83d6009514cafc98f062f675f2c8d505d82692 -F src/vdbemem.c 317ec5e870ddb16951b606c9fe8be22baef22ecbe46f58fdefc259662238afb7 +F src/vdbemem.c 05610ea8423c4c852a9039e47fb6a2706d4d848758602ebf30da6c3212344695 F src/vdbesort.c b69220f4ea9ffea5fdef34d968c60305444eea909252a81933b54c296d9cca70 F src/vdbetrace.c 49e689f751505839742f4a243a1a566e57d5c9eaf0d33bbaa26e2de3febf7b41 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3 @@ -2194,8 +2194,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P cadb6cdd32c3c9abd7e063f25acd39dddc9ff764a16019ffd5aa11063175326f -R 4f3af9012bcfc827e4349045b7fa7e69 +P 3c64f31392328f51e205fde52f19cf70c193e90897ccb7e93c685bad4f342cac +R 72f078867d2671a9f24c867ea87f8152 U drh -Z 0005327f465235b9cff79f72edc88c99 +Z b5c58da09518d5fa628ac92460368943 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 785032cb26..e862e1a8c5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3c64f31392328f51e205fde52f19cf70c193e90897ccb7e93c685bad4f342cac +2bc6ce87b39c6ae324c3641c5af60e000df7d7c6d5fd2dd1a318c94cbb4aef84 diff --git a/src/vdbe.c b/src/vdbe.c index bd0f818fef..0fcd26992b 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -355,7 +355,7 @@ static void applyNumericAffinity(Mem *pRec, int bTryForInt){ double rValue; int rc; assert( (pRec->flags & (MEM_Str|MEM_Int|MEM_Real|MEM_IntReal))==MEM_Str ); - rValue = sqlite3MemRealValueRC(pRec, &rc); + rc = sqlite3MemRealValueRC(pRec, &rValue); if( rc<=0 ) return; if( rc==1 && alsoAnInt(pRec, rValue, &pRec->u.i) ){ pRec->flags |= MEM_Int; @@ -473,7 +473,7 @@ static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ pMem->u.i = 0; return MEM_Int; } - pMem->u.r = sqlite3MemRealValueRC(pMem, &rc); + rc = sqlite3MemRealValueRC(pMem, &pMem->u.r); if( rc<=0 ){ if( rc==0 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1 ){ pMem->u.i = ix; diff --git a/src/vdbeInt.h b/src/vdbeInt.h index ac31d5afa8..24c422f792 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -656,7 +656,7 @@ int sqlite3IntFloatCompare(i64,double); i64 sqlite3VdbeIntValue(const Mem*); int sqlite3VdbeMemIntegerify(Mem*); double sqlite3VdbeRealValue(Mem*); -SQLITE_NOINLINE double sqlite3MemRealValueRC(Mem*, int*); +int sqlite3MemRealValueRC(Mem*, double*); int sqlite3VdbeBooleanValue(Mem*, int ifNull); void sqlite3VdbeIntegerAffinity(Mem*); int sqlite3VdbeMemRealify(Mem*); diff --git a/src/vdbemem.c b/src/vdbemem.c index 5689cb7551..5fe1e03963 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -657,32 +657,24 @@ i64 sqlite3VdbeIntValue(const Mem *pMem){ } /* -** Invoke sqlite3AtoF() on the text value of pMem and return the -** double result. If sqlite3AtoF() returns an error code, write -** that code into *pRC if (*pRC)!=NULL. -** -** The caller must ensure that pMem->db!=0 and that pMem is in -** mode MEM_Str or MEM_Blob. +** This routine implements the uncommon and slower path for +** sqlite3MemValueRC(). It is broken out into a separate +** no-inline routine so that the main routine can avoid unnecessary +** stack pushes. */ -SQLITE_NOINLINE double sqlite3MemRealValueRC(Mem *pMem, int *pRC){ - double val = (double)0; - int rc = 0; - assert( pMem->db!=0 ); - assert( pMem->flags & (MEM_Str|MEM_Blob) ); - if( pMem->z==0 ){ - /* no-op */ - }else if( pMem->enc==SQLITE_UTF8 - && ((pMem->flags & MEM_Term)!=0 || sqlite3VdbeMemZeroTerminateIfAble(pMem)) - ){ - rc = sqlite3AtoF(pMem->z, &val); - }else if( pMem->n==0 ){ - /* no-op */ - }else if( pMem->enc==SQLITE_UTF8 ){ +static SQLITE_NOINLINE int sqlite3MemRealValueRCSlowPath( + Mem *pMem, + double *pValue +){ + int rc = SQLITE_OK; + *pValue = 0.0; + if( pMem->enc==SQLITE_UTF8 ){ char *zCopy = sqlite3DbStrNDup(pMem->db, pMem->z, pMem->n); if( zCopy ){ - rc = sqlite3AtoF(zCopy, &val); + rc = sqlite3AtoF(zCopy, pValue); sqlite3DbFree(pMem->db, zCopy); } + return rc; }else{ int n, i, j; char *zCopy; @@ -705,13 +697,49 @@ SQLITE_NOINLINE double sqlite3MemRealValueRC(Mem *pMem, int *pRC){ } assert( j<=n/2 ); zCopy[j] = 0; - rc = sqlite3AtoF(zCopy, &val); + rc = sqlite3AtoF(zCopy, pValue); if( idb, zCopy); } + return rc; } - if( pRC ) *pRC = rc; - return val; +} + +/* +** Invoke sqlite3AtoF() on the text value of pMem and return the +** double result. If sqlite3AtoF() returns an error code, write +** that code into *pRC if (*pRC)!=NULL. +** +** The caller must ensure that pMem->db!=0 and that pMem is in +** mode MEM_Str or MEM_Blob. +*/ +int sqlite3MemRealValueRC(Mem *pMem, double *pValue){ + assert( pMem->db!=0 ); + assert( pMem->flags & (MEM_Str|MEM_Blob) ); + if( pMem->z==0 ){ + *pValue = 0.0; + return 0; + }else if( pMem->enc==SQLITE_UTF8 + && ((pMem->flags & MEM_Term)!=0 || sqlite3VdbeMemZeroTerminateIfAble(pMem)) + ){ + return sqlite3AtoF(pMem->z, pValue); + }else if( pMem->n==0 ){ + *pValue = 0.0; + return 0; + }else{ + return sqlite3MemRealValueRCSlowPath(pMem, pValue); + } +} + +/* +** This routine acts as a bridge from sqlite3VdbeRealValue() to +** sqlite3VdbeRealValueRC, allowing sqlite3VdbeRealValue() to avoid +** stuffing values onto the stack. +*/ +static SQLITE_NOINLINE double sqlite3MemRealValueNoRC(Mem *pMem){ + double r; + (void)sqlite3MemRealValueRC(pMem, &r); + return r; } /* @@ -730,7 +758,7 @@ double sqlite3VdbeRealValue(Mem *pMem){ testcase( pMem->flags & MEM_IntReal ); return (double)pMem->u.i; }else if( pMem->flags & (MEM_Str|MEM_Blob) ){ - return sqlite3MemRealValueRC(pMem, 0); + return sqlite3MemRealValueNoRC(pMem); }else{ /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ return (double)0; @@ -854,7 +882,7 @@ int sqlite3VdbeMemNumerify(Mem *pMem){ sqlite3_int64 ix; assert( (pMem->flags & (MEM_Blob|MEM_Str))!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); - pMem->u.r = sqlite3MemRealValueRC(pMem, &rc); + rc = sqlite3MemRealValueRC(pMem, &pMem->u.r); if( ((rc==0 || rc==1) && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1) || sqlite3RealSameAsInt(pMem->u.r, (ix = sqlite3RealToI64(pMem->u.r))) ){