mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-27098 Subquery using the ALL keyword on TIME columns produces a wrong result
This commit is contained in:
@ -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')
|
||||
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
|
||||
#
|
||||
|
@ -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';
|
||||
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 # End of 10.2 tests
|
||||
--echo #
|
||||
|
@ -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);
|
||||
|
@ -5396,6 +5396,7 @@ public:
|
||||
bool cmp_int();
|
||||
bool cmp_decimal();
|
||||
bool cmp_str();
|
||||
bool cmp_time();
|
||||
};
|
||||
|
||||
/* EXISTS subselect interface class */
|
||||
|
Reference in New Issue
Block a user