Changeset: f5e304d3407f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f5e304d3407f Added Files: monetdb5/modules/atoms/mtime.h Modified Files: monetdb5/modules/atoms/CMakeLists.txt monetdb5/modules/atoms/mtime.c sql/server/rel_statistics_functions.c Branch: properties Log Message:
Propagating statistics from mtime module functions. As I need their implementations, I exposed the necessary functions in the header files, then no extra export is required diffs (truncated from 621 to 300 lines): diff --git a/monetdb5/modules/atoms/CMakeLists.txt b/monetdb5/modules/atoms/CMakeLists.txt --- a/monetdb5/modules/atoms/CMakeLists.txt +++ b/monetdb5/modules/atoms/CMakeLists.txt @@ -18,7 +18,7 @@ target_sources(atoms url.c uuid.c uuid.h json.c - mtime.c + mtime.c mtime.h inet.c identifier.c xml.c xml.h 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 @@ -29,11 +29,9 @@ */ #include "monetdb_config.h" -#include "gdk.h" -#include "gdk_time.h" +#include "mtime.h" #include "mal_client.h" -#include "mal_interpreter.h" -#include "mal_exception.h" + #ifndef HAVE_STRPTIME extern char *strptime(const char *, const char *, struct tm *); @@ -456,147 +454,34 @@ bailout: \ #define func2_noexcept(FUNC, RET, PARAM1, PARAM2) RET = FUNC(PARAM1, PARAM2); #define func2_except(FUNC, RET, PARAM1, PARAM2) msg = FUNC(&RET, PARAM1, PARAM2); if (msg) break; -/* TODO change dayint again into an int instead of lng */ -static inline lng -date_diff_imp(const date d1, const date d2) -{ - int diff = date_diff(d1, d2); - return is_int_nil(diff) ? lng_nil : (lng) diff * (lng) (24*60*60*1000); -} func2(MTIMEdate_diff, "diff", date, date, lng, date_diff_imp, func2_noexcept, \ DEC_VAR, DEC_VAR, DEC_VAR_R, DEC_INT, INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, FINISH_INT_SINGLE, CLEAR_NOTHING) func2(MTIMEdaytime_diff_msec, "diff", daytime, daytime, lng, daytime_diff, func2_noexcept, \ DEC_VAR, DEC_VAR, DEC_VAR_R, DEC_INT, INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, FINISH_INT_SINGLE, CLEAR_NOTHING) -static inline str -date_sub_msec_interval(date *ret, date d, lng ms) -{ - if (is_date_nil(d) || is_lng_nil(ms)) { - *ret = date_nil; - return MAL_SUCCEED; - } - if (is_date_nil((*ret = date_add_day(d, (int) (-ms / (24*60*60*1000)))))) - throw(MAL, "mtime.date_sub_msec_interval", SQLSTATE(22003) "overflow in calculation"); - return MAL_SUCCEED; -} -static inline str -date_add_msec_interval(date *ret, date d, lng ms) -{ - if (is_date_nil(d) || is_lng_nil(ms)) { - *ret = date_nil; - return MAL_SUCCEED; - } - if (is_date_nil((*ret = date_add_day(d, (int) (ms / (24*60*60*1000)))))) - throw(MAL, "mtime.date_add_msec_interval", SQLSTATE(22003) "overflow in calculation"); - return MAL_SUCCEED; -} func2(MTIMEdate_sub_msec_interval, "date_sub_msec_interval", date, lng, date, date_sub_msec_interval, func2_except, \ DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, FINISH_INT_SINGLE, CLEAR_NOTHING) func2(MTIMEdate_add_msec_interval, "date_add_msec_interval", date, lng, date, date_add_msec_interval, func2_except, \ DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, FINISH_INT_SINGLE, CLEAR_NOTHING) -static inline str -timestamp_sub_msec_interval(timestamp *ret, timestamp ts, lng ms) -{ - if (is_timestamp_nil(ts) || is_lng_nil(ms)) { - *ret = timestamp_nil; - return MAL_SUCCEED; - } - if (is_timestamp_nil((*ret = timestamp_add_usec(ts, -ms * 1000)))) - throw(MAL, "mtime.timestamp_sub_msec_interval", SQLSTATE(22003) "overflow in calculation"); - return MAL_SUCCEED; -} -static inline str -timestamp_add_msec_interval(timestamp *ret, timestamp ts, lng ms) -{ - if (is_timestamp_nil(ts) || is_lng_nil(ms)) { - *ret = timestamp_nil; - return MAL_SUCCEED; - } - if (is_timestamp_nil((*ret = timestamp_add_usec(ts, ms * 1000)))) - throw(MAL, "mtime.timestamp_add_msec_interval", SQLSTATE(22003) "overflow in calculation"); - return MAL_SUCCEED; -} func2(MTIMEtimestamp_sub_msec_interval, "timestamp_sub_msec_interval", timestamp, lng, timestamp, timestamp_sub_msec_interval, func2_except, \ DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, FINISH_INT_SINGLE, CLEAR_NOTHING) func2(MTIMEtimestamp_add_msec_interval, "timestamp_add_msec_interval", timestamp, lng, timestamp, timestamp_add_msec_interval, func2_except, \ DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, FINISH_INT_SINGLE, CLEAR_NOTHING) -static inline str -timestamp_sub_month_interval(timestamp *ret, timestamp ts, int m) -{ - if (is_timestamp_nil(ts) || is_int_nil(m)) { - *ret = timestamp_nil; - return MAL_SUCCEED; - } - if (is_timestamp_nil((*ret = timestamp_add_month(ts, -m)))) - throw(MAL, "mtime.timestamp_sub_month_interval", SQLSTATE(22003) "overflow in calculation"); - return MAL_SUCCEED; -} -static inline str -timestamp_add_month_interval(timestamp *ret, timestamp ts, int m) -{ - if (is_timestamp_nil(ts) || is_int_nil(m)) { - *ret = timestamp_nil; - return MAL_SUCCEED; - } - if (is_timestamp_nil((*ret = timestamp_add_month(ts, m)))) - throw(MAL, "mtime.timestamp_add_month_interval", SQLSTATE(22003) "overflow in calculation"); - return MAL_SUCCEED; -} func2(MTIMEtimestamp_sub_month_interval, "timestamp_sub_month_interval", timestamp, int, timestamp, timestamp_sub_month_interval, func2_except, \ DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, FINISH_INT_SINGLE, CLEAR_NOTHING) func2(MTIMEtimestamp_add_month_interval, "timestamp_add_month_interval", timestamp, int, timestamp, timestamp_add_month_interval, func2_except, \ DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, FINISH_INT_SINGLE, CLEAR_NOTHING) - -static inline daytime -time_sub_msec_interval(const daytime t, const lng ms) -{ - if (is_lng_nil(ms)) - return daytime_nil; - return daytime_add_usec_modulo(t, -ms * 1000); -} -static inline daytime -time_add_msec_interval(const daytime t, const lng ms) -{ - if (is_lng_nil(ms)) - return daytime_nil; - return daytime_add_usec_modulo(t, ms * 1000); -} func2(MTIMEtime_sub_msec_interval, "time_sub_msec_interval", daytime, lng, daytime, time_sub_msec_interval, func2_noexcept, \ DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, FINISH_INT_SINGLE, CLEAR_NOTHING) func2(MTIMEtime_add_msec_interval, "time_add_msec_interval", daytime, lng, daytime, time_add_msec_interval, func2_noexcept, \ DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, FINISH_INT_SINGLE, CLEAR_NOTHING) -static inline str -date_submonths(date *ret, date d, int m) -{ - if (is_date_nil(d) || is_int_nil(m)) { - *ret = date_nil; - return MAL_SUCCEED; - } - if (is_date_nil((*ret = date_add_month(d, -m)))) - throw(MAL, "mtime.date_submonths", SQLSTATE(22003) "overflow in calculation"); - return MAL_SUCCEED; -} -static inline str -date_addmonths(date *ret, date d, int m) -{ - if (is_date_nil(d) || is_int_nil(m)) { - *ret = date_nil; - return MAL_SUCCEED; - } - if (is_date_nil((*ret = date_add_month(d, m)))) - throw(MAL, "mtime.date_addmonths", SQLSTATE(22003) "overflow in calculation"); - return MAL_SUCCEED; -} func2(MTIMEdate_submonths, "date_submonths", date, int, date, date_submonths, func2_except, \ DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, FINISH_INT_SINGLE, CLEAR_NOTHING) func2(MTIMEdate_addmonths, "date_addmonths", date, int, date, date_addmonths, func2_except, \ DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, FINISH_INT_SINGLE, CLEAR_NOTHING) - -#define date_to_msec_since_epoch(t) is_date_nil(t) ? lng_nil : (timestamp_diff(timestamp_create(t, daytime_create(0, 0, 0, 0)), unixepoch) / 1000) -#define daytime_to_msec_since_epoch(t) daytime_diff(t, daytime_create(0, 0, 0, 0)) func1(MTIMEdate_extract_century, "date_century", date, int, date_century, COPYFLAGS, func1_noexcept, \ DEC_VAR_R, DEC_VAR_R, INIT_VAR, INIT_VAR, GET_NEXT_VAR) func1(MTIMEdate_extract_decade, "date_decade", date, int, date_decade, COPYFLAGS, func1_noexcept, \ @@ -627,46 +512,9 @@ func1(MTIMEdaytime_extract_sql_seconds, DEC_VAR_R, DEC_VAR_R, INIT_VAR, INIT_VAR, GET_NEXT_VAR) func1(MTIMEdaytime_extract_epoch_ms, "epoch_ms", daytime, lng, daytime_to_msec_since_epoch, COPYFLAGS, func1_noexcept, \ DEC_VAR_R, DEC_VAR_R, INIT_VAR, INIT_VAR, GET_NEXT_VAR) - -static inline lng -TSDIFF(timestamp t1, timestamp t2) -{ - lng diff = timestamp_diff(t1, t2); - if (!is_lng_nil(diff)) { -#ifndef TRUNCATE_NUMBERS - if (diff < 0) - diff = -((-diff + 500) / 1000); - else - diff = (diff + 500) / 1000; -#else - diff /= 1000; -#endif - } - return diff; -} -func2(MTIMEtimestamp_diff_msec, "diff", timestamp, timestamp, lng, TSDIFF, func2_noexcept, \ +func2(MTIMEtimestamp_diff_msec, "diff", timestamp, timestamp, lng, tsdiff, func2_noexcept, \ DEC_VAR, DEC_VAR, DEC_VAR_R, DEC_INT, INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, FINISH_INT_SINGLE, CLEAR_NOTHING) -static inline int -timestamp_century(const timestamp t) -{ - if (is_timestamp_nil(t)) - return int_nil; - int y = date_year(timestamp_date(t)); - if (y > 0) - return (y - 1) / 100 + 1; - else - return -((-y - 1) / 100 + 1); -} -#define timestamp_decade(t) is_timestamp_nil(t) ? int_nil : date_year(timestamp_date(t)) / 10 -#define timestamp_year(t) date_year(timestamp_date(t)) -#define timestamp_quarter(t) is_timestamp_nil(t) ? int_nil : (date_month(timestamp_date(t)) - 1) / 3 + 1 -#define timestamp_month(t) date_month(timestamp_date(t)) -#define timestamp_day(t) date_day(timestamp_date(t)) -#define timestamp_hours(t) daytime_hour(timestamp_daytime(t)) -#define timestamp_minutes(t) daytime_min(timestamp_daytime(t)) -#define timestamp_extract_usecond(ts) daytime_sec_usec(timestamp_daytime(ts)) -#define timestamp_to_msec_since_epoch(t) is_timestamp_nil(t) ? lng_nil : (timestamp_diff(t, unixepoch) / 1000) func1(MTIMEtimestamp_century, "timestamp_century", timestamp, int, timestamp_century, COPYFLAGS, func1_noexcept, \ DEC_VAR_R, DEC_VAR_R, INIT_VAR, INIT_VAR, GET_NEXT_VAR) func1(MTIMEtimestamp_decade, "timestamp_decade", timestamp, int, timestamp_decade, COPYFLAGS, func1_noexcept, \ @@ -688,13 +536,6 @@ func1(MTIMEtimestamp_sql_seconds, "sql_s func1(MTIMEtimestamp_extract_epoch_ms, "epoch_ms", timestamp, lng, timestamp_to_msec_since_epoch, COPYFLAGS, func1_noexcept, \ DEC_VAR_R, DEC_VAR_R, INIT_VAR, INIT_VAR, GET_NEXT_VAR) -#define sql_year(m) is_int_nil(m) ? int_nil : m / 12 -#define sql_month(m) is_int_nil(m) ? int_nil : m % 12 -#define sql_day(m) is_lng_nil(m) ? lng_nil : m / (24*60*60*1000) -#define sql_hours(m) is_lng_nil(m) ? int_nil : (int) ((m % (24*60*60*1000)) / (60*60*1000)) -#define sql_minutes(m) is_lng_nil(m) ? int_nil : (int) ((m % (60*60*1000)) / (60*1000)) -#define sql_seconds(m) is_lng_nil(m) ? int_nil : (int) ((m % (60*1000)) / 1000) -#define msec_since_epoch(ts) ts func1(MTIMEsql_year, "sql_year", int, int, sql_year, COPYFLAGS, func1_noexcept, \ DEC_VAR_R, DEC_VAR_R, INIT_VAR, INIT_VAR, GET_NEXT_VAR) func1(MTIMEsql_month, "sql_month", int, int, sql_month, SETFLAGS, func1_noexcept, \ diff --git a/monetdb5/modules/atoms/mtime.h b/monetdb5/modules/atoms/mtime.h new file mode 100644 --- /dev/null +++ b/monetdb5/modules/atoms/mtime.h @@ -0,0 +1,186 @@ +/* + * 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 - 2020 MonetDB B.V. + */ + +#ifndef __MTIME_H__ +#define __MTIME_H__ + +#include "monetdb_config.h" +#include "gdk.h" +#include "gdk_time.h" +#include "mal_interpreter.h" +#include "mal_exception.h" + +/* TODO change dayint again into an int instead of lng */ +static inline lng +date_diff_imp(const date d1, const date d2) +{ + int diff = date_diff(d1, d2); + return is_int_nil(diff) ? lng_nil : (lng) diff * (lng) (24*60*60*1000); +} + +static inline daytime +time_sub_msec_interval(const daytime t, const lng ms) +{ + if (is_lng_nil(ms)) + return daytime_nil; + return daytime_add_usec_modulo(t, -ms * 1000); +} + +static inline daytime +time_add_msec_interval(const daytime t, const lng ms) +{ + if (is_lng_nil(ms)) + return daytime_nil; + return daytime_add_usec_modulo(t, ms * 1000); +} + +static inline str +date_sub_msec_interval(date *ret, date d, lng ms) +{ + if (is_date_nil(d) || is_lng_nil(ms)) { + *ret = date_nil; + return MAL_SUCCEED; + } + if (is_date_nil((*ret = date_add_day(d, (int) (-ms / (24*60*60*1000)))))) + throw(MAL, "mtime.date_sub_msec_interval", SQLSTATE(22003) "overflow in calculation"); + return MAL_SUCCEED; +} + +static inline str +date_add_msec_interval(date *ret, date d, lng ms) +{ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list