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);
|
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:
|
default:
|
||||||
{
|
{
|
||||||
@ -680,6 +707,27 @@ int64_t Func_cast_date::getDatetimeIntVal(rowgroup::Row& row,
|
|||||||
val1.msecond = 0;
|
val1.msecond = 0;
|
||||||
return *(reinterpret_cast<uint64_t*>(&val1));
|
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:
|
default:
|
||||||
{
|
{
|
||||||
@ -814,6 +862,26 @@ int64_t Func_cast_datetime::getDatetimeIntVal(rowgroup::Row& row,
|
|||||||
return parm[0]->data()->getDatetimeIntVal(row, isNull);
|
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:
|
default:
|
||||||
{
|
{
|
||||||
isNull = true;
|
isNull = true;
|
||||||
|
@ -82,6 +82,17 @@ int64_t Func_date::getIntVal(rowgroup::Row& row,
|
|||||||
aDateTime = static_cast<DateTime>(nowDatetime());
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
aTime.day = 0;
|
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);
|
val = addTime(aDateTime, aTime);
|
||||||
value = dataconvert::DataConvert::datetimeToString(val);
|
value = dataconvert::DataConvert::datetimeToString(val);
|
||||||
value = value.substr(0, 10);
|
value = value.substr(0, 10);
|
||||||
|
@ -269,6 +269,34 @@ string Func_date_format::getStrVal(rowgroup::Row& row,
|
|||||||
dt.msecond = (uint32_t)((val & 0xfffff));
|
dt.msecond = (uint32_t)((val & 0xfffff));
|
||||||
break;
|
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::CHAR:
|
||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
case CalpontSystemCatalog::TEXT:
|
case CalpontSystemCatalog::TEXT:
|
||||||
|
@ -146,11 +146,26 @@ uint64_t makedate(rowgroup::Row& row,
|
|||||||
break;
|
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:
|
default:
|
||||||
isNull = true;
|
isNull = true;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (atoi(dayofyear.c_str()) == 0)
|
||||||
|
{
|
||||||
|
isNull = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// convert the year to a date in our internal format, then subtract
|
// 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
|
// one since we are about to add the day of year back in
|
||||||
Date d(year, 1, 1);
|
Date d(year, 1, 1);
|
||||||
|
@ -531,7 +531,8 @@ int64_t Func_nullif::getTimeIntVal(rowgroup::Row& row,
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
isNull = true;
|
isNull = false;
|
||||||
|
return exp1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,6 +109,12 @@ string Func_timediff::getStrVal(rowgroup::Row& row,
|
|||||||
int64_t val1 = -1, val2 = -1;
|
int64_t val1 = -1, val2 = -1;
|
||||||
bool isDate1 = false, isDate2 = false;
|
bool isDate1 = false, isDate2 = false;
|
||||||
|
|
||||||
|
if (type1 != type2)
|
||||||
|
{
|
||||||
|
isNull = true;
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
switch (type1)
|
switch (type1)
|
||||||
{
|
{
|
||||||
case execplan::CalpontSystemCatalog::DATE:
|
case execplan::CalpontSystemCatalog::DATE:
|
||||||
|
@ -91,6 +91,10 @@ int64_t Func_to_days::getIntVal(rowgroup::Row& row,
|
|||||||
int64_t val;
|
int64_t val;
|
||||||
aDateTime = static_cast<DateTime>(nowDatetime());
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aDateTime.hour = 0;
|
||||||
|
aDateTime.minute = 0;
|
||||||
|
aDateTime.second = 0;
|
||||||
|
aDateTime.msecond = 0;
|
||||||
aTime.day = 0;
|
aTime.day = 0;
|
||||||
val = addTime(aDateTime, aTime);
|
val = addTime(aDateTime, aTime);
|
||||||
year = (uint32_t)((val >> 48) & 0xffff);
|
year = (uint32_t)((val >> 48) & 0xffff);
|
||||||
|
Reference in New Issue
Block a user