Fixed bug mdev-5382

When marking used columns the function find_field_in_table_ref() erroneously
called the walk method for the real item behind a view/derived table field
with the second parameter set to TRUE.
This erroneous code was introduced in 2006.
This commit is contained in:
Igor Babaev 2013-12-05 11:13:20 -08:00
parent 62e959437e
commit ccf5871d7b
3 changed files with 33 additions and 2 deletions

View File

@ -1738,4 +1738,19 @@ i
6
DROP VIEW v1;
DROP TABLE t1;
#
# mdev-5382: UNION with ORDER BY in subselect
#
CREATE TABLE t1 (a int DEFAULT NULL);
INSERT INTO t1 VALUES (2), (4);
CREATE TABLE t2 (b int DEFAULT NULL);
INSERT INTO t2 VALUES (1), (3);
SELECT c1 FROM (SELECT (SELECT a FROM t1 WHERE t1.a <= t2.b
UNION ALL
SELECT a FROM t1 WHERE t1.a+3<= t2.b
ORDER BY a DESC) AS c1 FROM t2) t3;
c1
NULL
2
DROP TABLE t1,t2;
End of 5.3 tests

View File

@ -1227,5 +1227,21 @@ deallocate prepare stmt1;
DROP VIEW v1;
DROP TABLE t1;
--echo #
--echo # mdev-5382: UNION with ORDER BY in subselect
--echo #
CREATE TABLE t1 (a int DEFAULT NULL);
INSERT INTO t1 VALUES (2), (4);
CREATE TABLE t2 (b int DEFAULT NULL);
INSERT INTO t2 VALUES (1), (3);
SELECT c1 FROM (SELECT (SELECT a FROM t1 WHERE t1.a <= t2.b
UNION ALL
SELECT a FROM t1 WHERE t1.a+3<= t2.b
ORDER BY a DESC) AS c1 FROM t2) t3;
DROP TABLE t1,t2;
--echo End of 5.3 tests

View File

@ -6429,9 +6429,9 @@ find_field_in_table_ref(THD *thd, TABLE_LIST *table_list,
else
{
if (thd->mark_used_columns == MARK_COLUMNS_READ)
it->walk(&Item::register_field_in_read_map, 1, (uchar *) 0);
it->walk(&Item::register_field_in_read_map, 0, (uchar *) 0);
else
it->walk(&Item::register_field_in_write_map, 1, (uchar *) 0);
it->walk(&Item::register_field_in_write_map, 0, (uchar *) 0);
}
}
else