From 7961bc4b890071f281da88845489cdddc54c289b Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 19 Feb 2018 15:53:31 +0100 Subject: [PATCH] helper append_interval(String*) --- include/my_time.h | 2 +- sql/sql_time.cc | 84 ++++++++++++++++++++++++++++++++++++++++++++--- sql/sql_time.h | 4 ++- 3 files changed, 83 insertions(+), 7 deletions(-) diff --git a/include/my_time.h b/include/my_time.h index dd95854fb3a..af94288f911 100644 --- a/include/my_time.h +++ b/include/my_time.h @@ -236,7 +236,7 @@ static inline void my_timeval_trunc(struct timeval *tv, uint decimals) order of elements in 'interval_type_to_name' and 'interval_names' arrays - See also interval_type_to_name, get_interval_value, interval_names + See also interval_type_to_name, get_interval_value, interval_names, append_interval */ enum interval_type diff --git a/sql/sql_time.cc b/sql/sql_time.cc index b0de8dab4c5..02731914d52 100644 --- a/sql/sql_time.cc +++ b/sql/sql_time.cc @@ -37,7 +37,7 @@ Order of elements in 'interval_type_to_name' should correspond to the order of elements in 'interval_type' enum - See also interval_type, interval_names + See also interval_type, interval_names, append_interval */ LEX_CSTRING interval_type_to_name[INTERVAL_LAST] = { @@ -61,10 +61,84 @@ LEX_CSTRING interval_type_to_name[INTERVAL_LAST] = { { STRING_WITH_LEN("HOUR_MICROSECOND")}, { STRING_WITH_LEN("MINUTE_MICROSECOND")}, { STRING_WITH_LEN("SECOND_MICROSECOND")} -}; +}; - /* Calc weekday from daynr */ - /* Returns 0 for monday, 1 for tuesday .... */ +int append_interval(String *str, interval_type int_type, const INTERVAL &interval) +{ + char buf[64]; + size_t len; + switch (int_type) { + case INTERVAL_YEAR: + len= my_snprintf(buf,sizeof(buf),"%u", interval.year); + break; + case INTERVAL_QUARTER: + case INTERVAL_MONTH: + len= my_snprintf(buf,sizeof(buf),"%u", interval.month); + int_type=INTERVAL_MONTH; + break; + case INTERVAL_WEEK: + case INTERVAL_DAY: + len= my_snprintf(buf,sizeof(buf),"%u", interval.day); + int_type=INTERVAL_DAY; + break; + case INTERVAL_HOUR: + len= my_snprintf(buf,sizeof(buf),"%u", interval.hour); + break; + case INTERVAL_MINUTE: + len= my_snprintf(buf,sizeof(buf),"%u", interval.minute); + break; + case INTERVAL_SECOND: + len= my_snprintf(buf,sizeof(buf),"%u", interval.second); + break; + case INTERVAL_MICROSECOND: + len= my_snprintf(buf,sizeof(buf),"%u", interval.second_part); + break; + case INTERVAL_YEAR_MONTH: + len= my_snprintf(buf,sizeof(buf),"%u-%02u", interval.day, interval.month); + break; + case INTERVAL_DAY_HOUR: + len= my_snprintf(buf,sizeof(buf),"%u %u", interval.day, interval.hour); + break; + case INTERVAL_DAY_MINUTE: + len= my_snprintf(buf,sizeof(buf),"%u %u:%02u", interval.day, interval.hour, interval.minute); + break; + case INTERVAL_DAY_SECOND: + len= my_snprintf(buf,sizeof(buf),"%u %u:%02u:%02u", interval.day, interval.hour, interval.minute, interval.second); + break; + case INTERVAL_HOUR_MINUTE: + len= my_snprintf(buf,sizeof(buf),"%u:%02u", interval.hour, interval.minute); + break; + case INTERVAL_HOUR_SECOND: + len= my_snprintf(buf,sizeof(buf),"%u:%02u:%02u", interval.hour, interval.minute, interval.second); + break; + case INTERVAL_MINUTE_SECOND: + len= my_snprintf(buf,sizeof(buf),"%u:%02u", interval.minute, interval.second); + break; + case INTERVAL_DAY_MICROSECOND: + len= my_snprintf(buf,sizeof(buf),"%u %u:%02u:%02u.%06u", interval.day, interval.hour, interval.minute, interval.second, interval.second_part); + break; + case INTERVAL_HOUR_MICROSECOND: + len= my_snprintf(buf,sizeof(buf),"%u:%02u:%02u.%06u", interval.hour, interval.minute, interval.second, interval.second_part); + break; + case INTERVAL_MINUTE_MICROSECOND: + len= my_snprintf(buf,sizeof(buf),"%u:%02u.%06u", interval.minute, interval.second, interval.second_part); + break; + case INTERVAL_SECOND_MICROSECOND: + len= my_snprintf(buf,sizeof(buf),"%u.%06u", interval.second, interval.second_part); + break; + default: + DBUG_ASSERT(0); + len= 0; + } + return str->append(buf, len) || str->append(' ') || + str->append(interval_type_to_name + int_type); +} + + +/* + Calc weekday from daynr + Returns 0 for monday, 1 for tuesday ... +*/ int calc_weekday(long daynr,bool sunday_first_day_of_week) { @@ -902,7 +976,7 @@ void make_truncated_value_warning(THD *thd, #define GET_PART(X, N) X % N ## LL; X/= N ## LL bool date_add_interval(MYSQL_TIME *ltime, interval_type int_type, - INTERVAL interval) + const INTERVAL &interval) { long period, sign; diff --git a/sql/sql_time.h b/sql/sql_time.h index d7d04d77f0e..d3607a28a76 100644 --- a/sql/sql_time.h +++ b/sql/sql_time.h @@ -139,9 +139,11 @@ bool my_TIME_to_str(const MYSQL_TIME *ltime, String *str, uint dec); /* MYSQL_TIME operations */ bool date_add_interval(MYSQL_TIME *ltime, interval_type int_type, - INTERVAL interval); + const INTERVAL &interval); bool calc_time_diff(const MYSQL_TIME *l_time1, const MYSQL_TIME *l_time2, int l_sign, longlong *seconds_out, long *microseconds_out); +int append_interval(String *str, interval_type int_type, + const INTERVAL &interval); /** Calculate time difference between two MYSQL_TIME values and store the result as an out MYSQL_TIME value in MYSQL_TIMESTAMP_TIME format.