]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Optimization to the round() SQL function for large input values without a
authordrh <drh@noemail.net>
Thu, 30 May 2019 13:47:10 +0000 (13:47 +0000)
committerdrh <drh@noemail.net>
Thu, 30 May 2019 13:47:10 +0000 (13:47 +0000)
fractional part.

FossilOrigin-Name: e95138f5f4febde598f39e031d6e4f4d5ad0adbd8dcdd34fd0baaa78ab393417

manifest
manifest.uuid
src/func.c
src/util.c

index a2a87ce13990af7a0dde818d26b1438ed6f5cd81..7955a867298dd8addb583dc80d38cfbf1776c6ca 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Smaller\sand\sfaster\ssqlite3IsNaN()\simplementation\smakes\sdeserialization\sof\nfloating\spoint\svalues\smuch\sfaster.
-D 2019-05-30T00:46:37.512
+C Optimization\sto\sthe\sround()\sSQL\sfunction\sfor\slarge\sinput\svalues\swithout\sa\nfractional\spart.
+D 2019-05-30T13:47:10.747
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -477,7 +477,7 @@ F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf
 F src/expr.c 6b18f022871816c80b772abc3657276562630004b48f588085b404f104fd4430
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33
-F src/func.c 08d6d07d138735dd79f12a2b0c623d1dc9270d0eea61b8be584625391ef84475
+F src/func.c ad7a7752872eb0bf148e0e56fc6a5e70de95bc6f589497fbe2fa81e2a514e807
 F src/global.c 0dea3065ea72a65ae941559b6686aad6516d4913e76fa4f79a95ff7787f624ec
 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19
 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38
@@ -592,7 +592,7 @@ F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73
 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2
 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4
 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507
-F src/util.c 8d95c976b33953a039d4ebd543c7acc2c9fd03d1cecb3d41ba7fcc0f24fcbe2d
+F src/util.c bdbb67d3709a0a4b4ba30221e05e0fec184030982a8c94a175ce634ccf547501
 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf
 F src/vdbe.c e6fb674eda4aa32c50d53eb09210c9ed802866cb4d1dc0d6187301b55e4a82b7
 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237
@@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P c1d8a3f65490eef2216f360d708b1746cbaa6dadce42c0950dc8e09b9ab28ee2
-R f03dbc9beefc5d34628277d962365044
+P ea748edecb261f2b862d542daff6e99a6fd8879a8ace94b440d99e110577d1c1
+R 7754d0bcda862a16960da7e5623f3f4e
 U drh
-Z 78c9dcb795a751d434058963c2b0384b
+Z 17021e3360c89f47e46d1424ad5de5c6
index 65499fed893becadc5d97270b995e30a5a5c4137..51d8ae8f0579519a44768b055aa82c1c568add33 100644 (file)
@@ -1 +1 @@
-ea748edecb261f2b862d542daff6e99a6fd8879a8ace94b440d99e110577d1c1
\ No newline at end of file
+e95138f5f4febde598f39e031d6e4f4d5ad0adbd8dcdd34fd0baaa78ab393417
\ No newline at end of file
index 313a14018b2103619836b9dac89c0f8a12efb869..80c595a55922f234b6674a48473a66a45594443f 100644 (file)
@@ -387,10 +387,10 @@ static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
   ** handle the rounding directly,
   ** otherwise use printf.
   */
-  if( n==0 && r>=0 && r<LARGEST_INT64-1 ){
-    r = (double)((sqlite_int64)(r+0.5));
-  }else if( n==0 && r<0 && (-r)<LARGEST_INT64-1 ){
-    r = -(double)((sqlite_int64)((-r)+0.5));
+  if( r<-4503599627370496.0 || r>+4503599627370496.0 ){
+    /* The value has no fractional part so there is nothing to round */
+  }else if( n==0 ){  
+    r = (double)((sqlite_int64)(r+(r<0?-0.5:+0.5)));
   }else{
     zBuf = sqlite3_mprintf("%.*f",n,r);
     if( zBuf==0 ){
index 31c88046e9f8557fc45833aab3fd90218084039e..e67f22e7713d1df9da24522573f5db0eef5c65de 100644 (file)
@@ -404,6 +404,8 @@ int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){
     int i;
     incr = 2;
     assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 );
+    testcase( enc==SQLITE_UTF16LE );
+    testcase( enc==SQLITE_UTF16BE );
     for(i=3-enc; i<length && z[i]==0; i+=2){}
     if( i<length ) eType = -100;
     zEnd = &z[i^1];