1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-07 00:04:31 +03:00

MDEV-27098 Subquery using the ALL keyword on TIME columns produces a wrong result

This commit is contained in:
Alexander Barkov
2021-11-20 21:49:25 +04:00
parent 7efcc2794d
commit e9f171b4fe
4 changed files with 46 additions and 2 deletions

View File

@@ -3394,7 +3394,7 @@ int select_max_min_finder_subselect::send_data(List<Item> &items)
if (!cache)
{
cache= Item_cache::get_cache(thd, val_item);
switch (val_item->result_type()) {
switch (val_item->cmp_type()) {
case REAL_RESULT:
op= &select_max_min_finder_subselect::cmp_real;
break;
@@ -3407,8 +3407,13 @@ int select_max_min_finder_subselect::send_data(List<Item> &items)
case DECIMAL_RESULT:
op= &select_max_min_finder_subselect::cmp_decimal;
break;
case ROW_RESULT:
case TIME_RESULT:
if (val_item->field_type() == MYSQL_TYPE_TIME)
op= &select_max_min_finder_subselect::cmp_time;
else
op= &select_max_min_finder_subselect::cmp_str;
break;
case ROW_RESULT:
// This case should never be choosen
DBUG_ASSERT(0);
op= 0;
@@ -3453,6 +3458,22 @@ bool select_max_min_finder_subselect::cmp_int()
return (val1 < val2);
}
bool select_max_min_finder_subselect::cmp_time()
{
Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0);
longlong val1= cache->val_time_packed(), val2= maxmin->val_time_packed();
/* Ignore NULLs for ANY and keep them for ALL subqueries */
if (cache->null_value)
return (is_all && !maxmin->null_value) || (!is_all && maxmin->null_value);
if (maxmin->null_value)
return !is_all;
if (fmax)
return(val1 > val2);
return (val1 < val2);
}
bool select_max_min_finder_subselect::cmp_decimal()
{
Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0);