summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.org>2017-02-22 14:13:53 +0400
committerAlexander Barkov <bar@mariadb.org>2017-04-05 15:02:58 +0400
commit29e7cf01c3edd638c2bd567d49d053598b442044 (patch)
treec30e7fe4c5fe179cce81022644612abb93e23f68 /sql
parent839e0947eea1660aa437b77520388e062bac4f63 (diff)
downloadmariadb-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.cc27
-rw-r--r--sql/sql_lex.h2
-rw-r--r--sql/sql_yacc.yy18
-rw-r--r--sql/sql_yacc_ora.yy37
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;