You've already forked mariadb-columnstore-engine
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:
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -531,7 +531,8 @@ int64_t Func_nullif::getTimeIntVal(rowgroup::Row& row,
|
||||
|
||||
default:
|
||||
{
|
||||
isNull = true;
|
||||
isNull = false;
|
||||
return exp1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user