summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorbell@sanja.is.com.ua <>2002-12-06 00:40:28 +0200
committerbell@sanja.is.com.ua <>2002-12-06 00:40:28 +0200
commitf1858ec33148388e5456422be3d6b363291d9636 (patch)
treebbdab3cd51ac1e8b7d77d92c2541b96f9447eeb4 /sql
parent9e4dc3fba54dc1455e2657a78cc412a5fa67534d (diff)
downloadmariadb-git-f1858ec33148388e5456422be3d6b363291d9636.tar.gz
fixed bug of PROCEDURE in same query with subselects
prohibited using procedure inside subquery fixed error handling of procedure analize
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_analyse.cc8
-rw-r--r--sql/sql_parse.cc9
-rw-r--r--sql/sql_yacc.yy7
3 files changed, 17 insertions, 7 deletions
diff --git a/sql/sql_analyse.cc b/sql/sql_analyse.cc
index f98eb0e0b26..ac641f64b53 100644
--- a/sql/sql_analyse.cc
+++ b/sql/sql_analyse.cc
@@ -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
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 086f58e0fd6..bd14d0f9b6a 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -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;
+ }
}
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index c860d98bcc4..cd7503fdb5c 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -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;