Changeset: 3aa9236215a7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3aa9236215a7
Added Files:
        monetdb5/modules/atoms/mtime_private.h
Modified Files:
        monetdb5/modules/atoms/mtime.c
        monetdb5/modules/atoms/mtime.h
        monetdb5/modules/atoms/mtime_analytic.c
Branch: default
Log Message:

Use proper limits for date type in analytics.


diffs (103 lines):

diff --git a/monetdb5/modules/atoms/mtime.c b/monetdb5/modules/atoms/mtime.c
--- a/monetdb5/modules/atoms/mtime.c
+++ b/monetdb5/modules/atoms/mtime.c
@@ -190,6 +190,7 @@
 
 #include "monetdb_config.h"
 #include "mtime.h"
+#include "mtime_private.h"
 
 #ifndef HAVE_STRPTIME
 extern char *strptime(const char *, const char *, struct tm *);
@@ -243,7 +244,7 @@ static int CUMLEAPDAYS[13] = {
        0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366
 };
 
-static date DATE_MAX, DATE_MIN;                /* often used dates; computed 
once */
+date DATE_MAX, DATE_MIN;               /* often used dates; computed once */
 
 #define MONTHDAYS(m,y) ((m) != 2 ? LEAPDAYS[m] : leapyear(y) ? 29 : 28)
 #define YEARDAYS(y)            (leapyear(y) ? 366 : 365)
diff --git a/monetdb5/modules/atoms/mtime.h b/monetdb5/modules/atoms/mtime.h
--- a/monetdb5/modules/atoms/mtime.h
+++ b/monetdb5/modules/atoms/mtime.h
@@ -41,7 +41,6 @@
 typedef int date;
 #define date_nil               ((date) int_nil)
 #define is_date_nil(X) ((X) == date_nil)
-#define date_max               GDK_int_max /* used for overflow checks */
 
 /*
  * @- daytime
diff --git a/monetdb5/modules/atoms/mtime_analytic.c 
b/monetdb5/modules/atoms/mtime_analytic.c
--- a/monetdb5/modules/atoms/mtime_analytic.c
+++ b/monetdb5/modules/atoms/mtime_analytic.c
@@ -16,8 +16,9 @@
 
 #include "monetdb_config.h"
 #include "mtime.h"
+#include "mtime_private.h"
 
-#define MTIME_SUB_WITH_CHECK(lft, rgt, TYPE, dst, max, on_overflow) \
+#define MTIME_SUB_WITH_CHECK(lft, rgt, TYPE, dst, min, max, on_overflow) \
        do { \
                if ((rgt) < 1) { \
                        if ((max) + (rgt) < (lft)) \
@@ -25,7 +26,7 @@
                        else \
                                (dst) = (TYPE) (lft) - (rgt); \
                } else { \
-                       if (-(max) + (rgt) > (lft)) \
+                       if ((min) + (rgt) > (lft)) \
                                on_overflow; \
                        else \
                                (dst) = (TYPE) (lft) - (rgt); \
@@ -36,7 +37,7 @@
 
 #define DATE_RANGE_MONTH_DIFF(X,Y,R) \
        do { \
-               MTIME_SUB_WITH_CHECK(X, Y, date, R, date_max, goto 
calc_overflow); \
+               MTIME_SUB_WITH_CHECK(X, Y, date, R, DATE_MIN, DATE_MAX, goto 
calc_overflow); \
                R = MABSOLUTE(R); \
                R /= 30; /* days in a month */ \
                R += (X != Y); /* in a '0' month interval, the rows don't 
belong to the same frame if the difference is less than one month */ \
@@ -44,7 +45,7 @@
 
 #define TIMESTAMP_RANGE_MONTH_DIFF(X,Y,R) \
        do { \
-               MTIME_SUB_WITH_CHECK(X.days, Y.days, date, R, date_max, goto 
calc_overflow); \
+               MTIME_SUB_WITH_CHECK(X.days, Y.days, date, R, DATE_MIN, 
DATE_MAX, goto calc_overflow); \
                R = MABSOLUTE(R); \
                R /= 30; /* days in a month */ \
                R += (X.days != Y.days); /* same reason as above */ \
@@ -57,14 +58,14 @@
 
 #define DATE_RANGE_SEC_DIFF(X,Y,R) \
        do { \
-               MTIME_SUB_WITH_CHECK(X, Y, date, R, date_max, goto 
calc_overflow); \
+               MTIME_SUB_WITH_CHECK(X, Y, date, R, DATE_MIN, DATE_MAX, goto 
calc_overflow); \
                R = MABSOLUTE(R); \
                R *= 86400000; /* days in milliseconds */ \
        } while (0)
 
 #define TIMESTAMP_RANGE_SEC_DIFF(X,Y,R) \
        do { \
-               MTIME_SUB_WITH_CHECK(X.days, Y.days, date, R, date_max, goto 
calc_overflow); \
+               MTIME_SUB_WITH_CHECK(X.days, Y.days, date, R, DATE_MIN, 
DATE_MAX, goto calc_overflow); \
                R = MABSOLUTE(R); \
                R *= 86400000; /* days in milliseconds */ \
                R += MABSOLUTE(X.msecs - Y.msecs); /* never overflows */ \
diff --git a/monetdb5/modules/atoms/mtime_private.h 
b/monetdb5/modules/atoms/mtime_private.h
new file mode 100644
--- /dev/null
+++ b/monetdb5/modules/atoms/mtime_private.h
@@ -0,0 +1,9 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0.  If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V.
+ */
+
+extern date DATE_MAX, DATE_MIN;                /* often used dates; computed 
once */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to