Commit e1e0f829 authored by unknown's avatar unknown

Bug#21462 (Stored procedures with no arguments require parenthesis)

The syntax of the CALL statement, to invoke a stored procedure, has been
changed to make the use of parenthesis optional in the argument list.
With this change, "CALL p;" is equivalent to "CALL p();".

While the SQL spec does not explicitely mandate this syntax, supporting it
is needed for practical reasons, for integration with JDBC / ODBC connectors.

Also, warnings in the sql/sql_yacc.yy file, which were not reported by Bison 2.1
but are now reported by Bison 2.2, have been fixed.

The warning found were:
bison -y -p MYSQL  -d --debug --verbose sql_yacc.yy
sql_yacc.yy:653.9-18: warning: symbol UNLOCK_SYM redeclared
sql_yacc.yy:656.9-17: warning: symbol UNTIL_SYM redeclared
sql_yacc.yy:658.9-18: warning: symbol UPDATE_SYM redeclared
sql_yacc.yy:5169.11-5174.11: warning: unused value: $2
sql_yacc.yy:5208.11-5220.11: warning: unused value: $5
sql_yacc.yy:5221.11-5234.11: warning: unused value: $5
conflicts: 249 shift/reduce

"unused value: $2" correspond to the $$=$1 assignment in the 1st {} block
in table_ref -> join_table {} {},
which does not procude a result ($$) for the rule but an intermediate $2
value for the action instead.
"unused value: $5" are similar, with $$ assignments in {} actions blocks
which are not for the final reduce.


mysql-test/r/sp.result:
  New test case for Bug#21462
mysql-test/t/sp.test:
  New test case for Bug#21462
sql/sql_yacc.yy:
  "CALL p;" syntax for calling a stored procedure
  Fixed bison 2.2 warnings.
parent afdae2f3
...@@ -5470,5 +5470,32 @@ CAD ...@@ -5470,5 +5470,32 @@ CAD
CHF CHF
DROP FUNCTION bug21493| DROP FUNCTION bug21493|
DROP TABLE t3,t4| DROP TABLE t3,t4|
drop procedure if exists proc_21462_a|
drop procedure if exists proc_21462_b|
create procedure proc_21462_a()
begin
select "Called A";
end|
create procedure proc_21462_b(x int)
begin
select "Called B";
end|
call proc_21462_a|
Called A
Called A
call proc_21462_a()|
Called A
Called A
call proc_21462_a(1)|
ERROR 42000: Incorrect number of arguments for PROCEDURE test.proc_21462_a; expected 0, got 1
call proc_21462_b|
ERROR 42000: Incorrect number of arguments for PROCEDURE test.proc_21462_b; expected 1, got 0
call proc_21462_b()|
ERROR 42000: Incorrect number of arguments for PROCEDURE test.proc_21462_b; expected 1, got 0
call proc_21462_b(1)|
Called B
Called B
drop procedure proc_21462_a|
drop procedure proc_21462_b|
End of 5.0 tests End of 5.0 tests
drop table t1,t2; drop table t1,t2;
...@@ -6420,6 +6420,39 @@ SELECT bug21493(Member_ID) FROM t3| ...@@ -6420,6 +6420,39 @@ SELECT bug21493(Member_ID) FROM t3|
DROP FUNCTION bug21493| DROP FUNCTION bug21493|
DROP TABLE t3,t4| DROP TABLE t3,t4|
#
# Bug#21462 Stored procedures with no arguments require parenthesis
#
--disable_warnings
drop procedure if exists proc_21462_a|
drop procedure if exists proc_21462_b|
--enable_warnings
create procedure proc_21462_a()
begin
select "Called A";
end|
create procedure proc_21462_b(x int)
begin
select "Called B";
end|
call proc_21462_a|
call proc_21462_a()|
-- error ER_SP_WRONG_NO_OF_ARGS
call proc_21462_a(1)|
-- error ER_SP_WRONG_NO_OF_ARGS
call proc_21462_b|
-- error ER_SP_WRONG_NO_OF_ARGS
call proc_21462_b()|
call proc_21462_b(1)|
drop procedure proc_21462_a|
drop procedure proc_21462_b|
--echo End of 5.0 tests --echo End of 5.0 tests
......
...@@ -650,11 +650,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); ...@@ -650,11 +650,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%token UNIX_TIMESTAMP %token UNIX_TIMESTAMP
%token UNKNOWN_SYM %token UNKNOWN_SYM
%token UNLOCK_SYM %token UNLOCK_SYM
%token UNLOCK_SYM
%token UNSIGNED %token UNSIGNED
%token UNTIL_SYM %token UNTIL_SYM
%token UNTIL_SYM
%token UPDATE_SYM
%token UPDATE_SYM %token UPDATE_SYM
%token UPGRADE_SYM %token UPGRADE_SYM
%token USAGE %token USAGE
...@@ -1447,15 +1444,20 @@ call: ...@@ -1447,15 +1444,20 @@ call:
lex->value_list.empty(); lex->value_list.empty();
sp_add_used_routine(lex, YYTHD, $2, TYPE_ENUM_PROCEDURE); sp_add_used_routine(lex, YYTHD, $2, TYPE_ENUM_PROCEDURE);
} }
'(' sp_cparam_list ')' {} opt_sp_cparam_list {}
; ;
/* CALL parameters */ /* CALL parameters */
sp_cparam_list: opt_sp_cparam_list:
/* Empty */ /* Empty */
| sp_cparams | '(' opt_sp_cparams ')'
; ;
opt_sp_cparams:
/* Empty */
| sp_cparams
;
sp_cparams: sp_cparams:
sp_cparams ',' expr sp_cparams ',' expr
{ {
...@@ -5166,7 +5168,7 @@ when_list2: ...@@ -5166,7 +5168,7 @@ when_list2:
/* Warning - may return NULL in case of incomplete SELECT */ /* Warning - may return NULL in case of incomplete SELECT */
table_ref: table_ref:
table_factor { $$=$1; } table_factor { $$=$1; }
| join_table { $$=$1; } | join_table
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (!($$= lex->current_select->nest_last_join(lex->thd))) if (!($$= lex->current_select->nest_last_join(lex->thd)))
...@@ -5208,7 +5210,7 @@ join_table: ...@@ -5208,7 +5210,7 @@ join_table:
| table_ref normal_join table_ref | table_ref normal_join table_ref
ON ON
{ {
YYERROR_UNLESS($1 && ($$=$3)); YYERROR_UNLESS($1 && $3);
/* Change the current name resolution context to a local context. */ /* Change the current name resolution context to a local context. */
if (push_new_name_resolution_context(YYTHD, $1, $3)) if (push_new_name_resolution_context(YYTHD, $1, $3))
YYABORT; YYABORT;
...@@ -5223,7 +5225,7 @@ join_table: ...@@ -5223,7 +5225,7 @@ join_table:
| table_ref STRAIGHT_JOIN table_factor | table_ref STRAIGHT_JOIN table_factor
ON ON
{ {
YYERROR_UNLESS($1 && ($$=$3)); YYERROR_UNLESS($1 && $3);
/* Change the current name resolution context to a local context. */ /* Change the current name resolution context to a local context. */
if (push_new_name_resolution_context(YYTHD, $1, $3)) if (push_new_name_resolution_context(YYTHD, $1, $3))
YYABORT; YYABORT;
......
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