1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-30 19:23:07 +03:00

MCOL-1433 Fix some functions for TIME

Fixes the following:

* CAST() (as DATE/DATETIME)
* DATE()
* DATE_FORMAT()
* MAKEDATE()
* NULLIF()
* TIMEDIFF()
* TO_DAYS() / DATEDIFF()
This commit is contained in:
Andrew Hutchings
2018-07-12 15:13:43 +01:00
parent 1fa2537575
commit fb8aab959d
7 changed files with 134 additions and 1 deletions

View File

@ -589,6 +589,33 @@ int32_t Func_cast_date::getDateIntVal(rowgroup::Row& row,
{
return parm[0]->data()->getDateIntVal(row, isNull);
}
case execplan::CalpontSystemCatalog::TIME:
{
int64_t val1;
string value = "";
DateTime aDateTime = static_cast<DateTime>(nowDatetime());
Time aTime = parm[0]->data()->getTimeIntVal(row, isNull);
aTime.day = 0;
if ((aTime.hour < 0) || (aTime.is_neg))
{
aTime.hour = -abs(aTime.hour);
aTime.minute = -abs(aTime.minute);
aTime.second = -abs(aTime.second);
aTime.msecond = -abs(aTime.msecond);
}
aDateTime.hour = 0;
aDateTime.minute = 0;
aDateTime.second = 0;
aDateTime.msecond = 0;
val1 = addTime(aDateTime, aTime);
value = dataconvert::DataConvert::datetimeToString(val1);
value = value.substr(0, 10);
return dataconvert::DataConvert::stringToDate(value);
break;
}
default:
{
@ -680,6 +707,27 @@ int64_t Func_cast_date::getDatetimeIntVal(rowgroup::Row& row,
val1.msecond = 0;
return *(reinterpret_cast<uint64_t*>(&val1));
}
case CalpontSystemCatalog::TIME:
{
DateTime aDateTime = static_cast<DateTime>(nowDatetime());
Time aTime = parm[0]->data()->getTimeIntVal(row, isNull);
aTime.day = 0;
if ((aTime.hour < 0) || (aTime.is_neg))
{
aTime.hour = -abs(aTime.hour);
aTime.minute = -abs(aTime.minute);
aTime.second = -abs(aTime.second);
aTime.msecond = -abs(aTime.msecond);
}
aDateTime.hour = 0;
aDateTime.minute = 0;
aDateTime.second = 0;
aDateTime.msecond = 0;
val = addTime(aDateTime, aTime);
return val;
}
default:
{
@ -814,6 +862,26 @@ int64_t Func_cast_datetime::getDatetimeIntVal(rowgroup::Row& row,
return parm[0]->data()->getDatetimeIntVal(row, isNull);
}
case CalpontSystemCatalog::TIME:
{
DateTime aDateTime = static_cast<DateTime>(nowDatetime());
Time aTime = parm[0]->data()->getTimeIntVal(row, isNull);
aDateTime.hour = 0;
aDateTime.minute = 0;
aDateTime.second = 0;
aDateTime.msecond = 0;
if ((aTime.hour < 0) || (aTime.is_neg))
{
aTime.hour = -abs(aTime.hour);
aTime.minute = -abs(aTime.minute);
aTime.second = -abs(aTime.second);
aTime.msecond = -abs(aTime.msecond);
}
aTime.day = 0;
return addTime(aDateTime, aTime);
break;
}
default:
{
isNull = true;

View File

@ -82,6 +82,17 @@ int64_t Func_date::getIntVal(rowgroup::Row& row,
aDateTime = static_cast<DateTime>(nowDatetime());
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
aTime.day = 0;
aDateTime.hour = 0;
aDateTime.minute = 0;
aDateTime.second = 0;
aDateTime.msecond = 0;
if ((aTime.hour < 0) || (aTime.is_neg))
{
aTime.hour = -abs(aTime.hour);
aTime.minute = -abs(aTime.minute);
aTime.second = -abs(aTime.second);
aTime.msecond = -abs(aTime.msecond);
}
val = addTime(aDateTime, aTime);
value = dataconvert::DataConvert::datetimeToString(val);
value = value.substr(0, 10);

View File

@ -269,6 +269,34 @@ string Func_date_format::getStrVal(rowgroup::Row& row,
dt.msecond = (uint32_t)((val & 0xfffff));
break;
case CalpontSystemCatalog::TIME:
{
DateTime aDateTime = static_cast<DateTime>(nowDatetime());
Time aTime = parm[0]->data()->getTimeIntVal(row, isNull);
aTime.day = 0;
aDateTime.hour = 0;
aDateTime.minute = 0;
aDateTime.second = 0;
aDateTime.msecond = 0;
if ((aTime.hour < 0) || (aTime.is_neg))
{
aTime.hour = -abs(aTime.hour);
aTime.minute = -abs(aTime.minute);
aTime.second = -abs(aTime.second);
aTime.msecond = -abs(aTime.msecond);
}
val = addTime(aDateTime, aTime);
dt.year = (uint32_t)((val >> 48) & 0xffff);
dt.month = (uint32_t)((val >> 44) & 0xf);
dt.day = (uint32_t)((val >> 38) & 0x3f);
dt.hour = (uint32_t)((val >> 32) & 0x3f);
dt.minute = (uint32_t)((val >> 26) & 0x3f);
dt.second = (uint32_t)((val >> 20) & 0x3f);
dt.msecond = (uint32_t)((val & 0xfffff));
break;
}
case CalpontSystemCatalog::CHAR:
case CalpontSystemCatalog::VARCHAR:
case CalpontSystemCatalog::TEXT:

View File

@ -146,11 +146,26 @@ uint64_t makedate(rowgroup::Row& row,
break;
}
case CalpontSystemCatalog::TIME:
{
std::ostringstream ss;
Time aTime = parm[1]->data()->getTimeIntVal(row, isNull);
ss << aTime.hour << aTime.minute << aTime.second;
dayofyear = ss.str();
break;
}
default:
isNull = true;
return 0;
}
if (atoi(dayofyear.c_str()) == 0)
{
isNull = true;
return 0;
}
// convert the year to a date in our internal format, then subtract
// one since we are about to add the day of year back in
Date d(year, 1, 1);

View File

@ -531,7 +531,8 @@ int64_t Func_nullif::getTimeIntVal(rowgroup::Row& row,
default:
{
isNull = true;
isNull = false;
return exp1;
}
}

View File

@ -109,6 +109,12 @@ string Func_timediff::getStrVal(rowgroup::Row& row,
int64_t val1 = -1, val2 = -1;
bool isDate1 = false, isDate2 = false;
if (type1 != type2)
{
isNull = true;
return "";
}
switch (type1)
{
case execplan::CalpontSystemCatalog::DATE:

View File

@ -91,6 +91,10 @@ int64_t Func_to_days::getIntVal(rowgroup::Row& row,
int64_t val;
aDateTime = static_cast<DateTime>(nowDatetime());
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
aDateTime.hour = 0;
aDateTime.minute = 0;
aDateTime.second = 0;
aDateTime.msecond = 0;
aTime.day = 0;
val = addTime(aDateTime, aTime);
year = (uint32_t)((val >> 48) & 0xffff);