Commit e9f171b4 authored by Alexander Barkov's avatar Alexander Barkov

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

parent 7efcc279
...@@ -1368,5 +1368,17 @@ Warning 1292 Incorrect datetime value: '1995.0000000' ...@@ -1368,5 +1368,17 @@ Warning 1292 Incorrect datetime value: '1995.0000000'
Note 1003 select `test`.`t1`.`f` AS `f` from `test`.`t1` where '00:00:00.000000' between `test`.`t1`.`f` and <cache>('23:59:59') Note 1003 select `test`.`t1`.`f` AS `f` from `test`.`t1` where '00:00:00.000000' between `test`.`t1`.`f` and <cache>('23:59:59')
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-27098 Subquery using the ALL keyword on TIME columns produces a wrong result
#
CREATE TABLE t1 (d TIME);
INSERT INTO t1 VALUES ('120:00:00'), ('20:00:00'), ('-120:00:00'), ('-220:00:00');
SELECT * FROM t1 WHERE d >= ALL (SELECT * FROM t1);
d
120:00:00
SELECT * FROM t1 WHERE d <= ALL (SELECT * FROM t1);
d
-220:00:00
DROP TABLE t1;
#
# End of 10.2 tests # End of 10.2 tests
# #
...@@ -823,6 +823,16 @@ INSERT INTO t1 VALUES ('10:10:10'),('20:20:20'); ...@@ -823,6 +823,16 @@ INSERT INTO t1 VALUES ('10:10:10'),('20:20:20');
EXPLAIN EXTENDED SELECT * FROM t1 WHERE 1995.0000000 BETWEEN f AND '23:59:59'; EXPLAIN EXTENDED SELECT * FROM t1 WHERE 1995.0000000 BETWEEN f AND '23:59:59';
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-27098 Subquery using the ALL keyword on TIME columns produces a wrong result
--echo #
CREATE TABLE t1 (d TIME);
INSERT INTO t1 VALUES ('120:00:00'), ('20:00:00'), ('-120:00:00'), ('-220:00:00');
SELECT * FROM t1 WHERE d >= ALL (SELECT * FROM t1);
SELECT * FROM t1 WHERE d <= ALL (SELECT * FROM t1);
DROP TABLE t1;
--echo # --echo #
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #
...@@ -3394,7 +3394,7 @@ int select_max_min_finder_subselect::send_data(List<Item> &items) ...@@ -3394,7 +3394,7 @@ int select_max_min_finder_subselect::send_data(List<Item> &items)
if (!cache) if (!cache)
{ {
cache= Item_cache::get_cache(thd, val_item); cache= Item_cache::get_cache(thd, val_item);
switch (val_item->result_type()) { switch (val_item->cmp_type()) {
case REAL_RESULT: case REAL_RESULT:
op= &select_max_min_finder_subselect::cmp_real; op= &select_max_min_finder_subselect::cmp_real;
break; break;
...@@ -3407,8 +3407,13 @@ int select_max_min_finder_subselect::send_data(List<Item> &items) ...@@ -3407,8 +3407,13 @@ int select_max_min_finder_subselect::send_data(List<Item> &items)
case DECIMAL_RESULT: case DECIMAL_RESULT:
op= &select_max_min_finder_subselect::cmp_decimal; op= &select_max_min_finder_subselect::cmp_decimal;
break; break;
case ROW_RESULT:
case TIME_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 // This case should never be choosen
DBUG_ASSERT(0); DBUG_ASSERT(0);
op= 0; op= 0;
...@@ -3453,6 +3458,22 @@ bool select_max_min_finder_subselect::cmp_int() ...@@ -3453,6 +3458,22 @@ bool select_max_min_finder_subselect::cmp_int()
return (val1 < val2); 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() bool select_max_min_finder_subselect::cmp_decimal()
{ {
Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0); Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0);
......
...@@ -5396,6 +5396,7 @@ class select_max_min_finder_subselect :public select_subselect ...@@ -5396,6 +5396,7 @@ class select_max_min_finder_subselect :public select_subselect
bool cmp_int(); bool cmp_int();
bool cmp_decimal(); bool cmp_decimal();
bool cmp_str(); bool cmp_str();
bool cmp_time();
}; };
/* EXISTS subselect interface class */ /* EXISTS subselect interface class */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment