]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Restructure some internal subroutine signatures for improved
authordrh <>
Thu, 19 Mar 2026 17:08:08 +0000 (17:08 +0000)
committerdrh <>
Thu, 19 Mar 2026 17:08:08 +0000 (17:08 +0000)
performance of affinity type conversions.

FossilOrigin-Name: 2bc6ce87b39c6ae324c3641c5af60e000df7d7c6d5fd2dd1a318c94cbb4aef84

manifest
manifest.uuid
src/vdbe.c
src/vdbeInt.h
src/vdbemem.c

index 31d28c58e798a96b8a91ab197f6c0c63a3379d53..ff7b5101a3ad74bb2840edcbffa10670ae2c9e20 100644 (file)
--- 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.
index 785032cb260ccf3739907c98c549e537c0102330..e862e1a8c582fd09ef600ecc5575368c50966dba 100644 (file)
@@ -1 +1 @@
-3c64f31392328f51e205fde52f19cf70c193e90897ccb7e93c685bad4f342cac
+2bc6ce87b39c6ae324c3641c5af60e000df7d7c6d5fd2dd1a318c94cbb4aef84
index bd0f818fefa375efc470b10df94d4d407fd22ca7..0fcd26992b9b1241cf1ab25035f9fad46a4e67aa 100644 (file)
@@ -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;
index ac31d5afa88a78ce2dcd784c6218ebf2841c7012..24c422f79264e70e30a5a5ebd2f0d28e8d860030 100644 (file)
@@ -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*);
index 5689cb7551be0a324d4fab66d33a8ceb105ae957..5fe1e03963bd226025831826065d03b90b87e227 100644 (file)
@@ -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( i<n ) rc = -100;
       sqlite3DbFree(pMem->db, 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)))
     ){