1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-29 08:21:15 +03:00

Merge pull request #494 from mariadb-corporation/MCOL-1433

MCOL-1433 Fix several functions for TIME handling
This commit is contained in:
David.Hall
2018-06-11 10:20:49 -05:00
committed by GitHub
18 changed files with 380 additions and 174 deletions

View File

@ -36,180 +36,6 @@ using namespace dataconvert;
#include "functor_dtm.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
{