mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-8755 Equal field propagation is not performed any longer for the IN list when multiple comparison types
This commit is contained in:
@ -812,3 +812,27 @@ EXECUTE s;
|
|||||||
1
|
1
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
# End of 5.3 tests
|
# End of 5.3 tests
|
||||||
|
#
|
||||||
|
# MDEV-8755 Equal field propagation is not performed any longer for the IN list when multiple comparison types
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT);
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
# Ok to propagate equalities into the left IN argument in case of a single comparison type
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1 AND a IN (1,2,3);
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`a` = 1)
|
||||||
|
# Ok to propagate equalities into IN () list, even if multiple comparison types
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1 AND 1 IN (1,a,'3');
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`a` = 1)
|
||||||
|
# Not Ok to propagate equalities into the left IN argument in case of multiple comparison types
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1 AND a IN (1,2,'3');
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where ((`test`.`t1`.`a` = 1) and (`test`.`t1`.`a` in (1,2,'3')))
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -606,3 +606,16 @@ EXECUTE s;
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo # End of 5.3 tests
|
--echo # End of 5.3 tests
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-8755 Equal field propagation is not performed any longer for the IN list when multiple comparison types
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1 (a INT);
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
--echo # Ok to propagate equalities into the left IN argument in case of a single comparison type
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1 AND a IN (1,2,3);
|
||||||
|
--echo # Ok to propagate equalities into IN () list, even if multiple comparison types
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1 AND 1 IN (1,a,'3');
|
||||||
|
--echo # Not Ok to propagate equalities into the left IN argument in case of multiple comparison types
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1 AND a IN (1,2,'3');
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -1438,18 +1438,18 @@ public:
|
|||||||
Item* propagate_equal_fields(THD *thd, const Context &ctx, COND_EQUAL *cond)
|
Item* propagate_equal_fields(THD *thd, const Context &ctx, COND_EQUAL *cond)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
TODO: enable propagation of the args[i>0] arguments even if
|
|
||||||
!arg_types_compatible. See MDEV-8755.
|
|
||||||
Note, we pass ANY_SUBST, this makes sure that non of the args
|
Note, we pass ANY_SUBST, this makes sure that non of the args
|
||||||
will be replaced to a zero-filled Item_string.
|
will be replaced to a zero-filled Item_string.
|
||||||
Such a change would require rebuilding of cmp_items.
|
Such a change would require rebuilding of cmp_items.
|
||||||
*/
|
*/
|
||||||
if (arg_types_compatible)
|
Context cmpctx(ANY_SUBST, m_compare_type,
|
||||||
Item_args::propagate_equal_fields(thd,
|
Item_func_in::compare_collation());
|
||||||
Context(ANY_SUBST,
|
for (uint i= 0; i < arg_count; i++)
|
||||||
m_compare_type,
|
{
|
||||||
compare_collation()),
|
if (arg_types_compatible || i > 0)
|
||||||
cond);
|
args[i]->propagate_equal_fields_and_change_item_tree(thd, cmpctx,
|
||||||
|
cond, &args[i]);
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
virtual void print(String *str, enum_query_type query_type);
|
virtual void print(String *str, enum_query_type query_type);
|
||||||
|
Reference in New Issue
Block a user