mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-10102 Disallow CREATE VIEW .. PROCEDURE ANALYSE() syntactically
This commit is contained in:
@ -1227,14 +1227,14 @@ DROP PROCEDURE IF EXISTS bug14702;
|
|||||||
DROP TABLE IF EXISTS t1;
|
DROP TABLE IF EXISTS t1;
|
||||||
CREATE TABLE t1 (i INT);
|
CREATE TABLE t1 (i INT);
|
||||||
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO @a;
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO @a;
|
||||||
ERROR HY000: View's SELECT contains a 'INTO' clause
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INTO @a' at line 1
|
||||||
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO DUMPFILE "file";
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO DUMPFILE "file";
|
||||||
ERROR HY000: View's SELECT contains a 'INTO' clause
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INTO DUMPFILE "file"' at line 1
|
||||||
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO OUTFILE "file";
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO OUTFILE "file";
|
||||||
ERROR HY000: View's SELECT contains a 'INTO' clause
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INTO OUTFILE "file"' at line 1
|
||||||
CREATE PROCEDURE bug20953()
|
CREATE PROCEDURE bug20953()
|
||||||
CREATE VIEW v AS SELECT i FROM t1 PROCEDURE ANALYSE();
|
CREATE VIEW v AS SELECT i FROM t1 PROCEDURE ANALYSE();
|
||||||
ERROR HY000: View's SELECT contains a 'PROCEDURE' clause
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'PROCEDURE ANALYSE()' at line 2
|
||||||
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 FROM (SELECT 1) AS d1;
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 FROM (SELECT 1) AS d1;
|
||||||
ERROR HY000: View's SELECT contains a subquery in the FROM clause
|
ERROR HY000: View's SELECT contains a subquery in the FROM clause
|
||||||
CREATE PROCEDURE bug20953(i INT) CREATE VIEW v AS SELECT i;
|
CREATE PROCEDURE bug20953(i INT) CREATE VIEW v AS SELECT i;
|
||||||
|
@ -923,12 +923,12 @@ select * from v4;
|
|||||||
ERROR 21000: Subquery returns more than 1 row
|
ERROR 21000: Subquery returns more than 1 row
|
||||||
drop view v4, v3, v2, v1;
|
drop view v4, v3, v2, v1;
|
||||||
create view v1 as select 5 into @w;
|
create view v1 as select 5 into @w;
|
||||||
ERROR HY000: View's SELECT contains a 'INTO' clause
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'into @w' at line 1
|
||||||
create view v1 as select 5 into outfile 'ttt';
|
create view v1 as select 5 into outfile 'ttt';
|
||||||
ERROR HY000: View's SELECT contains a 'INTO' clause
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'into outfile 'ttt'' at line 1
|
||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
create view v1 as select a from t1 procedure analyse();
|
create view v1 as select a from t1 procedure analyse();
|
||||||
ERROR HY000: View's SELECT contains a 'PROCEDURE' clause
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'procedure analyse()' at line 1
|
||||||
create view v1 as select 1 from (select 1) as d1;
|
create view v1 as select 1 from (select 1) as d1;
|
||||||
ERROR HY000: View's SELECT contains a subquery in the FROM clause
|
ERROR HY000: View's SELECT contains a subquery in the FROM clause
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
@ -3497,7 +3497,7 @@ DROP VIEW IF EXISTS v2 ;
|
|||||||
CREATE TABLE t1 (f1 BIGINT) ;
|
CREATE TABLE t1 (f1 BIGINT) ;
|
||||||
SET @x=0;
|
SET @x=0;
|
||||||
CREATE or REPLACE VIEW v1 AS Select 1 INTO @x;
|
CREATE or REPLACE VIEW v1 AS Select 1 INTO @x;
|
||||||
ERROR HY000: View's SELECT contains a 'INTO' clause
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INTO @x' at line 1
|
||||||
Select @x;
|
Select @x;
|
||||||
@x
|
@x
|
||||||
0
|
0
|
||||||
|
@ -3498,7 +3498,7 @@ DROP VIEW IF EXISTS v2 ;
|
|||||||
CREATE TABLE t1 (f1 BIGINT) ;
|
CREATE TABLE t1 (f1 BIGINT) ;
|
||||||
SET @x=0;
|
SET @x=0;
|
||||||
CREATE or REPLACE VIEW v1 AS Select 1 INTO @x;
|
CREATE or REPLACE VIEW v1 AS Select 1 INTO @x;
|
||||||
ERROR HY000: View's SELECT contains a 'INTO' clause
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INTO @x' at line 1
|
||||||
Select @x;
|
Select @x;
|
||||||
@x
|
@x
|
||||||
0
|
0
|
||||||
|
@ -266,7 +266,7 @@ CREATE TABLE t1 (f1 BIGINT) ;
|
|||||||
|
|
||||||
# SELECT INTO is illegal
|
# SELECT INTO is illegal
|
||||||
SET @x=0;
|
SET @x=0;
|
||||||
--error ER_VIEW_SELECT_CLAUSE
|
--error ER_PARSE_ERROR
|
||||||
CREATE or REPLACE VIEW v1 AS Select 1 INTO @x;
|
CREATE or REPLACE VIEW v1 AS Select 1 INTO @x;
|
||||||
Select @x;
|
Select @x;
|
||||||
|
|
||||||
|
@ -1785,13 +1785,13 @@ CREATE TABLE t1 (i INT);
|
|||||||
|
|
||||||
# We do not have to drop this procedure and view because they won't be
|
# We do not have to drop this procedure and view because they won't be
|
||||||
# created.
|
# created.
|
||||||
--error ER_VIEW_SELECT_CLAUSE
|
--error ER_PARSE_ERROR
|
||||||
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO @a;
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO @a;
|
||||||
--error ER_VIEW_SELECT_CLAUSE
|
--error ER_PARSE_ERROR
|
||||||
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO DUMPFILE "file";
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO DUMPFILE "file";
|
||||||
--error ER_VIEW_SELECT_CLAUSE
|
--error ER_PARSE_ERROR
|
||||||
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO OUTFILE "file";
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO OUTFILE "file";
|
||||||
--error ER_VIEW_SELECT_CLAUSE
|
--error ER_PARSE_ERROR
|
||||||
CREATE PROCEDURE bug20953()
|
CREATE PROCEDURE bug20953()
|
||||||
CREATE VIEW v AS SELECT i FROM t1 PROCEDURE ANALYSE();
|
CREATE VIEW v AS SELECT i FROM t1 PROCEDURE ANALYSE();
|
||||||
--error ER_VIEW_SELECT_DERIVED
|
--error ER_VIEW_SELECT_DERIVED
|
||||||
|
@ -840,12 +840,12 @@ drop view v4, v3, v2, v1;
|
|||||||
#
|
#
|
||||||
# VIEW over SELECT with prohibited clauses
|
# VIEW over SELECT with prohibited clauses
|
||||||
#
|
#
|
||||||
-- error ER_VIEW_SELECT_CLAUSE
|
-- error ER_PARSE_ERROR
|
||||||
create view v1 as select 5 into @w;
|
create view v1 as select 5 into @w;
|
||||||
-- error ER_VIEW_SELECT_CLAUSE
|
-- error ER_PARSE_ERROR
|
||||||
create view v1 as select 5 into outfile 'ttt';
|
create view v1 as select 5 into outfile 'ttt';
|
||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
-- error ER_VIEW_SELECT_CLAUSE
|
-- error ER_PARSE_ERROR
|
||||||
create view v1 as select a from t1 procedure analyse();
|
create view v1 as select a from t1 procedure analyse();
|
||||||
-- error ER_VIEW_SELECT_DERIVED
|
-- error ER_VIEW_SELECT_DERIVED
|
||||||
create view v1 as select 1 from (select 1) as d1;
|
create view v1 as select 1 from (select 1) as d1;
|
||||||
|
@ -5218,6 +5218,8 @@ ER_VIEW_SELECT_DERIVED
|
|||||||
ger "SELECT der View enthält eine Subquery in der FROM-Klausel"
|
ger "SELECT der View enthält eine Subquery in der FROM-Klausel"
|
||||||
rus "View SELECT содержит подзапрос в конструкции FROM"
|
rus "View SELECT содержит подзапрос в конструкции FROM"
|
||||||
ukr "View SELECT має підзапит у конструкції FROM"
|
ukr "View SELECT має підзапит у конструкції FROM"
|
||||||
|
|
||||||
|
# Not used any more, syntax error is returned instead
|
||||||
ER_VIEW_SELECT_CLAUSE
|
ER_VIEW_SELECT_CLAUSE
|
||||||
eng "View's SELECT contains a '%s' clause"
|
eng "View's SELECT contains a '%s' clause"
|
||||||
ger "SELECT der View enthält eine '%s'-Klausel"
|
ger "SELECT der View enthält eine '%s'-Klausel"
|
||||||
|
@ -232,8 +232,6 @@ void
|
|||||||
st_parsing_options::reset()
|
st_parsing_options::reset()
|
||||||
{
|
{
|
||||||
allows_variable= TRUE;
|
allows_variable= TRUE;
|
||||||
allows_select_into= TRUE;
|
|
||||||
allows_select_procedure= TRUE;
|
|
||||||
allows_derived= TRUE;
|
allows_derived= TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1817,8 +1817,6 @@ private:
|
|||||||
struct st_parsing_options
|
struct st_parsing_options
|
||||||
{
|
{
|
||||||
bool allows_variable;
|
bool allows_variable;
|
||||||
bool allows_select_into;
|
|
||||||
bool allows_select_procedure;
|
|
||||||
bool allows_derived;
|
bool allows_derived;
|
||||||
|
|
||||||
st_parsing_options() { reset(); }
|
st_parsing_options() { reset(); }
|
||||||
|
@ -8545,6 +8545,23 @@ select_paren:
|
|||||||
| '(' select_paren ')'
|
| '(' select_paren ')'
|
||||||
;
|
;
|
||||||
|
|
||||||
|
select_paren_view:
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
In order to correctly parse UNION's global ORDER BY we need to
|
||||||
|
set braces before parsing the clause.
|
||||||
|
*/
|
||||||
|
Lex->current_select->set_braces(true);
|
||||||
|
}
|
||||||
|
SELECT_SYM select_options_and_item_list select_part3_view
|
||||||
|
opt_select_lock_type
|
||||||
|
{
|
||||||
|
if (setup_select_in_parentheses(Lex))
|
||||||
|
MYSQL_YYABORT;
|
||||||
|
}
|
||||||
|
| '(' select_paren_view ')'
|
||||||
|
;
|
||||||
|
|
||||||
/* The equivalent of select_paren for nested queries. */
|
/* The equivalent of select_paren for nested queries. */
|
||||||
select_paren_derived:
|
select_paren_derived:
|
||||||
{
|
{
|
||||||
@ -8580,11 +8597,37 @@ select_init3:
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
select_init3_view:
|
||||||
|
opt_table_expression opt_select_lock_type
|
||||||
|
{
|
||||||
|
Lex->current_select->set_braces(false);
|
||||||
|
}
|
||||||
|
| opt_table_expression opt_select_lock_type
|
||||||
|
{
|
||||||
|
Lex->current_select->set_braces(false);
|
||||||
|
}
|
||||||
|
union_list_view
|
||||||
|
| order_or_limit opt_select_lock_type
|
||||||
|
{
|
||||||
|
Lex->current_select->set_braces(false);
|
||||||
|
}
|
||||||
|
| table_expression order_or_limit opt_select_lock_type
|
||||||
|
{
|
||||||
|
Lex->current_select->set_braces(false);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
select_part3:
|
select_part3:
|
||||||
opt_table_expression
|
opt_table_expression
|
||||||
| select_part3_union_not_ready
|
| select_part3_union_not_ready
|
||||||
;
|
;
|
||||||
|
|
||||||
|
select_part3_view:
|
||||||
|
opt_table_expression
|
||||||
|
| order_or_limit
|
||||||
|
| table_expression order_or_limit
|
||||||
|
;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The SELECT parts after select_item_list that cannot be followed by UNION.
|
The SELECT parts after select_item_list that cannot be followed by UNION.
|
||||||
*/
|
*/
|
||||||
@ -11969,12 +12012,6 @@ procedure_clause:
|
|||||||
{
|
{
|
||||||
LEX *lex=Lex;
|
LEX *lex=Lex;
|
||||||
|
|
||||||
if (! lex->parsing_options.allows_select_procedure)
|
|
||||||
{
|
|
||||||
my_error(ER_VIEW_SELECT_CLAUSE, MYF(0), "PROCEDURE");
|
|
||||||
MYSQL_YYABORT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (&lex->select_lex != lex->current_select)
|
if (&lex->select_lex != lex->current_select)
|
||||||
{
|
{
|
||||||
// SELECT * FROM t1 UNION SELECT * FROM t2 PROCEDURE ANALYSE();
|
// SELECT * FROM t1 UNION SELECT * FROM t2 PROCEDURE ANALYSE();
|
||||||
@ -12086,15 +12123,7 @@ select_outvar:
|
|||||||
;
|
;
|
||||||
|
|
||||||
into:
|
into:
|
||||||
INTO
|
INTO into_destination
|
||||||
{
|
|
||||||
if (! Lex->parsing_options.allows_select_into)
|
|
||||||
{
|
|
||||||
my_error(ER_VIEW_SELECT_CLAUSE, MYF(0), "INTO");
|
|
||||||
MYSQL_YYABORT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
into_destination
|
|
||||||
;
|
;
|
||||||
|
|
||||||
into_destination:
|
into_destination:
|
||||||
@ -16342,6 +16371,18 @@ union_list:
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
union_list_view:
|
||||||
|
UNION_SYM union_option
|
||||||
|
{
|
||||||
|
if (add_select_to_union_list(Lex, (bool)$2, TRUE))
|
||||||
|
MYSQL_YYABORT;
|
||||||
|
}
|
||||||
|
query_expression_body_view
|
||||||
|
{
|
||||||
|
Lex->pop_context();
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
union_opt:
|
union_opt:
|
||||||
opt_union_order_or_limit
|
opt_union_order_or_limit
|
||||||
| union_list { $$= 1; }
|
| union_list { $$= 1; }
|
||||||
@ -16654,12 +16695,10 @@ view_select:
|
|||||||
{
|
{
|
||||||
LEX *lex= Lex;
|
LEX *lex= Lex;
|
||||||
lex->parsing_options.allows_variable= FALSE;
|
lex->parsing_options.allows_variable= FALSE;
|
||||||
lex->parsing_options.allows_select_into= FALSE;
|
|
||||||
lex->parsing_options.allows_select_procedure= FALSE;
|
|
||||||
lex->parsing_options.allows_derived= FALSE;
|
lex->parsing_options.allows_derived= FALSE;
|
||||||
lex->create_view_select.str= (char *) YYLIP->get_cpp_ptr();
|
lex->create_view_select.str= (char *) YYLIP->get_cpp_ptr();
|
||||||
}
|
}
|
||||||
opt_with_clause view_select_aux view_check_option
|
opt_with_clause query_expression_body_view view_check_option
|
||||||
{
|
{
|
||||||
LEX *lex= Lex;
|
LEX *lex= Lex;
|
||||||
uint len= YYLIP->get_cpp_ptr() - lex->create_view_select.str;
|
uint len= YYLIP->get_cpp_ptr() - lex->create_view_select.str;
|
||||||
@ -16668,16 +16707,20 @@ view_select:
|
|||||||
lex->create_view_select.str= (char *) create_view_select;
|
lex->create_view_select.str= (char *) create_view_select;
|
||||||
trim_whitespace(thd->charset(), &lex->create_view_select);
|
trim_whitespace(thd->charset(), &lex->create_view_select);
|
||||||
lex->parsing_options.allows_variable= TRUE;
|
lex->parsing_options.allows_variable= TRUE;
|
||||||
lex->parsing_options.allows_select_into= TRUE;
|
|
||||||
lex->parsing_options.allows_select_procedure= TRUE;
|
|
||||||
lex->parsing_options.allows_derived= TRUE;
|
lex->parsing_options.allows_derived= TRUE;
|
||||||
lex->current_select->set_with_clause($2);
|
lex->current_select->set_with_clause($2);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
view_select_aux:
|
/*
|
||||||
SELECT_SYM select_options_and_item_list select_init3
|
SQL Standard <query expression body> for VIEWs.
|
||||||
| '(' select_paren ')' union_opt
|
Does not include INTO and PROCEDURE clauses.
|
||||||
|
*/
|
||||||
|
query_expression_body_view:
|
||||||
|
SELECT_SYM select_options_and_item_list select_init3_view
|
||||||
|
| '(' select_paren_view ')'
|
||||||
|
| '(' select_paren_view ')' union_order_or_limit
|
||||||
|
| '(' select_paren_view ')' union_list_view
|
||||||
;
|
;
|
||||||
|
|
||||||
view_check_option:
|
view_check_option:
|
||||||
|
Reference in New Issue
Block a user