1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-01 03:47:19 +03:00

MDEV-25080 Fix incorrect view names in printed queries

When printing Item_direct_view_ref the printed field name must be
complemented with the view name/derived table alias.
For example, for "SELECT a FROM (SELECT a FROM t1) q" field `a`
in the select list must be printed as `q`.`a`.

But if the view was merged then the initial `q` does not make sense
any more so field `a` must be printed  as `t1`.`a`
This commit is contained in:
Oleg Smirnov
2023-02-09 14:09:31 +07:00
committed by Sergei Golubchik
parent b5507c738f
commit 47e29a2ff4
6 changed files with 26 additions and 5 deletions

View File

@ -2723,7 +2723,7 @@ EXPLAIN EXTENDED DELETE FROM v1 WHERE a < 4;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 3 100.00 Using where
Warnings:
Note 1003 /* select#1 */ delete from `test`.`t1` using dual where `test`.`t1`.`a` < 4
Note 1003 /* select#1 */ delete from `test`.`t1` using dual where `v1`.`a` < 4
# Status of EXPLAIN EXTENDED query
Variable_name Value
Handler_read_key 3

View File

@ -59,7 +59,7 @@ select * from v1 {
}
},
{
"expanded_query": "/* select#1 */ select t1.a AS a,t1.b AS b from v1"
"expanded_query": "/* select#1 */ select v1.a AS a,v1.b AS b from v1"
}
]
}
@ -230,7 +230,7 @@ select * from (select * from t1 where t1.a=1)q {
}
},
{
"expanded_query": "/* select#1 */ select t1.a AS a,t1.b AS b from (/* select#2 */ select t1.a AS a,t1.b AS b from t1 where t1.a = 1) q"
"expanded_query": "/* select#1 */ select q.a AS a,q.b AS b from (/* select#2 */ select t1.a AS a,t1.b AS b from t1 where t1.a = 1) q"
}
]
}
@ -695,7 +695,7 @@ explain select * from v2 {
}
},
{
"expanded_query": "/* select#1 */ select t2.a AS a from v2"
"expanded_query": "/* select#1 */ select v2.a AS a from v2"
}
]
}

View File

@ -197,7 +197,7 @@ select * from db1.v1 {
}
},
{
"expanded_query": "/* select#1 */ select db1.t1.a AS a from v1"
"expanded_query": "/* select#1 */ select v1.a AS a from v1"
}
]
}

View File

@ -381,6 +381,7 @@ connection slave;
DROP TABLES federated.t1, federated.t2, federated.t3, federated.t10,
federated.t11;
--echo # MDEV-25080: Allow pushdown of queries involving UNIONs
--echo # in outer select to foreign engines
--echo #

View File

@ -10866,6 +10866,25 @@ table_map Item_direct_view_ref::not_null_tables() const
return get_null_ref_table()->map;
}
void Item_direct_view_ref::print(String *str, enum_query_type query_type)
{
/*
If the view/derived table was not merged then this field name must
be complemented with the view name/derived table alias.
For example, for "SELECT a FROM (SELECT a FROM t1) q" field `a` in the
select list must be printed as `q`.`a`.
Ancestor class Item_ident contains the correct table_name for that case.
But if the view was merged then the initial `q` does not make sense
any more so print the Item_ref contents. Field `a` will be printed
as `t1`.`a` then
*/
if (!view->merged)
Item_ident::print(str, query_type);
else
Item_ref::print(str, query_type);
}
/*
we add RAND_TABLE_BIT to prevent moving this item from HAVING to WHERE
*/

View File

@ -6238,6 +6238,7 @@ public:
Item *field_transformer_for_having_pushdown(THD *, uchar *) override
{ return this; }
Item *remove_item_direct_ref() override { return this; }
void print(String *str, enum_query_type query_type) override;
};