1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-29 08:21:15 +03:00

MCOL 3474 Fix TIMEDIFF w/ non-temporal data types

This commit is contained in:
jmrojas2332
2019-12-03 06:47:36 +00:00
parent 57724e5515
commit 252268ef63
2 changed files with 79 additions and 28 deletions

View File

@ -371,7 +371,7 @@ inline uint32_t calc_mysql_week( uint32_t year, uint32_t month, uint32_t day,
return days / 7 + 1;
}
inline bool calc_time_diff(int64_t time1, int64_t time2, int l_sign, long long* seconds_out, long long* microseconds_out)
inline bool calc_time_diff(int64_t time1, int64_t time2, int l_sign, long long* seconds_out, long long* microseconds_out, bool isDateTime = true)
{
int64_t days;
bool neg;
@ -393,21 +393,21 @@ inline bool calc_time_diff(int64_t time1, int64_t time2, int l_sign, long long*
sec2 = 0,
msec2 = 0;
year1 = (uint32_t)((time1 >> 48) & 0xffff);
month1 = (uint32_t)((time1 >> 44) & 0xf);
day1 = (uint32_t)((time1 >> 38) & 0x3f);
hour1 = (uint32_t)((time1 >> 32) & 0x3f);
min1 = (uint32_t)((time1 >> 26) & 0x3f);
sec1 = (uint32_t)((time1 >> 20) & 0x3f);
msec1 = (uint32_t)((time1 & 0xfffff));
year1 = isDateTime ? (uint32_t)((time1 >> 48) & 0xffff) : 0;
month1 = isDateTime ? (uint32_t)((time1 >> 44) & 0xf) : 0;
day1 = isDateTime ? (uint32_t)((time1 >> 38) & 0x3f) : (uint32_t)((time1 >> 52) & 0x7ff);
hour1 = isDateTime ? (uint32_t)((time1 >> 32) & 0x3f) : (uint32_t)((time1 >> 40) & 0xfff);
min1 = isDateTime ? (uint32_t)((time1 >> 26) & 0x3f) : (uint32_t)((time1 >> 32) & 0xff);
sec1 = isDateTime ? (uint32_t)((time1 >> 20) & 0x3f) : (uint32_t)((time1 >> 24) & 0xff);
msec1 = isDateTime ? (uint32_t)((time1 & 0xfffff)) : (uint32_t)(time1 & 0xffffff);
year2 = (uint32_t)((time2 >> 48) & 0xffff);
month2 = (uint32_t)((time2 >> 44) & 0xf);
day2 = (uint32_t)((time2 >> 38) & 0x3f);
hour2 = (uint32_t)((time2 >> 32) & 0x3f);
min2 = (uint32_t)((time2 >> 26) & 0x3f);
sec2 = (uint32_t)((time2 >> 20) & 0x3f);
msec2 = (uint32_t)((time2 & 0xfffff));
year2 = isDateTime ? (uint32_t)((time2 >> 48) & 0xffff) : 0;
month2 = isDateTime ? (uint32_t)((time2 >> 44) & 0xf) : 0;
day2 = isDateTime ? (uint32_t)((time2 >> 38) & 0x3f) : (uint32_t)((time2 >> 52) & 0x7ff);;
hour2 = isDateTime ? (uint32_t)((time2 >> 32) & 0x3f) : (uint32_t)((time2 >> 40) & 0xfff);
min2 = isDateTime ? (uint32_t)((time2 >> 26) & 0x3f) : (uint32_t)((time2 >> 32) & 0xff);
sec2 = isDateTime ? (uint32_t)((time2 >> 20) & 0x3f) : (uint32_t)((time2 >> 24) & 0xff);
msec2 = isDateTime ? (uint32_t)((time2 & 0xfffff)) : (uint32_t)(time2 & 0xffffff);
days = calc_mysql_daynr(year1, month1, day1);
@ -768,7 +768,7 @@ string longDoubleToString(long double ld)
uint64_t dateAdd( uint64_t time, const std::string& expr, execplan::IntervalColumn::interval_type unit, bool dateType, execplan::OpType funcType );
const std::string IDB_date_format(const dataconvert::DateTime&, const std::string&);
const std::string timediff(int64_t, int64_t);
const std::string timediff(int64_t, int64_t, bool isDateTime = true);
const char* convNumToStr(int64_t, char*, int);
} //namespace funcexp::helpers