From: drh Date: Thu, 30 May 2019 13:47:10 +0000 (+0000) Subject: Optimization to the round() SQL function for large input values without a X-Git-Tag: version-3.29.0~57 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=84422db987f3e26545760984ace02515eed1542c;p=thirdparty%2Fsqlite.git Optimization to the round() SQL function for large input values without a fractional part. FossilOrigin-Name: e95138f5f4febde598f39e031d6e4f4d5ad0adbd8dcdd34fd0baaa78ab393417 --- diff --git a/manifest b/manifest index a2a87ce139..7955a86729 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 65499fed89..51d8ae8f05 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ea748edecb261f2b862d542daff6e99a6fd8879a8ace94b440d99e110577d1c1 \ No newline at end of file +e95138f5f4febde598f39e031d6e4f4d5ad0adbd8dcdd34fd0baaa78ab393417 \ No newline at end of file diff --git a/src/func.c b/src/func.c index 313a14018b..80c595a559 100644 --- a/src/func.c +++ b/src/func.c @@ -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+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 ){ diff --git a/src/util.c b/src/util.c index 31c88046e9..e67f22e771 100644 --- a/src/util.c +++ b/src/util.c @@ -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