summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2018-02-19 15:53:31 +0100
committerSergei Golubchik <serg@mariadb.org>2018-02-23 15:33:24 +0100
commit7961bc4b890071f281da88845489cdddc54c289b (patch)
tree139c9834dafc239adb80c53730b5f495421607d0
parent7e2c686b3f3f8d1480898c2b3997eddbc158609b (diff)
downloadmariadb-git-7961bc4b890071f281da88845489cdddc54c289b.tar.gz
helper append_interval(String*)
-rw-r--r--include/my_time.h2
-rw-r--r--sql/sql_time.cc84
-rw-r--r--sql/sql_time.h4
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.