Commit 27bf57fd authored by Oleksandr Byelkin's avatar Oleksandr Byelkin

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.
parent 2291f8ef
...@@ -6876,5 +6876,16 @@ SELECT 1 FROM (SELECT count(((SELECT i1 FROM v1))) FROM v1) dt ; ...@@ -6876,5 +6876,16 @@ SELECT 1 FROM (SELECT count(((SELECT i1 FROM v1))) FROM v1) dt ;
drop view v1; drop view v1;
drop table t1; drop table t1;
# #
# MDEV-26299: Some views force server (and mysqldump) to generate
# invalid SQL for their definitions
#
create view v1 as
select * from
(select
"12345678901234567890123456789012345678901234567890123456789012345") as t1;
drop view v1;
CREATE VIEW v1 AS select `t1`.`12345678901234567890123456789012345678901234567890123456789012345` AS `Name_exp_1` from (select '12345678901234567890123456789012345678901234567890123456789012345') `t1`;
drop view v1;
#
# End of 10.2 tests # End of 10.2 tests
# #
...@@ -6608,6 +6608,25 @@ SELECT 1 FROM (SELECT count(((SELECT i1 FROM v1))) FROM v1) dt ; ...@@ -6608,6 +6608,25 @@ SELECT 1 FROM (SELECT count(((SELECT i1 FROM v1))) FROM v1) dt ;
drop view v1; drop view v1;
drop table t1; drop table t1;
--echo #
--echo # MDEV-26299: Some views force server (and mysqldump) to generate
--echo # invalid SQL for their definitions
--echo #
create view v1 as
select * from
(select
"12345678901234567890123456789012345678901234567890123456789012345") as t1;
let $definition=`select VIEW_DEFINITION from information_schema.views where TABLE_NAME="v1"`;
drop view v1;
eval CREATE VIEW v1 AS $definition;
drop view v1;
--echo # --echo #
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #
...@@ -25804,6 +25804,11 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type) ...@@ -25804,6 +25804,11 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type)
//Item List //Item List
bool first= 1; 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); List_iterator_fast<Item> it(item_list);
Item *item; Item *item;
while ((item= it++)) while ((item= it++))
...@@ -25813,7 +25818,8 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type) ...@@ -25813,7 +25818,8 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type)
else else
str->append(','); 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 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) ...@@ -25822,7 +25828,20 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type)
item->print(str, query_type); item->print(str, query_type);
} }
else else
{
/*
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); item->print_item_w_name(str, query_type);
else
item->print(str, query_type);
}
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment