mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
f502deac11
The problem is that not all column names retrieved from a SELECT statement can be used as view column names due to length and format restrictions. The server failed to properly check the conformity of those automatically generated column names before storing the final view definition on disk. Since columns retrieved from a SELECT statement can be anything ranging from functions to constants values of any format and length, the solution is to rewrite to a pre-defined format any names that are not acceptable as a view column name. The name is rewritten to "Name_exp_%u" where %u translates to the position of the column. To avoid this conversion scheme, define explict names for the view columns via the column_list clause. Also, aliases are now only generated for top level statements. mysql-test/include/view_alias.inc: Add test case for Bug#40277 mysql-test/r/compare.result: Bug#40277: SHOW CREATE VIEW returns invalid SQL mysql-test/r/group_by.result: Bug#40277: SHOW CREATE VIEW returns invalid SQL mysql-test/r/ps.result: Bug#40277: SHOW CREATE VIEW returns invalid SQL mysql-test/r/subselect.result: Bug#40277: SHOW CREATE VIEW returns invalid SQL mysql-test/r/subselect3.result: Bug#40277: SHOW CREATE VIEW returns invalid SQL mysql-test/r/type_datetime.result: Bug#40277: SHOW CREATE VIEW returns invalid SQL mysql-test/r/union.result: Bug#40277: SHOW CREATE VIEW returns invalid SQL mysql-test/r/view.result: Add test case result for Bug#40277 mysql-test/r/view_alias.result: Add test case result for Bug#40277 mysql-test/t/view_alias.test: Add test case for Bug#40277 sql/sql_view.cc: Check if auto generated column names are conforming. Also, the make_unique_view_field_name function is not used as it uses the original name to construct a new one, which does not work if the name is invalid.
111 lines
6.2 KiB
Text
111 lines
6.2 KiB
Text
#
|
|
# Bug#40277 SHOW CREATE VIEW returns invalid SQL
|
|
# Bug#41999 SHOW CREATE VIEW returns invalid SQL if subquery is used in SELECT list
|
|
#
|
|
# 65 characters exceed the maximum length of a column identifier. The system cannot derive the name from statement.
|
|
# Constant with length = 65 . Expect to get the identifier 'Name_exp_1'.
|
|
CREATE VIEW v1 AS SELECT '<--- 65 char including the arrows --->';
|
|
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1';
|
|
COLUMN_NAME
|
|
Name_exp_1
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select '<--- 65 char including the arrows --->' AS `Name_exp_1`;
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select '<--- 65 char including the arrows --->' AS `Name_exp_1`;
|
|
DROP VIEW v1;
|
|
# Subquery with length = 65 . Expect to get the identifier 'Name_exp_1'.
|
|
# Attention: Identifier for the column within the subquery will be not generated.
|
|
CREATE VIEW v1 AS SELECT (SELECT '<--- 54 char including the arrows (+ 11 outside) -->');
|
|
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1';
|
|
COLUMN_NAME
|
|
Name_exp_1
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select (select '<--- 54 char including the arrows (+ 11 outside) -->') AS `Name_exp_1`;
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select (select '<--- 54 char including the arrows (+ 11 outside) -->') AS `Name_exp_1`;
|
|
DROP VIEW v1;
|
|
# -----------------------------------------------------------------------------------------------------------------
|
|
# 64 characters are the maximum length of a column identifier. The system can derive the name from the statement.
|
|
CREATE VIEW v1 AS SELECT '<--- 64 char including the arrows --->';
|
|
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1';
|
|
COLUMN_NAME
|
|
<--- 64 char including the arrows --->
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select '<--- 64 char including the arrows --->' AS `<--- 64 char including the arrows --->`;
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select '<--- 64 char including the arrows --->' AS `<--- 64 char including the arrows --->`;
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS SELECT (SELECT '<--- 53 char including the arrows (+ 11 outside) --->');
|
|
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1';
|
|
COLUMN_NAME
|
|
(SELECT '<--- 53 char including the arrows (+ 11 outside) --->')
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select (select '<--- 53 char including the arrows (+ 11 outside) --->') AS `(SELECT '<--- 53 char including the arrows (+ 11 outside) --->')`;
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select (select '<--- 53 char including the arrows (+ 11 outside) --->') AS `(SELECT '<--- 53 char including the arrows (+ 11 outside) --->')`;
|
|
DROP VIEW v1;
|
|
# -----------------------------------------------------------------------------------------------------------------
|
|
# Identifiers must not have trailing spaces. The system cannot derive the name from a constant with trailing space.
|
|
# Generated identifiers have at their end the position within the select column list.
|
|
# 'c2 ' -> 'Name_exp_1' , ' c4 ' -> 'Name_exp_2'
|
|
CREATE VIEW v1 AS SELECT 'c1', 'c2 ', ' c3', ' c4 ';
|
|
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1';
|
|
COLUMN_NAME
|
|
c1
|
|
Name_exp_2
|
|
c3
|
|
Name_exp_4
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select 'c1' AS `c1`,'c2 ' AS `Name_exp_2`,' c3' AS `c3`,' c4 ' AS `Name_exp_4`;
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select 'c1' AS `c1`,'c2 ' AS `Name_exp_2`,' c3' AS `c3`,' c4 ' AS `Name_exp_4`;
|
|
DROP VIEW v1;
|
|
#
|
|
# Bug#40277 SHOW CREATE VIEW returns invalid SQL
|
|
#
|
|
DROP VIEW IF EXISTS v1;
|
|
DROP TABLE IF EXISTS t1,t2;
|
|
# Column name exceeds the maximum length.
|
|
CREATE VIEW v1 AS SELECT '0000000000 1111111111 2222222222 3333333333 4444444444 5555555555';
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select '0000000000 1111111111 2222222222 3333333333 4444444444 5555555555' AS `Name_exp_1`;
|
|
DROP VIEW v1;
|
|
# Column names with leading trailing spaces.
|
|
CREATE VIEW v1 AS SELECT 'c1', 'c2 ', ' c3', ' c4 ';
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select 'c1' AS `c1`,'c2 ' AS `Name_exp_2`,' c3' AS `c3`,' c4 ' AS `Name_exp_4`;
|
|
DROP VIEW v1;
|
|
# Column name conflicts with a auto-generated one.
|
|
CREATE VIEW v1 AS SELECT 'c1', 'c2 ', ' c3', ' c4 ', 'Name_exp_2';
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select 'c1' AS `c1`,'c2 ' AS `Name_exp_2`,' c3' AS `c3`,' c4 ' AS `Name_exp_4`,'Name_exp_2' AS `My_exp_Name_exp_2`;
|
|
DROP VIEW v1;
|
|
# Invalid conlumn name in subquery.
|
|
CREATE VIEW v1 AS SELECT (SELECT ' c1 ');
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select (select ' c1 ') AS `(SELECT ' c1 ')`;
|
|
DROP VIEW v1;
|
|
CREATE TABLE t1(a INT);
|
|
CREATE TABLE t2 LIKE t1;
|
|
# Test alias in subquery
|
|
CREATE VIEW v1 AS SELECT a FROM t1 WHERE EXISTS (SELECT 1 FROM t2 AS b WHERE b.a = 0);
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select `test`.`t1`.`a` AS `a` from `test`.`t1` where exists(select 1 from `test`.`t2` `b` where (`b`.`a` = 0));
|
|
DROP VIEW v1;
|
|
# Test column alias in subquery
|
|
CREATE VIEW v1 AS SELECT a FROM t1 WHERE EXISTS (SELECT a AS alias FROM t1 GROUP BY alias);
|
|
SHOW CREATE VIEW v1;
|
|
View Create View character_set_client collation_connection
|
|
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` where exists(select `t1`.`a` AS `alias` from `t1` group by `t1`.`a`) latin1 latin1_swedish_ci
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select `test`.`t1`.`a` AS `a` from `test`.`t1` where exists(select `test`.`t1`.`a` AS `alias` from `test`.`t1` group by `test`.`t1`.`a`);
|
|
DROP VIEW v1;
|
|
# Alias as the expression column name.
|
|
CREATE VIEW v1 AS SELECT a FROM t1 WHERE EXISTS (SELECT ' a ' AS alias FROM t1 GROUP BY alias);
|
|
SHOW CREATE VIEW v1;
|
|
View Create View character_set_client collation_connection
|
|
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` where exists(select ' a ' AS `alias` from `t1` group by ' a ') latin1 latin1_swedish_ci
|
|
DROP VIEW v1;
|
|
CREATE VIEW v1 AS select `test`.`t1`.`a` AS `a` from `test`.`t1` where exists(select ' a ' AS `alias` from `test`.`t1` group by ' a ');
|
|
DROP VIEW v1;
|
|
DROP TABLE t1, t2;
|