]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix the decimal_cmp() extension function to give correct results in
authordrh <>
Sat, 20 Sep 2025 14:32:12 +0000 (14:32 +0000)
committerdrh <>
Sat, 20 Sep 2025 14:32:12 +0000 (14:32 +0000)
corner cases such as negative zero and two equivalent values where one
has extra trailing zeros to the right of the decimal point.
[forum:/forumpost/367c770224|Forum post 367c770224].

FossilOrigin-Name: 25b3626a018fa5916d0e129ee057c3f709c6e4d0b84a1a3102cad127a39a3db9

ext/misc/decimal.c
manifest
manifest.uuid
test/decimal.test

index 60488a0012e6e443f6f61292c60314cf8a28542c..d4e63cae4bd28a6384e1c6c7c78caa5d8e882584 100644 (file)
@@ -155,6 +155,10 @@ static Decimal *decimalNewFromText(const char *zIn, int n){
       p->nFrac += iExp;
     }
   }
+  if( p->sign ){
+    for(i=0; i<p->nDigit && p->a[i]==0; i++){}
+    if( i>=p->nDigit ) p->sign = 0;
+  }
   return p;
 
 new_from_text_failed:
@@ -357,13 +361,21 @@ static void decimal_result_sci(sqlite3_context *pCtx, Decimal *p){
 **    pB!=0
 **    pB->isNull==0
 */
-static int decimal_cmp(const Decimal *pA, const Decimal *pB){
+static int decimal_cmp(Decimal *pA, Decimal *pB){
   int nASig, nBSig, rc, n;
+  while( pA->nFrac>0 && pA->a[pA->nDigit-1]==0 ){
+    pA->nDigit--;
+    pA->nFrac--;
+  }
+  while( pB->nFrac>0 && pB->a[pB->nDigit-1]==0 ){
+    pB->nDigit--;
+    pB->nFrac--;
+  }
   if( pA->sign!=pB->sign ){
     return pA->sign ? -1 : +1;
   }
   if( pA->sign ){
-    const Decimal *pTemp = pA;
+    Decimal *pTemp = pA;
     pA = pB;
     pB = pTemp;
   }
index d91c8f2d02dc60ab1b81fd7ec654bca7c7d20ddf..9ef49ee207f65102e4511aba8a7fe5a6ee768da8 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\ssome\scomments\sdescribing\sthe\sways\sin\swhich\sbuilding\ssqlite3.wasm\swith\s-sMEMORY64=(non-zero)\sfails.
-D 2025-09-19T20:10:05.926
+C Fix\sthe\sdecimal_cmp()\sextension\sfunction\sto\sgive\scorrect\sresults\sin\ncorner\scases\ssuch\sas\snegative\szero\sand\stwo\sequivalent\svalues\swhere\sone\nhas\sextra\strailing\szeros\sto\sthe\sright\sof\sthe\sdecimal\spoint.\n[forum:/forumpost/367c770224|Forum\spost\s367c770224].
+D 2025-09-20T14:32:12.484
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -370,7 +370,7 @@ F ext/misc/completion.c c3c8b3cc1293c34f04f8746a3adfbfedb43f00d113f8c984a1ed0943
 F ext/misc/compress.c 2c79a74330e0e0ba6cb3f7397f8ba5af12d46377ef5d3ee075e12dd8a6ed57f0
 F ext/misc/csv.c 7cae8c2666a058a58fb8994ed2457339a06c97d31c251d9a8445cdd966629890
 F ext/misc/dbdump.c b8592f6f2da292c62991a13864a60d6c573c47a9cc58362131b9e6a64f823e01
-F ext/misc/decimal.c 228d47e9ef4de60daf5851da19e3ac9ac1eda9e94432816914469501db6a1129
+F ext/misc/decimal.c 0b837909e9a9aafc4e905c2fc7af0818d972b27e542a95a34c4581f084b18edd
 F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1
 F ext/misc/explain.c 606100185fb90d6a1eade1ed0414d53503c86820d8956a06e3b0a56291894f2b
 F ext/misc/fileio.c 88cb2e5744296de6638af02ef6349fd468c2eb5e5f41ba405f88d9b4ad500f8e
@@ -1045,7 +1045,7 @@ F test/dbpage.test 63fab1eb026bada121107e53436fa749bbf83281dc9dea17af422f7a5c0f2
 F test/dbpagefault.test ea39de2ca86041a9c6df1135645180a76d0a8da93ac159e2fafe38e39636530b
 F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed42759
 F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef
-F test/decimal.test ef731887b43ee32ef86e1c8fddb61a40789f988332c029c601dcf2c319277e9e
+F test/decimal.test 63202f949b135aadb994c38f4fad73aa4791b6104c76c24f2463fffac9c0035e
 F test/default.test c7124864cded213a3f118bc7e2e26f34b7c36dfa26cf6945cc8b7f5db1191277
 F test/delete.test 2686e1c98d552ef37d79ad55b17b93fe96fad9737786917ce3839767f734c48f
 F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa
@@ -2175,8 +2175,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P fe2e1681b6dac81508ab67d1247e1f92018c9998386789846d1715c2cc13d6a8
-R 931dc94e11b34b3371a9dd232a2c1e37
-U stephan
-Z c76236b811064191d689f221f7e8ce24
+P 0b14fd35ca37075bb65b2ab398f3324dc851347b1c042566eac23724013653f8
+R 39cc89ef66d5372714cdb7332df3f093
+U drh
+Z 90c3dcff7458cea56006e076b89ffebe
 # Remove this line to create a well-formed Fossil manifest.
index b469a4a7a1db00eb3fa3d798e766c99ed0f8a069..f79fc07bdabbb1b8e828b5e62152d020b23bd4ee 100644 (file)
@@ -1 +1 @@
-0b14fd35ca37075bb65b2ab398f3324dc851347b1c042566eac23724013653f8
+25b3626a018fa5916d0e129ee057c3f709c6e4d0b84a1a3102cad127a39a3db9
index cf4e06ad929e86667fab65415e0437d7522a19ce..19ed5d3277bf3835325e649c284797875cda289c 100644 (file)
@@ -22,6 +22,9 @@ if {[catch {load_static_extension db decimal} error]} {
 do_execsql_test 1000 {
   SELECT decimal(1);
 } {1}
+do_execsql_test 1001 {
+  SELECT decimal('+0'), decimal('-0');
+} {0 0}
 do_execsql_test 1010 {
   SELECT decimal('1.0');
 } {1.0}
@@ -34,6 +37,9 @@ do_execsql_test 1030 {
 do_execsql_test 1040 {
   SELECT decimal('-0001.0');
 } {-1.0}
+do_execsql_test 1041 {
+  SELECT decimal('-0000.0');
+} {0.0}
 do_execsql_test 1050 {
   SELECT decimal('1.0e72');
 } {1000000000000000000000000000000000000000000000000000000000000000000000000}
@@ -73,6 +79,16 @@ do_execsql_test 2000 {
    WHERE a.seq<b.seq
      AND decimal_cmp(a.val,b.val)>=0;
 } {}
+do_execsql_test 2001 {
+  WITH vx(a,b) AS (VALUES
+    ('-0','+0'),
+    ('-000.000','0'),
+    ('1.2','1.2000')
+  )
+  SELECT *, '|' FROM vx 
+   WHERE decimal_cmp(a,b)!=0
+      OR decimal_cmp(b,a)!=0;
+} {}
 do_execsql_test 2010 {
   SELECT *, '|'
     FROM t1 AS a, t1 AS b