diff options
author | bell@sanja.is.com.ua <> | 2002-12-06 00:40:28 +0200 |
---|---|---|
committer | bell@sanja.is.com.ua <> | 2002-12-06 00:40:28 +0200 |
commit | f1858ec33148388e5456422be3d6b363291d9636 (patch) | |
tree | bbdab3cd51ac1e8b7d77d92c2541b96f9447eeb4 /sql | |
parent | 9e4dc3fba54dc1455e2657a78cc412a5fa67534d (diff) | |
download | mariadb-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.cc | 8 | ||||
-rw-r--r-- | sql/sql_parse.cc | 9 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 7 |
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; |