mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +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.
25 lines
1.1 KiB
SQL
25 lines
1.1 KiB
SQL
# Routine to be called by t/view.inc
|
|
#
|
|
# The variable $after_select must be set before calling this routine.
|
|
|
|
eval CREATE VIEW v1 AS SELECT $after_select;
|
|
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1';
|
|
#
|
|
# Extract the VIEW's SELECT from INFORMATION_SCHEMA.VIEWS
|
|
let $query1 = `SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1'`;
|
|
#
|
|
# Extract the VIEW's SELECT from SHOW CREATE VIEW
|
|
# 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 '<--- .....
|
|
let $value= query_get_value(SHOW CREATE VIEW v1, Create View, 1);
|
|
let $query2 = `SELECT SUBSTR("$value",INSTR("$value",' as select ') + CHAR_LENGTH(' as '))`;
|
|
DROP VIEW v1;
|
|
|
|
# Recreate the view based on SELECT from INFORMATION_SCHEMA.VIEWS
|
|
eval CREATE VIEW v1 AS $query1;
|
|
DROP VIEW v1;
|
|
# Recreate the view based on SHOW CREATE VIEW
|
|
eval CREATE VIEW v1 AS $query2;
|
|
DROP VIEW v1;
|
|
|