mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
301b0786dd
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.
92 lines
4 KiB
Text
92 lines
4 KiB
Text
--echo #
|
|
--echo # Bug#40277 SHOW CREATE VIEW returns invalid SQL
|
|
--echo # Bug#41999 SHOW CREATE VIEW returns invalid SQL if subquery is used in SELECT list
|
|
--echo #
|
|
|
|
--echo # 65 characters exceed the maximum length of a column identifier. The system cannot derive the name from statement.
|
|
--echo # Constant with length = 65 . Expect to get the identifier 'Name_exp_1'.
|
|
let $after_select= '<--- 65 char including the arrows --->';
|
|
--source include/view_alias.inc
|
|
--echo # Subquery with length = 65 . Expect to get the identifier 'Name_exp_1'.
|
|
--echo # Attention: Identifier for the column within the subquery will be not generated.
|
|
let $after_select= (SELECT '<--- 54 char including the arrows (+ 11 outside) -->');
|
|
--source include/view_alias.inc
|
|
--echo # -----------------------------------------------------------------------------------------------------------------
|
|
#
|
|
--echo # 64 characters are the maximum length of a column identifier. The system can derive the name from the statement.
|
|
let $after_select= '<--- 64 char including the arrows --->';
|
|
--source include/view_alias.inc
|
|
let $after_select= (SELECT '<--- 53 char including the arrows (+ 11 outside) --->');
|
|
--source include/view_alias.inc
|
|
--echo # -----------------------------------------------------------------------------------------------------------------
|
|
#
|
|
--echo # Identifiers must not have trailing spaces. The system cannot derive the name from a constant with trailing space.
|
|
--echo # Generated identifiers have at their end the position within the select column list.
|
|
--echo # 'c2 ' -> 'Name_exp_1' , ' c4 ' -> 'Name_exp_2'
|
|
let $after_select= 'c1', 'c2 ', ' c3', ' c4 ';
|
|
--source include/view_alias.inc
|
|
|
|
--echo #
|
|
--echo # Bug#40277 SHOW CREATE VIEW returns invalid SQL
|
|
--echo #
|
|
|
|
--disable_warnings
|
|
DROP VIEW IF EXISTS v1;
|
|
DROP TABLE IF EXISTS t1,t2;
|
|
--enable_warnings
|
|
|
|
--echo # Column name exceeds the maximum length.
|
|
CREATE VIEW v1 AS SELECT '0000000000 1111111111 2222222222 3333333333 4444444444 5555555555';
|
|
let $query = `SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1'`;
|
|
DROP VIEW v1;
|
|
eval CREATE VIEW v1 AS $query;
|
|
DROP VIEW v1;
|
|
|
|
--echo # Column names with leading trailing spaces.
|
|
CREATE VIEW v1 AS SELECT 'c1', 'c2 ', ' c3', ' c4 ';
|
|
let $query = `SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1'`;
|
|
DROP VIEW v1;
|
|
eval CREATE VIEW v1 AS $query;
|
|
DROP VIEW v1;
|
|
|
|
--echo # Column name conflicts with a auto-generated one.
|
|
CREATE VIEW v1 AS SELECT 'c1', 'c2 ', ' c3', ' c4 ', 'Name_exp_2';
|
|
let $query = `SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1'`;
|
|
DROP VIEW v1;
|
|
eval CREATE VIEW v1 AS $query;
|
|
DROP VIEW v1;
|
|
|
|
--echo # Invalid conlumn name in subquery.
|
|
CREATE VIEW v1 AS SELECT (SELECT ' c1 ');
|
|
let $query = `SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1'`;
|
|
DROP VIEW v1;
|
|
eval CREATE VIEW v1 AS $query;
|
|
DROP VIEW v1;
|
|
|
|
CREATE TABLE t1(a INT);
|
|
CREATE TABLE t2 LIKE t1;
|
|
|
|
--echo # Test alias in subquery
|
|
CREATE VIEW v1 AS SELECT a FROM t1 WHERE EXISTS (SELECT 1 FROM t2 AS b WHERE b.a = 0);
|
|
let $query = `SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1'`;
|
|
DROP VIEW v1;
|
|
eval CREATE VIEW v1 AS $query;
|
|
DROP VIEW v1;
|
|
|
|
--echo # 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;
|
|
let $query = `SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1'`;
|
|
DROP VIEW v1;
|
|
eval CREATE VIEW v1 AS $query;
|
|
DROP VIEW v1;
|
|
|
|
--echo # 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;
|
|
let $query = `SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1'`;
|
|
DROP VIEW v1;
|
|
eval CREATE VIEW v1 AS $query;
|
|
DROP VIEW v1;
|
|
|
|
DROP TABLE t1, t2;
|