1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

port of fixes for bug-20577 and 46362 for TO_SECONDS

This commit is contained in:
Mattias Jonsson
2009-10-19 13:40:08 +02:00
parent 49c446059c
commit 4ee04f9bfe
3 changed files with 378 additions and 9 deletions

View File

@@ -944,8 +944,29 @@ longlong Item_func_to_days::val_int()
longlong Item_func_to_seconds::val_int_endpoint(bool left_endp,
bool *incl_endp)
{
longlong res= val_int();
return null_value ? LONGLONG_MIN : res;
DBUG_ASSERT(fixed == 1);
MYSQL_TIME ltime;
longlong seconds;
longlong days;
int dummy; /* unused */
if (get_arg0_date(&ltime, TIME_FUZZY_DATE))
{
/* got NULL, leave the incl_endp intact */
return LONGLONG_MIN;
}
seconds= ltime.hour * 3600L + ltime.minute * 60 + ltime.second;
seconds= ltime.neg ? -seconds : seconds;
days= (longlong) calc_daynr(ltime.year, ltime.month, ltime.day);
seconds+= days * 24L * 3600L;
/* Set to NULL if invalid date, but keep the value */
null_value= check_date(&ltime,
(ltime.year || ltime.month || ltime.day),
(TIME_NO_ZERO_IN_DATE | TIME_NO_ZERO_DATE),
&dummy);
/*
Even if the evaluation return NULL, seconds is useful for pruning
*/
return seconds;
}
longlong Item_func_to_seconds::val_int()
@@ -956,10 +977,10 @@ longlong Item_func_to_seconds::val_int()
longlong days;
if (get_arg0_date(&ltime, TIME_NO_ZERO_DATE))
return 0;
seconds=ltime.hour*3600L+ltime.minute*60+ltime.second;
seconds= ltime.hour * 3600L + ltime.minute * 60 + ltime.second;
seconds=ltime.neg ? -seconds : seconds;
days= (longlong) calc_daynr(ltime.year,ltime.month,ltime.day);
return (seconds + days * (24L * 3600L));
days= (longlong) calc_daynr(ltime.year, ltime.month, ltime.day);
return seconds + days * 24L * 3600L;
}
/*
@@ -992,10 +1013,9 @@ enum_monotonicity_info Item_func_to_seconds::get_monotonicity_info() const
{
if (args[0]->type() == Item::FIELD_ITEM)
{
if (args[0]->field_type() == MYSQL_TYPE_DATE)
return MONOTONIC_STRICT_INCREASING;
if (args[0]->field_type() == MYSQL_TYPE_DATETIME)
return MONOTONIC_INCREASING;
if (args[0]->field_type() == MYSQL_TYPE_DATE ||
args[0]->field_type() == MYSQL_TYPE_DATETIME)
return MONOTONIC_STRICT_INCREASING_NOT_NULL;
}
return NON_MONOTONIC;
}