You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-08-01 06:46:55 +03:00
Merge pull request #494 from mariadb-corporation/MCOL-1433
MCOL-1433 Fix several functions for TIME handling
This commit is contained in:
@ -36,180 +36,6 @@ using namespace dataconvert;
|
|||||||
#include "functor_dtm.h"
|
#include "functor_dtm.h"
|
||||||
#include "funchelpers.h"
|
#include "funchelpers.h"
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
using namespace funcexp;
|
|
||||||
|
|
||||||
int64_t addTime(DateTime& dt1, Time& dt2)
|
|
||||||
{
|
|
||||||
DateTime dt;
|
|
||||||
dt.year = 0;
|
|
||||||
dt.month = 0;
|
|
||||||
dt.day = 0;
|
|
||||||
dt.hour = 0;
|
|
||||||
dt.minute = 0;
|
|
||||||
dt.second = 0;
|
|
||||||
dt.msecond = 0;
|
|
||||||
|
|
||||||
int64_t month, day, hour, min, sec, msec, tmp;
|
|
||||||
msec = (signed)(dt1.msecond + dt2.msecond);
|
|
||||||
dt.msecond = tmp = msec % 1000000;
|
|
||||||
|
|
||||||
if (tmp < 0)
|
|
||||||
{
|
|
||||||
dt.msecond = tmp + 1000000;
|
|
||||||
dt2.second--;
|
|
||||||
}
|
|
||||||
|
|
||||||
sec = (signed)(dt1.second + dt2.second + msec / 1000000);
|
|
||||||
dt.second = tmp = sec % 60;
|
|
||||||
|
|
||||||
if (tmp < 0)
|
|
||||||
{
|
|
||||||
dt.second = tmp + 60;
|
|
||||||
dt2.minute--;
|
|
||||||
}
|
|
||||||
|
|
||||||
min = (signed)(dt1.minute + dt2.minute + sec / 60);
|
|
||||||
dt.minute = tmp = min % 60;
|
|
||||||
|
|
||||||
if (tmp < 0)
|
|
||||||
{
|
|
||||||
dt.minute = tmp + 60;
|
|
||||||
dt2.hour--;
|
|
||||||
}
|
|
||||||
|
|
||||||
hour = (signed)(dt1.hour + dt2.hour + min / 60);
|
|
||||||
|
|
||||||
if ((hour < 0) || (hour > 23))
|
|
||||||
{
|
|
||||||
dt2.day = hour / 24;
|
|
||||||
hour = hour % 24;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hour < 0)
|
|
||||||
{
|
|
||||||
dt.hour = hour + 24;
|
|
||||||
dt2.day--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dt.hour = hour;
|
|
||||||
}
|
|
||||||
|
|
||||||
day = (signed)(dt1.day + dt2.day);
|
|
||||||
|
|
||||||
|
|
||||||
if (isLeapYear(dt1.year) && dt1.month == 2)
|
|
||||||
day--;
|
|
||||||
|
|
||||||
month = dt1.month;
|
|
||||||
int addyear = 0;
|
|
||||||
|
|
||||||
if (day < 0)
|
|
||||||
{
|
|
||||||
int monthSave = month;
|
|
||||||
|
|
||||||
while (day <= 0)
|
|
||||||
{
|
|
||||||
month = (month == 1 ? 12 : month - 1);
|
|
||||||
|
|
||||||
for (; day <= 0 && month > 0; month--)
|
|
||||||
day += getDaysInMonth(month, dt1.year);
|
|
||||||
|
|
||||||
month++;
|
|
||||||
// month=12;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( month > monthSave )
|
|
||||||
addyear--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int monthSave = month;
|
|
||||||
|
|
||||||
while (day > getDaysInMonth(month, dt1.year))
|
|
||||||
{
|
|
||||||
for (; day > getDaysInMonth(month, dt1.year) && month <= 12; month++)
|
|
||||||
day -= getDaysInMonth(month, dt1.year);
|
|
||||||
|
|
||||||
if (month > 12)
|
|
||||||
month = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( month < monthSave )
|
|
||||||
addyear++;
|
|
||||||
}
|
|
||||||
|
|
||||||
dt.day = day;
|
|
||||||
dt.month = month;
|
|
||||||
dt.year = dt1.year + addyear;
|
|
||||||
|
|
||||||
return *(reinterpret_cast<int64_t*>(&dt));
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t addTime(Time& dt1, Time& dt2)
|
|
||||||
{
|
|
||||||
Time dt;
|
|
||||||
dt.is_neg = false;
|
|
||||||
dt.hour = 0;
|
|
||||||
dt.minute = 0;
|
|
||||||
dt.second = 0;
|
|
||||||
dt.msecond = 0;
|
|
||||||
|
|
||||||
int64_t min, sec, msec, tmp;
|
|
||||||
msec = (signed)(dt1.msecond + dt2.msecond);
|
|
||||||
dt.msecond = tmp = msec % 1000000;
|
|
||||||
|
|
||||||
if (tmp < 0)
|
|
||||||
{
|
|
||||||
dt.msecond = tmp + 1000000;
|
|
||||||
dt2.second--;
|
|
||||||
}
|
|
||||||
|
|
||||||
sec = (signed)(dt1.second + dt2.second + msec / 1000000);
|
|
||||||
dt.second = tmp = sec % 60;
|
|
||||||
|
|
||||||
if (tmp < 0)
|
|
||||||
{
|
|
||||||
dt.second = tmp + 60;
|
|
||||||
dt2.minute--;
|
|
||||||
}
|
|
||||||
|
|
||||||
min = (signed)(dt1.minute + dt2.minute + sec / 60);
|
|
||||||
dt.minute = tmp = min % 60;
|
|
||||||
|
|
||||||
if (tmp < 0)
|
|
||||||
{
|
|
||||||
dt.minute = tmp + 60;
|
|
||||||
dt2.hour--;
|
|
||||||
}
|
|
||||||
|
|
||||||
dt.hour = tmp = (signed)(dt1.hour + dt2.hour + min / 60);
|
|
||||||
|
|
||||||
// Saturation
|
|
||||||
if (tmp > 838)
|
|
||||||
{
|
|
||||||
dt.hour = 838;
|
|
||||||
dt.minute = 59;
|
|
||||||
dt.second = 59;
|
|
||||||
dt.msecond = 999999;
|
|
||||||
}
|
|
||||||
else if (tmp < -838)
|
|
||||||
{
|
|
||||||
dt.is_neg = true;
|
|
||||||
dt.hour = -838;
|
|
||||||
dt.minute = 59;
|
|
||||||
dt.second = 59;
|
|
||||||
dt.msecond = 999999;
|
|
||||||
}
|
|
||||||
|
|
||||||
return *(reinterpret_cast<int64_t*>(&dt));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace funcexp
|
namespace funcexp
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -56,6 +56,9 @@ int64_t Func_date::getIntVal(rowgroup::Row& row,
|
|||||||
|
|
||||||
string value = "";
|
string value = "";
|
||||||
|
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case execplan::CalpontSystemCatalog::DATE:
|
case execplan::CalpontSystemCatalog::DATE:
|
||||||
@ -72,6 +75,20 @@ int64_t Func_date::getIntVal(rowgroup::Row& row,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
{
|
||||||
|
int64_t val;
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
value = dataconvert::DataConvert::datetimeToString(val);
|
||||||
|
value = value.substr(0, 10);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
case execplan::CalpontSystemCatalog::BIGINT:
|
case execplan::CalpontSystemCatalog::BIGINT:
|
||||||
case execplan::CalpontSystemCatalog::INT:
|
case execplan::CalpontSystemCatalog::INT:
|
||||||
case execplan::CalpontSystemCatalog::MEDINT:
|
case execplan::CalpontSystemCatalog::MEDINT:
|
||||||
|
@ -49,6 +49,9 @@ int64_t Func_day::getIntVal(rowgroup::Row& row,
|
|||||||
{
|
{
|
||||||
int64_t val = 0;
|
int64_t val = 0;
|
||||||
|
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
switch (parm[0]->data()->resultType().colDataType)
|
switch (parm[0]->data()->resultType().colDataType)
|
||||||
{
|
{
|
||||||
case CalpontSystemCatalog::DATE:
|
case CalpontSystemCatalog::DATE:
|
||||||
@ -59,6 +62,16 @@ int64_t Func_day::getIntVal(rowgroup::Row& row,
|
|||||||
val = parm[0]->data()->getIntVal(row, isNull);
|
val = parm[0]->data()->getIntVal(row, isNull);
|
||||||
return (uint32_t)((val >> 38) & 0x3f);
|
return (uint32_t)((val >> 38) & 0x3f);
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
return (uint32_t)((val >> 38) & 0x3f);
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
case CalpontSystemCatalog::CHAR:
|
case CalpontSystemCatalog::CHAR:
|
||||||
case CalpontSystemCatalog::TEXT:
|
case CalpontSystemCatalog::TEXT:
|
||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
|
@ -54,6 +54,9 @@ int64_t Func_dayname::getIntVal(rowgroup::Row& row,
|
|||||||
int64_t val = 0;
|
int64_t val = 0;
|
||||||
int32_t dayofweek = 0;
|
int32_t dayofweek = 0;
|
||||||
|
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
switch (parm[0]->data()->resultType().colDataType)
|
switch (parm[0]->data()->resultType().colDataType)
|
||||||
{
|
{
|
||||||
case CalpontSystemCatalog::DATE:
|
case CalpontSystemCatalog::DATE:
|
||||||
@ -70,6 +73,17 @@ int64_t Func_dayname::getIntVal(rowgroup::Row& row,
|
|||||||
day = (uint32_t)((val >> 38) & 0x3f);
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
year = (uint32_t)((val >> 48) & 0xffff);
|
||||||
|
month = (uint32_t)((val >> 44) & 0xf);
|
||||||
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
|
break;
|
||||||
|
|
||||||
case CalpontSystemCatalog::CHAR:
|
case CalpontSystemCatalog::CHAR:
|
||||||
case CalpontSystemCatalog::TEXT:
|
case CalpontSystemCatalog::TEXT:
|
||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
|
@ -52,6 +52,9 @@ int64_t Func_dayofweek::getIntVal(rowgroup::Row& row,
|
|||||||
uint32_t day = 0;
|
uint32_t day = 0;
|
||||||
int64_t val = 0;
|
int64_t val = 0;
|
||||||
|
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
switch (parm[0]->data()->resultType().colDataType)
|
switch (parm[0]->data()->resultType().colDataType)
|
||||||
{
|
{
|
||||||
case CalpontSystemCatalog::DATE:
|
case CalpontSystemCatalog::DATE:
|
||||||
@ -68,6 +71,17 @@ int64_t Func_dayofweek::getIntVal(rowgroup::Row& row,
|
|||||||
day = (uint32_t)((val >> 38) & 0x3f);
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
year = (uint32_t)((val >> 48) & 0xffff);
|
||||||
|
month = (uint32_t)((val >> 44) & 0xf);
|
||||||
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
|
break;
|
||||||
|
|
||||||
case CalpontSystemCatalog::CHAR:
|
case CalpontSystemCatalog::CHAR:
|
||||||
case CalpontSystemCatalog::TEXT:
|
case CalpontSystemCatalog::TEXT:
|
||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
|
@ -52,6 +52,9 @@ int64_t Func_dayofyear::getIntVal(rowgroup::Row& row,
|
|||||||
uint32_t day = 0;
|
uint32_t day = 0;
|
||||||
int64_t val = 0;
|
int64_t val = 0;
|
||||||
|
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
switch (parm[0]->data()->resultType().colDataType)
|
switch (parm[0]->data()->resultType().colDataType)
|
||||||
{
|
{
|
||||||
case CalpontSystemCatalog::DATE:
|
case CalpontSystemCatalog::DATE:
|
||||||
@ -68,6 +71,17 @@ int64_t Func_dayofyear::getIntVal(rowgroup::Row& row,
|
|||||||
day = (uint32_t)((val >> 38) & 0x3f);
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
year = (uint32_t)((val >> 48) & 0xffff);
|
||||||
|
month = (uint32_t)((val >> 44) & 0xf);
|
||||||
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
|
break;
|
||||||
|
|
||||||
case CalpontSystemCatalog::CHAR:
|
case CalpontSystemCatalog::CHAR:
|
||||||
case CalpontSystemCatalog::TEXT:
|
case CalpontSystemCatalog::TEXT:
|
||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
|
@ -78,6 +78,7 @@ string Func_hex::getStrVal(rowgroup::Row& row,
|
|||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
case CalpontSystemCatalog::DATETIME:
|
case CalpontSystemCatalog::DATETIME:
|
||||||
case CalpontSystemCatalog::DATE:
|
case CalpontSystemCatalog::DATE:
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
{
|
{
|
||||||
const string& arg = parm[0]->data()->getStrVal(row, isNull);
|
const string& arg = parm[0]->data()->getStrVal(row, isNull);
|
||||||
scoped_array<char> hexPtr(new char[strlen(arg.c_str()) * 2 + 1]);
|
scoped_array<char> hexPtr(new char[strlen(arg.c_str()) * 2 + 1]);
|
||||||
|
@ -53,6 +53,8 @@ int64_t Func_last_day::getIntVal(rowgroup::Row& row,
|
|||||||
uint32_t month = 0;
|
uint32_t month = 0;
|
||||||
uint32_t day = 0;
|
uint32_t day = 0;
|
||||||
int64_t val = 0;
|
int64_t val = 0;
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
switch (parm[0]->data()->resultType().colDataType)
|
switch (parm[0]->data()->resultType().colDataType)
|
||||||
{
|
{
|
||||||
@ -70,6 +72,17 @@ int64_t Func_last_day::getIntVal(rowgroup::Row& row,
|
|||||||
day = (uint32_t)((val >> 38) & 0x3f);
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
year = (uint32_t)((val >> 48) & 0xffff);
|
||||||
|
month = (uint32_t)((val >> 44) & 0xf);
|
||||||
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
|
break;
|
||||||
|
|
||||||
case CalpontSystemCatalog::CHAR:
|
case CalpontSystemCatalog::CHAR:
|
||||||
case CalpontSystemCatalog::TEXT:
|
case CalpontSystemCatalog::TEXT:
|
||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
|
@ -48,6 +48,8 @@ int64_t Func_month::getIntVal(rowgroup::Row& row,
|
|||||||
CalpontSystemCatalog::ColType& op_ct)
|
CalpontSystemCatalog::ColType& op_ct)
|
||||||
{
|
{
|
||||||
int64_t val = 0;
|
int64_t val = 0;
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
switch (parm[0]->data()->resultType().colDataType)
|
switch (parm[0]->data()->resultType().colDataType)
|
||||||
{
|
{
|
||||||
@ -59,6 +61,15 @@ int64_t Func_month::getIntVal(rowgroup::Row& row,
|
|||||||
val = parm[0]->data()->getIntVal(row, isNull);
|
val = parm[0]->data()->getIntVal(row, isNull);
|
||||||
return (unsigned)((val >> 44) & 0xf);
|
return (unsigned)((val >> 44) & 0xf);
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
return (unsigned)((val >> 44) & 0xf);
|
||||||
|
break;
|
||||||
|
|
||||||
case CalpontSystemCatalog::CHAR:
|
case CalpontSystemCatalog::CHAR:
|
||||||
case CalpontSystemCatalog::TEXT:
|
case CalpontSystemCatalog::TEXT:
|
||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
|
@ -77,6 +77,8 @@ int64_t Func_monthname::getIntVal(rowgroup::Row& row,
|
|||||||
CalpontSystemCatalog::ColType& op_ct)
|
CalpontSystemCatalog::ColType& op_ct)
|
||||||
{
|
{
|
||||||
int64_t val = 0;
|
int64_t val = 0;
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
switch (parm[0]->data()->resultType().colDataType)
|
switch (parm[0]->data()->resultType().colDataType)
|
||||||
{
|
{
|
||||||
@ -88,6 +90,16 @@ int64_t Func_monthname::getIntVal(rowgroup::Row& row,
|
|||||||
val = parm[0]->data()->getIntVal(row, isNull);
|
val = parm[0]->data()->getIntVal(row, isNull);
|
||||||
return (unsigned)((val >> 44) & 0xf);
|
return (unsigned)((val >> 44) & 0xf);
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
return (unsigned)((val >> 44) & 0xf);
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
case CalpontSystemCatalog::CHAR:
|
case CalpontSystemCatalog::CHAR:
|
||||||
case CalpontSystemCatalog::TEXT:
|
case CalpontSystemCatalog::TEXT:
|
||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
|
@ -50,6 +50,8 @@ int64_t Func_quarter::getIntVal(rowgroup::Row& row,
|
|||||||
{
|
{
|
||||||
// try to cast to date/datetime
|
// try to cast to date/datetime
|
||||||
int64_t val = 0, month = 0;
|
int64_t val = 0, month = 0;
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
switch (parm[0]->data()->resultType().colDataType)
|
switch (parm[0]->data()->resultType().colDataType)
|
||||||
{
|
{
|
||||||
@ -63,6 +65,15 @@ int64_t Func_quarter::getIntVal(rowgroup::Row& row,
|
|||||||
month = (val >> 44) & 0xf;
|
month = (val >> 44) & 0xf;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
month = (uint32_t)((val >> 44) & 0xf);
|
||||||
|
break;
|
||||||
|
|
||||||
case CalpontSystemCatalog::CHAR:
|
case CalpontSystemCatalog::CHAR:
|
||||||
case CalpontSystemCatalog::TEXT:
|
case CalpontSystemCatalog::TEXT:
|
||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
|
@ -59,6 +59,9 @@ int64_t Func_to_days::getIntVal(rowgroup::Row& row,
|
|||||||
month = 0,
|
month = 0,
|
||||||
day = 0;
|
day = 0;
|
||||||
|
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case execplan::CalpontSystemCatalog::DATE:
|
case execplan::CalpontSystemCatalog::DATE:
|
||||||
@ -82,6 +85,21 @@ int64_t Func_to_days::getIntVal(rowgroup::Row& row,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
{
|
||||||
|
int64_t val;
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
year = (uint32_t)((val >> 48) & 0xffff);
|
||||||
|
month = (uint32_t)((val >> 44) & 0xf);
|
||||||
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
|
return helpers::calc_mysql_daynr(year, month, day);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case execplan::CalpontSystemCatalog::VARCHAR: // including CHAR'
|
case execplan::CalpontSystemCatalog::VARCHAR: // including CHAR'
|
||||||
case execplan::CalpontSystemCatalog::CHAR:
|
case execplan::CalpontSystemCatalog::CHAR:
|
||||||
case execplan::CalpontSystemCatalog::TEXT:
|
case execplan::CalpontSystemCatalog::TEXT:
|
||||||
|
@ -53,6 +53,8 @@ int64_t Func_week::getIntVal(rowgroup::Row& row,
|
|||||||
|
|
||||||
int64_t val = 0;
|
int64_t val = 0;
|
||||||
int16_t mode = 0;
|
int16_t mode = 0;
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
if (parm.size() > 1) // mode value
|
if (parm.size() > 1) // mode value
|
||||||
mode = parm[1]->data()->getIntVal(row, isNull);
|
mode = parm[1]->data()->getIntVal(row, isNull);
|
||||||
@ -73,6 +75,17 @@ int64_t Func_week::getIntVal(rowgroup::Row& row,
|
|||||||
day = (uint32_t)((val >> 38) & 0x3f);
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
year = (uint32_t)((val >> 48) & 0xffff);
|
||||||
|
month = (uint32_t)((val >> 44) & 0xf);
|
||||||
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
|
break;
|
||||||
|
|
||||||
case CalpontSystemCatalog::CHAR:
|
case CalpontSystemCatalog::CHAR:
|
||||||
case CalpontSystemCatalog::TEXT:
|
case CalpontSystemCatalog::TEXT:
|
||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
|
@ -52,6 +52,8 @@ int64_t Func_weekday::getIntVal(rowgroup::Row& row,
|
|||||||
uint32_t month = 0;
|
uint32_t month = 0;
|
||||||
uint32_t day = 0;
|
uint32_t day = 0;
|
||||||
int64_t val = 0;
|
int64_t val = 0;
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
switch (parm[0]->data()->resultType().colDataType)
|
switch (parm[0]->data()->resultType().colDataType)
|
||||||
{
|
{
|
||||||
@ -69,6 +71,17 @@ int64_t Func_weekday::getIntVal(rowgroup::Row& row,
|
|||||||
day = (uint32_t)((val >> 38) & 0x3f);
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
year = (uint32_t)((val >> 48) & 0xffff);
|
||||||
|
month = (uint32_t)((val >> 44) & 0xf);
|
||||||
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
|
break;
|
||||||
|
|
||||||
case CalpontSystemCatalog::CHAR:
|
case CalpontSystemCatalog::CHAR:
|
||||||
case CalpontSystemCatalog::TEXT:
|
case CalpontSystemCatalog::TEXT:
|
||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
|
@ -48,6 +48,8 @@ int64_t Func_year::getIntVal(rowgroup::Row& row,
|
|||||||
CalpontSystemCatalog::ColType& op_ct)
|
CalpontSystemCatalog::ColType& op_ct)
|
||||||
{
|
{
|
||||||
int64_t val = 0;
|
int64_t val = 0;
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
switch (parm[0]->data()->resultType().colDataType)
|
switch (parm[0]->data()->resultType().colDataType)
|
||||||
{
|
{
|
||||||
@ -59,6 +61,15 @@ int64_t Func_year::getIntVal(rowgroup::Row& row,
|
|||||||
val = parm[0]->data()->getIntVal(row, isNull);
|
val = parm[0]->data()->getIntVal(row, isNull);
|
||||||
return (unsigned)((val >> 48) & 0xffff);
|
return (unsigned)((val >> 48) & 0xffff);
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
return (unsigned)((val >> 48) & 0xffff);
|
||||||
|
break;
|
||||||
|
|
||||||
case CalpontSystemCatalog::CHAR:
|
case CalpontSystemCatalog::CHAR:
|
||||||
case CalpontSystemCatalog::TEXT:
|
case CalpontSystemCatalog::TEXT:
|
||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
|
@ -54,6 +54,8 @@ int64_t Func_yearweek::getIntVal(rowgroup::Row& row,
|
|||||||
|
|
||||||
int64_t val = 0;
|
int64_t val = 0;
|
||||||
int16_t mode = 0; // default to 2
|
int16_t mode = 0; // default to 2
|
||||||
|
DateTime aDateTime;
|
||||||
|
Time aTime;
|
||||||
|
|
||||||
if (parm.size() > 1) // mode value
|
if (parm.size() > 1) // mode value
|
||||||
mode = parm[1]->data()->getIntVal(row, isNull);
|
mode = parm[1]->data()->getIntVal(row, isNull);
|
||||||
@ -76,6 +78,17 @@ int64_t Func_yearweek::getIntVal(rowgroup::Row& row,
|
|||||||
day = (uint32_t)((val >> 38) & 0x3f);
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Time adds to now() and then gets value
|
||||||
|
case CalpontSystemCatalog::TIME:
|
||||||
|
aDateTime = static_cast<DateTime>(nowDatetime());
|
||||||
|
aTime = parm[0]->data()->getTimeIntVal(row, isNull);
|
||||||
|
aTime.day = 0;
|
||||||
|
val = addTime(aDateTime, aTime);
|
||||||
|
year = (uint32_t)((val >> 48) & 0xffff);
|
||||||
|
month = (uint32_t)((val >> 44) & 0xf);
|
||||||
|
day = (uint32_t)((val >> 38) & 0x3f);
|
||||||
|
break;
|
||||||
|
|
||||||
case CalpontSystemCatalog::CHAR:
|
case CalpontSystemCatalog::CHAR:
|
||||||
case CalpontSystemCatalog::TEXT:
|
case CalpontSystemCatalog::TEXT:
|
||||||
case CalpontSystemCatalog::VARCHAR:
|
case CalpontSystemCatalog::VARCHAR:
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
#include "joblisttypes.h"
|
#include "joblisttypes.h"
|
||||||
@ -145,6 +147,189 @@ int64_t Func::intToTime(int64_t i)
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t Func::nowDatetime()
|
||||||
|
{
|
||||||
|
DateTime result;
|
||||||
|
boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();
|
||||||
|
result.year = now.date().year();
|
||||||
|
result.month = now.date().month();
|
||||||
|
result.day = now.date().day();
|
||||||
|
result.hour = now.time_of_day().hours();
|
||||||
|
result.minute = now.time_of_day().minutes();
|
||||||
|
result.second = now.time_of_day().seconds();
|
||||||
|
result.msecond = now.time_of_day().total_microseconds();
|
||||||
|
|
||||||
|
return (int64_t) * (reinterpret_cast<int64_t*>(&result));
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t Func::addTime(DateTime& dt1, Time& dt2)
|
||||||
|
{
|
||||||
|
DateTime dt;
|
||||||
|
dt.year = 0;
|
||||||
|
dt.month = 0;
|
||||||
|
dt.day = 0;
|
||||||
|
dt.hour = 0;
|
||||||
|
dt.minute = 0;
|
||||||
|
dt.second = 0;
|
||||||
|
dt.msecond = 0;
|
||||||
|
|
||||||
|
int64_t month, day, hour, min, sec, msec, tmp;
|
||||||
|
msec = (signed)(dt1.msecond + dt2.msecond);
|
||||||
|
dt.msecond = tmp = msec % 1000000;
|
||||||
|
|
||||||
|
if (tmp < 0)
|
||||||
|
{
|
||||||
|
dt.msecond = tmp + 1000000;
|
||||||
|
dt2.second--;
|
||||||
|
}
|
||||||
|
|
||||||
|
sec = (signed)(dt1.second + dt2.second + msec / 1000000);
|
||||||
|
dt.second = tmp = sec % 60;
|
||||||
|
|
||||||
|
if (tmp < 0)
|
||||||
|
{
|
||||||
|
dt.second = tmp + 60;
|
||||||
|
dt2.minute--;
|
||||||
|
}
|
||||||
|
|
||||||
|
min = (signed)(dt1.minute + dt2.minute + sec / 60);
|
||||||
|
dt.minute = tmp = min % 60;
|
||||||
|
|
||||||
|
if (tmp < 0)
|
||||||
|
{
|
||||||
|
dt.minute = tmp + 60;
|
||||||
|
dt2.hour--;
|
||||||
|
}
|
||||||
|
|
||||||
|
hour = (signed)(dt1.hour + dt2.hour + min / 60);
|
||||||
|
|
||||||
|
if ((hour < 0) || (hour > 23))
|
||||||
|
{
|
||||||
|
dt2.day = hour / 24;
|
||||||
|
hour = hour % 24;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hour < 0)
|
||||||
|
{
|
||||||
|
dt.hour = hour + 24;
|
||||||
|
dt2.day--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dt.hour = hour;
|
||||||
|
}
|
||||||
|
|
||||||
|
day = (signed)(dt1.day + dt2.day);
|
||||||
|
|
||||||
|
|
||||||
|
if (isLeapYear(dt1.year) && dt1.month == 2)
|
||||||
|
day--;
|
||||||
|
|
||||||
|
month = dt1.month;
|
||||||
|
int addyear = 0;
|
||||||
|
|
||||||
|
if (day < 0)
|
||||||
|
{
|
||||||
|
int monthSave = month;
|
||||||
|
|
||||||
|
while (day <= 0)
|
||||||
|
{
|
||||||
|
month = (month == 1 ? 12 : month - 1);
|
||||||
|
|
||||||
|
for (; day <= 0 && month > 0; month--)
|
||||||
|
day += getDaysInMonth(month, dt1.year);
|
||||||
|
|
||||||
|
month++;
|
||||||
|
// month=12;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( month > monthSave )
|
||||||
|
addyear--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int monthSave = month;
|
||||||
|
|
||||||
|
while (day > getDaysInMonth(month, dt1.year))
|
||||||
|
{
|
||||||
|
for (; day > getDaysInMonth(month, dt1.year) && month <= 12; month++)
|
||||||
|
day -= getDaysInMonth(month, dt1.year);
|
||||||
|
|
||||||
|
if (month > 12)
|
||||||
|
month = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( month < monthSave )
|
||||||
|
addyear++;
|
||||||
|
}
|
||||||
|
|
||||||
|
dt.day = day;
|
||||||
|
dt.month = month;
|
||||||
|
dt.year = dt1.year + addyear;
|
||||||
|
|
||||||
|
return *(reinterpret_cast<int64_t*>(&dt));
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t Func::addTime(Time& dt1, Time& dt2)
|
||||||
|
{
|
||||||
|
Time dt;
|
||||||
|
dt.is_neg = false;
|
||||||
|
dt.hour = 0;
|
||||||
|
dt.minute = 0;
|
||||||
|
dt.second = 0;
|
||||||
|
dt.msecond = 0;
|
||||||
|
|
||||||
|
int64_t min, sec, msec, tmp;
|
||||||
|
msec = (signed)(dt1.msecond + dt2.msecond);
|
||||||
|
dt.msecond = tmp = msec % 1000000;
|
||||||
|
|
||||||
|
if (tmp < 0)
|
||||||
|
{
|
||||||
|
dt.msecond = tmp + 1000000;
|
||||||
|
dt2.second--;
|
||||||
|
}
|
||||||
|
|
||||||
|
sec = (signed)(dt1.second + dt2.second + msec / 1000000);
|
||||||
|
dt.second = tmp = sec % 60;
|
||||||
|
|
||||||
|
if (tmp < 0)
|
||||||
|
{
|
||||||
|
dt.second = tmp + 60;
|
||||||
|
dt2.minute--;
|
||||||
|
}
|
||||||
|
|
||||||
|
min = (signed)(dt1.minute + dt2.minute + sec / 60);
|
||||||
|
dt.minute = tmp = min % 60;
|
||||||
|
|
||||||
|
if (tmp < 0)
|
||||||
|
{
|
||||||
|
dt.minute = tmp + 60;
|
||||||
|
dt2.hour--;
|
||||||
|
}
|
||||||
|
|
||||||
|
dt.hour = tmp = (signed)(dt1.hour + dt2.hour + min / 60);
|
||||||
|
|
||||||
|
// Saturation
|
||||||
|
if (tmp > 838)
|
||||||
|
{
|
||||||
|
dt.hour = 838;
|
||||||
|
dt.minute = 59;
|
||||||
|
dt.second = 59;
|
||||||
|
dt.msecond = 999999;
|
||||||
|
}
|
||||||
|
else if (tmp < -838)
|
||||||
|
{
|
||||||
|
dt.is_neg = true;
|
||||||
|
dt.hour = -838;
|
||||||
|
dt.minute = 59;
|
||||||
|
dt.second = 59;
|
||||||
|
dt.msecond = 999999;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *(reinterpret_cast<int64_t*>(&dt));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
string Func::intToString(int64_t i)
|
string Func::intToString(int64_t i)
|
||||||
{
|
{
|
||||||
return helpers::intToString(i);
|
return helpers::intToString(i);
|
||||||
|
@ -34,6 +34,9 @@
|
|||||||
|
|
||||||
#include "calpontsystemcatalog.h"
|
#include "calpontsystemcatalog.h"
|
||||||
|
|
||||||
|
#include "dataconvert.h"
|
||||||
|
using namespace dataconvert;
|
||||||
|
|
||||||
namespace rowgroup
|
namespace rowgroup
|
||||||
{
|
{
|
||||||
class Row;
|
class Row;
|
||||||
@ -162,6 +165,10 @@ protected:
|
|||||||
virtual std::string intToString(int64_t);
|
virtual std::string intToString(int64_t);
|
||||||
virtual std::string doubleToString(double);
|
virtual std::string doubleToString(double);
|
||||||
|
|
||||||
|
virtual int64_t nowDatetime();
|
||||||
|
virtual int64_t addTime(DateTime& dt1, Time& dt2);
|
||||||
|
virtual int64_t addTime(Time& dt1, Time& dt2);
|
||||||
|
|
||||||
std::string fFuncName;
|
std::string fFuncName;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Reference in New Issue
Block a user