]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Signification optimizations to layout of text for floating point
authordrh <>
Wed, 25 Mar 2026 17:59:22 +0000 (17:59 +0000)
committerdrh <>
Wed, 25 Mar 2026 17:59:22 +0000 (17:59 +0000)
conversions in sqlite3_str_vappendf().

FossilOrigin-Name: 6a74df6d6ecfda8e0ff72ca0f4167190e989973ad124412892f7d36f1666ccfc

manifest
manifest.uuid
src/printf.c

index 4f71a6b3508a33dc2801be4c76cb7bae53a30ecf..0e309c1d47de2b90bef4d21f82ae1f539b64995d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Handle\sthe\scase\swhere\sthe\scompile-time\sdefault\spage-size\sis\sgreater\sthan\s8192\sbytes.
-D 2026-03-25T11:19:38.088
+C Signification\soptimizations\sto\slayout\sof\stext\sfor\sfloating\spoint\nconversions\sin\ssqlite3_str_vappendf().
+D 2026-03-25T17:59:22.677
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -729,7 +729,7 @@ F src/pcache.h 092b758d2c5e4dabb30eae46d8dfad77c0f70b16bf3ff1943f7a232b0fe0d4ba
 F src/pcache1.c 131ca0daf4e66b4608d2945ae76d6ed90de3f60539afbd5ef9ec65667a5f2fcd
 F src/pragma.c 789ef67117b74b5be0a2db6681f7f0c55e6913791b9da309aefd280de2c8a74d
 F src/prepare.c f6a6e28a281bd1d1da12f47d370a81af46159b40f73bf7fa0b276b664f9c8b7d
-F src/printf.c 9cff219dba73b1aa9a8113e83e962f03f7bea8b6eb51cefb25bc468d5a69fb2d
+F src/printf.c 11e1ed458da5dc0b276913c7994ef21b1fab30369b0f968af806d1145cd9dc5f
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c f0834917f2b1719d545a0d7eaad693283788f68ecd99871a81c7ff3b12b26209
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
@@ -2195,8 +2195,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 82a0794814bbc095235f8158a4129a5d83f6af1b0c27cb56449ea32feb44faf5
-R ccb1cabe9c5727fead3d6194bdb038c8
-U dan
-Z 9568f2e92e105cd07d1e0d9287adaf4e
+P 3aea251f238277c68d7a80a4fa643bb0f80b274cef77ef32c4eb833cfaf46740
+R c228eec8690691b2b76c67015dec8b56
+U drh
+Z 55019f6bf99dff3aea5283f658746475
 # Remove this line to create a well-formed Fossil manifest.
index 616d3bbd0d8dc85afc44d1e4e1ad8d7a34958ed9..8781a17aa9b4d437164cf22a5258b026bf0976d9 100644 (file)
@@ -1 +1 @@
-3aea251f238277c68d7a80a4fa643bb0f80b274cef77ef32c4eb833cfaf46740
+6a74df6d6ecfda8e0ff72ca0f4167190e989973ad124412892f7d36f1666ccfc
index d9f3c229dd330a612c5ceaa1877991846194c86b..759f1e292ef244d54799035aebacc1d39a312137 100644 (file)
@@ -635,12 +635,24 @@ void sqlite3_str_vappendf(
         }
         /* Digits prior to the decimal point */
         j = 0;
+        assert( s.n>0 );
         if( e2<0 ){
           *(bufpt++) = '0';
-        }else{
+        }else if( cThousand ){
           for(; e2>=0; e2--){
             *(bufpt++) = j<s.n ? s.z[j++] : '0';
-            if( cThousand && (e2%3)==0 && e2>1 ) *(bufpt++) = ',';
+            if( (e2%3)==0 && e2>1 ) *(bufpt++) = ',';
+          }
+        }else{
+          j = e2+1;
+          if( j>s.n ) j = s.n;
+          memcpy(bufpt, s.z, j);
+          bufpt += j;
+          e2 -= j;
+          if( e2>=0 ){
+            memset(bufpt, '0', e2+1);
+            bufpt += e2+1;
+            e2 = -1;
           }
         }
         /* The decimal point */
@@ -649,12 +661,28 @@ void sqlite3_str_vappendf(
         }
         /* "0" digits after the decimal point but before the first
         ** significant digit of the number */
-        for(e2++; e2<0 && precision>0; precision--, e2++){
-          *(bufpt++) = '0';
+        if( e2<(-1) && precision>0 ){
+          int nn = -1-e2;
+          if( nn>precision ) nn = precision;
+          memset(bufpt, '0', nn);
+          bufpt += nn;
+          precision -= nn;
         }
         /* Significant digits after the decimal point */
-        while( (precision--)>0 ){
-          *(bufpt++) = j<s.n ? s.z[j++] : '0';
+        if( precision>0 ){
+          int nn = s.n - j;
+          if( NEVER(nn>precision) ) nn = precision;
+          if( nn>0 ){
+            memcpy(bufpt, s.z+j, nn);
+            bufpt += nn;
+            j += nn;
+            precision -= nn;
+          }
+          if( precision>0 && !flag_rtz ){
+            memset(bufpt, '0', precision);
+            bufpt += precision;
+            precision = 0;
+          }
         }
         /* Remove trailing zeros and the "." if no digits follow the "." */
         if( flag_rtz && flag_dp ){