]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix date/time computations to deal with the sub-millisecond rounding
authordrh <>
Tue, 21 Jan 2025 17:37:58 +0000 (17:37 +0000)
committerdrh <>
Tue, 21 Jan 2025 17:37:58 +0000 (17:37 +0000)
problem identified in [forum:/forumpost/766a2c9231|forum post 766a2c9231].

FossilOrigin-Name: afb0a5923a6db4045fab5226198aab970d746d4866294ebba943c6986e97ecde

manifest
manifest.uuid
src/date.c
test/date.test

index b9e1cd0b1e5143351940b0ea52ff864d7f54090e..2ab7b29c5908b3493905fcfdf76334a9c209786e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Performance\simprovements\sto\sthe\s(debug-use\sonly)\sMem.pScopyFrom\slogic,\sresulting\nin\sabout\s8x\sfaster\sperformance\sunder\s-DSQLITE_DEBUG\sfor\sthe\squery\sin\sfrom\n[forum:/forumpost/0025389d0860af82|forum\spost\s0025389d0860af82].\s\sThis\schange\nonly\saffects\sbuilds\sthat\suse\s-DSQLITE_DEBUG.
-D 2025-01-21T16:30:55.694
+C Fix\sdate/time\scomputations\sto\sdeal\swith\sthe\ssub-millisecond\srounding\nproblem\sidentified\sin\s[forum:/forumpost/766a2c9231|forum\spost\s766a2c9231].
+D 2025-01-21T17:37:58.001
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@ -725,7 +725,7 @@ F src/build.c c6b09342d870a509529244ed8e19b4175a261f2e3163c199241d69e1d8a57607
 F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b
-F src/date.c 89ce1ff20512a7fa5070ba6e7dd5c171148ca7d580955795bf97c79c2456144a
+F src/date.c 842c08ac143a56a627b05ac51d68624f2b7b03e3b4cba596205e735eed64ee57
 F src/dbpage.c e90410e5d4c0217dfddc4184a81e38ec4903c25d4ec0f201060a0e54e7c2099f
 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c
 F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42
@@ -1068,7 +1068,7 @@ F test/ctime.test 340f362f41f92972bbd71f44e10569a5cc694062b692231bd08aa6fe6c1c47
 F test/cursorhint.test 05cf0febe5c5f8a31f199401fd1c9322249e753950d55f26f9d5aca61408a270
 F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f
 F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68ccf2a7bb8
-F test/date.test c8ff835023f2107b57ce7a45c92265d51c98a23fc93231e998f12d850831aad6
+F test/date.test 8911c3d9fb0e496e92e0259697f431a00707222d2b3438ce1105d1790a3c0d51
 F test/date2.test 7e12ec14aaf4d5e6294b4ba140445b0eca06ea50062a9c3a69c4ee13d0b6f8b1
 F test/date3.test a1b77abf05c6772fe5ca2337cac1398892f2a41e62bce7e6be0f4a08a0e64ae5
 F test/date4.test 75dc8401e8c0639a228cd26a6eaa4ff5ea8ccda912b9853d1c9462c476670e17
@@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 753fd747f24c5e9a019eb00b8a4f66e65c6733ba10a7adbd1b55786867c32ca6
-R f2e8145ad0d67966271c1c923a7301c7
+P 7fb1ae25d1572dd7709a0f850c148a5f745a524f01ea231e29a1ebc37c173fb9
+R b5ed3ff5cc6ba0a7bea1d83d8e8c82a9
 U drh
-Z 86ef734f24e1aa297cb586202f4cb17a
+Z a3888b28f8eea48eee70a7de9cd84dd2
 # Remove this line to create a well-formed Fossil manifest.
index 14622345fc645836d0d56994969a0a4177163e83..a04023f095454287ed91dea38f73ce0565f76ae7 100644 (file)
@@ -1 +1 @@
-7fb1ae25d1572dd7709a0f850c148a5f745a524f01ea231e29a1ebc37c173fb9
+afb0a5923a6db4045fab5226198aab970d746d4866294ebba943c6986e97ecde
index 8c48a81fa5ab688a37799ef376fc2aa33387419c..de27366370e90b7a1b0579ab965ae6cd33d602e8 100644 (file)
@@ -222,6 +222,9 @@ static int parseHhMmSs(const char *zDate, DateTime *p){
         zDate++;
       }
       ms /= rScale;
+      /* Truncate to avoid problems with sub-milliseconds
+      ** rounding. https://sqlite.org/forum/forumpost/766a2c9231 */
+      if( ms>0.999 ) ms = 0.999;
     }
   }else{
     s = 0;
@@ -1429,7 +1432,7 @@ static void strftimeFunc(
       }
       case 'f': {  /* Fractional seconds.  (Non-standard) */
         double s = x.s;
-        if( s>59.999 ) s = 59.999;
+        if( NEVER(s>59.999) ) s = 59.999;
         sqlite3_str_appendf(&sRes, "%06.3f", s);
         break;
       }
index d22b652b474a3f070ba0a24f054c1611cf343567..2042880a920be681933a7e72cfda8ae01e6a099b 100644 (file)
@@ -651,5 +651,13 @@ datetest 19.51 {date('2000-08-31','+0022-06-00','floor')} {2023-02-28}
 datetest 19.52 {date('2000-08-31','+0023-06-00','ceiling')} {2024-03-02}
 datetest 19.53 {date('2000-08-31','+0022-06-00','ceiling')} {2023-03-03}
 
+# 2025-01-21
+# https://sqlite.org/forum/forumpost/766a2c9231
+#
+datetest 20.1 {datetime('2024-12-31 23:59:59.9990')} {2024-12-31 23:59:59}
+datetest 20.2 {datetime('2024-12-31 23:59:59.9999999999999')} \
+                 {2024-12-31 23:59:59}
+datetest 20.3 {datetime('2024-12-31 23:59:59.9995')} {2024-12-31 23:59:59}
+datetest 20.4 {datetime('2024-12-31 23:59:58.9995')} {2024-12-31 23:59:58}
 
 finish_test