diff options
author | Alexander Barkov <bar@mariadb.org> | 2017-02-22 14:13:53 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.org> | 2017-04-05 15:02:58 +0400 |
commit | 29e7cf01c3edd638c2bd567d49d053598b442044 (patch) | |
tree | c30e7fe4c5fe179cce81022644612abb93e23f68 /sql | |
parent | 839e0947eea1660aa437b77520388e062bac4f63 (diff) | |
download | mariadb-git-29e7cf01c3edd638c2bd567d49d053598b442044.tar.gz |
MDEV-12107 sql_mode=ORACLE: Inside routines the CALL keywoard is optional
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_lex.cc | 27 | ||||
-rw-r--r-- | sql/sql_lex.h | 2 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 18 | ||||
-rw-r--r-- | sql/sql_yacc_ora.yy | 37 |
4 files changed, 50 insertions, 34 deletions
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index b8d150139cf..d6e48e511d9 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -5588,6 +5588,33 @@ bool LEX::sp_block_finalize(THD *thd, const Lex_spblock_st spblock, } +sp_name *LEX::make_sp_name(THD *thd, LEX_STRING &name) +{ + sp_name *res; + LEX_STRING db; + if (check_routine_name(&name) || + copy_db_to(&db.str, &db.length) || + (!(res= new (thd->mem_root) sp_name(db, name, false)))) + return NULL; + return res; +} + + +sp_name *LEX::make_sp_name(THD *thd, LEX_STRING &name1, LEX_STRING &name2) +{ + sp_name *res; + if (!name1.str || check_db_name(&name1)) + { + my_error(ER_WRONG_DB_NAME, MYF(0), name1.str); + return NULL; + } + if (check_routine_name(&name2) || + (!(res= new (thd->mem_root) sp_name(name1, name2, true)))) + return NULL; + return res; +} + + sp_head *LEX::make_sp_head(THD *thd, sp_name *name, enum stored_procedure_type type) { diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 794e6b44702..5fec0bdbb28 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -3099,6 +3099,8 @@ public: bool set_system_variable(struct sys_var_with_base *tmp, enum enum_var_type var_type, Item *val); void set_stmt_init(); + sp_name *make_sp_name(THD *thd, LEX_STRING &name); + sp_name *make_sp_name(THD *thd, LEX_STRING &name1, LEX_STRING &name2); sp_head *make_sp_head(THD *thd, sp_name *name, enum stored_procedure_type type); sp_head *make_sp_head_no_recursive(THD *thd, sp_name *name, diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 43fb40bbcf4..410352dd328 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2734,26 +2734,12 @@ clear_privileges: sp_name: ident '.' ident { - if (!$1.str || check_db_name(&$1)) - my_yyabort_error((ER_WRONG_DB_NAME, MYF(0), $1.str)); - if (check_routine_name(&$3)) - MYSQL_YYABORT; - $$= new (thd->mem_root) sp_name($1, $3, true); - if ($$ == NULL) + if (!($$= Lex->make_sp_name(thd, $1, $3))) MYSQL_YYABORT; } | ident { - LEX *lex= thd->lex; - LEX_STRING db; - if (check_routine_name(&$1)) - { - MYSQL_YYABORT; - } - if (lex->copy_db_to(&db.str, &db.length)) - MYSQL_YYABORT; - $$= new (thd->mem_root) sp_name(db, $1, false); - if ($$ == NULL) + if (!($$= Lex->make_sp_name(thd, $1))) MYSQL_YYABORT; } ; diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index d9f1ccd975e..c31c1e1ef36 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -2197,26 +2197,12 @@ clear_privileges: sp_name: ident '.' ident { - if (!$1.str || check_db_name(&$1)) - my_yyabort_error((ER_WRONG_DB_NAME, MYF(0), $1.str)); - if (check_routine_name(&$3)) - MYSQL_YYABORT; - $$= new (thd->mem_root) sp_name($1, $3, true); - if ($$ == NULL) + if (!($$= Lex->make_sp_name(thd, $1, $3))) MYSQL_YYABORT; } | ident { - LEX *lex= thd->lex; - LEX_STRING db; - if (check_routine_name(&$1)) - { - MYSQL_YYABORT; - } - if (lex->copy_db_to(&db.str, &db.length)) - MYSQL_YYABORT; - $$= new (thd->mem_root) sp_name(db, $1, false); - if ($$ == NULL) + if (!($$= Lex->make_sp_name(thd, $1))) MYSQL_YYABORT; } ; @@ -3090,7 +3076,22 @@ sp_proc_stmt_if: sp_if END IF_SYM { Lex->sphead->do_cont_backpatch(); } ; - + +sp_statement: + statement + | IDENT_sys + { + // Direct procedure call (without the CALL keyword) + LEX *lex = Lex; + if (!(lex->spname= lex->make_sp_name(thd, $1))) + MYSQL_YYABORT; + lex->sql_command= SQLCOM_CALL; + lex->value_list.empty(); + sp_add_used_routine(lex, thd, lex->spname, TYPE_ENUM_PROCEDURE); + } + opt_sp_cparam_list + ; + sp_proc_stmt_statement: { LEX *lex= thd->lex; @@ -3099,7 +3100,7 @@ sp_proc_stmt_statement: lex->sphead->reset_lex(thd); lex->sphead->m_tmp_query= lip->get_tok_start(); } - statement + sp_statement { LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; |