diff --git a/utils/funcexp/func_cast.cpp b/utils/funcexp/func_cast.cpp index 3542e341d..b396c45ea 100644 --- a/utils/funcexp/func_cast.cpp +++ b/utils/funcexp/func_cast.cpp @@ -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(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(&val1)); } + case CalpontSystemCatalog::TIME: + { + DateTime aDateTime = static_cast(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(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; diff --git a/utils/funcexp/func_date.cpp b/utils/funcexp/func_date.cpp index d0bc30942..7fc990ab6 100644 --- a/utils/funcexp/func_date.cpp +++ b/utils/funcexp/func_date.cpp @@ -82,6 +82,17 @@ int64_t Func_date::getIntVal(rowgroup::Row& row, aDateTime = static_cast(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); diff --git a/utils/funcexp/func_date_format.cpp b/utils/funcexp/func_date_format.cpp index 033ceda02..9a25cb941 100644 --- a/utils/funcexp/func_date_format.cpp +++ b/utils/funcexp/func_date_format.cpp @@ -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(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: diff --git a/utils/funcexp/func_makedate.cpp b/utils/funcexp/func_makedate.cpp index 2a30515f1..948b612de 100644 --- a/utils/funcexp/func_makedate.cpp +++ b/utils/funcexp/func_makedate.cpp @@ -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); diff --git a/utils/funcexp/func_nullif.cpp b/utils/funcexp/func_nullif.cpp index a268b0ea1..04a45534a 100644 --- a/utils/funcexp/func_nullif.cpp +++ b/utils/funcexp/func_nullif.cpp @@ -531,7 +531,8 @@ int64_t Func_nullif::getTimeIntVal(rowgroup::Row& row, default: { - isNull = true; + isNull = false; + return exp1; } } diff --git a/utils/funcexp/func_timediff.cpp b/utils/funcexp/func_timediff.cpp index 742e8faf7..d17511f76 100644 --- a/utils/funcexp/func_timediff.cpp +++ b/utils/funcexp/func_timediff.cpp @@ -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: diff --git a/utils/funcexp/func_to_days.cpp b/utils/funcexp/func_to_days.cpp index cc2e3afa2..f16642958 100644 --- a/utils/funcexp/func_to_days.cpp +++ b/utils/funcexp/func_to_days.cpp @@ -91,6 +91,10 @@ int64_t Func_to_days::getIntVal(rowgroup::Row& row, int64_t val; aDateTime = static_cast(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);