1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-27 18:02:13 +03:00

MDEV-26299: Some views force server (and mysqldump) to generate invalid SQL for their definitions

Do not print illegal table field names for non-top-level SELECT list,
they will not be refered in any case but create problem for parsing
of printed result.
This commit is contained in:
Oleksandr Byelkin
2021-10-01 14:46:22 +02:00
parent 2291f8ef73
commit 27bf57fd6d
3 changed files with 51 additions and 2 deletions

View File

@ -25804,6 +25804,11 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type)
//Item List
bool first= 1;
/*
outer_select() can not be used here because it is for name resolution
and will return NULL at any end of name resolution chain (view/derived)
*/
bool top_level= (get_master()->get_master() == 0);
List_iterator_fast<Item> it(item_list);
Item *item;
while ((item= it++))
@ -25813,7 +25818,8 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type)
else
str->append(',');
if (is_subquery_function() && item->is_autogenerated_name)
if ((is_subquery_function() && item->is_autogenerated_name) ||
!item->name)
{
/*
Do not print auto-generated aliases in subqueries. It has no purpose
@ -25822,7 +25828,20 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type)
item->print(str, query_type);
}
else
item->print_item_w_name(str, query_type);
{
/*
Do not print illegal names (if it is not top level SELECT).
Top level view checked (and correct name are assigned),
other cases of top level SELECT are not important, because
it is not "table field".
*/
if (top_level ||
!item->is_autogenerated_name ||
!check_column_name(item->name))
item->print_item_w_name(str, query_type);
else
item->print(str, query_type);
}
}
/*