Commit 60aeed17 authored by unknown's avatar unknown

fixed bug of PROCEDURE in same query with subselects

prohibited using procedure inside subquery
fixed error handling of procedure analize


mysql-test/r/subselect.result:
  test of PROCEDURE in subselect
  test of PROCEDURE of subselect
mysql-test/t/subselect.test:
  test of PROCEDURE in subselect
  test of PROCEDURE of subselect
sql/sql_analyse.cc:
  fixed error handling in procedure analize
sql/sql_parse.cc:
  fixed bug of PROCEDURE in same query with subselects
sql/sql_yacc.yy:
  prohibited using procedure inside subquery
parent e25c0f30
......@@ -43,6 +43,10 @@ SELECT 1 IN (SELECT 1);
SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a));
1
1
select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1));
Wrong usage of PROCEDURE and subquery
SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1));
Incorrect parameters to procedure 'ANALYSE'
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8;
create table t1 (a int);
create table t2 (a int, b int);
......
......@@ -20,6 +20,11 @@ SELECT * FROM (SELECT 1 as id) b WHERE id IN (SELECT * FROM (SELECT 1 as id) c O
SELECT * FROM (SELECT 1) a WHERE 1 IN (SELECT 1,1);
SELECT 1 IN (SELECT 1);
SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a));
-- error 1221
select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1));
-- error 1108
SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1));
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8;
create table t1 (a int);
create table t2 (a int, b int);
......
......@@ -89,21 +89,21 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result,
if ((*param->item)->type() != Item::INT_ITEM ||
(*param->item)->val() < 0)
{
net_printf(thd, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name);
my_error(ER_WRONG_PARAMETERS_TO_PROCEDURE, MYF(0), proc_name);
DBUG_RETURN(0);
}
pc->max_tree_elements = (uint) (*param->item)->val_int();
param = param->next;
if (param->next) // no third parameter possible
{
net_printf(thd, ER_WRONG_PARAMCOUNT_TO_PROCEDURE, proc_name);
my_error(ER_WRONG_PARAMCOUNT_TO_PROCEDURE, MYF(0), proc_name);
DBUG_RETURN(0);
}
// second parameter
if ((*param->item)->type() != Item::INT_ITEM ||
(*param->item)->val() < 0)
{
net_printf(thd, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name);
my_error(ER_WRONG_PARAMETERS_TO_PROCEDURE, MYF(0), proc_name);
DBUG_RETURN(0);
}
pc->max_treemem = (uint) (*param->item)->val_int();
......@@ -111,7 +111,7 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result,
else if ((*param->item)->type() != Item::INT_ITEM ||
(*param->item)->val() < 0)
{
net_printf(thd, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name);
my_error(ER_WRONG_PARAMETERS_TO_PROCEDURE, MYF(0), proc_name);
DBUG_RETURN(0);
}
// if only one parameter was given, it will be the value of max_tree_elements
......
......@@ -3054,9 +3054,12 @@ mysql_init_select(LEX *lex)
select_lex->init_select();
select_lex->master_unit()->select_limit= select_lex->select_limit=
lex->thd->variables.select_limit;
lex->exchange= 0;
lex->result= 0;
lex->proc_list.first= 0;
if (select_lex == &lex->select_lex)
{
lex->exchange= 0;
lex->result= 0;
lex->proc_list.first= 0;
}
}
......
......@@ -2750,6 +2750,13 @@ procedure_clause:
| PROCEDURE ident /* Procedure name */
{
LEX *lex=Lex;
if (&lex->select_lex != lex->current_select)
{
net_printf(lex->thd, ER_WRONG_USAGE,
"PROCEDURE",
"subquery");
YYABORT;
}
lex->proc_list.elements=0;
lex->proc_list.first=0;
lex->proc_list.next= (byte**) &lex->proc_list.first;
......
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