Commit e1e0f829 authored by unknown's avatar unknown
Browse files

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
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -5470,5 +5470,32 @@ CAD
CHF
DROP FUNCTION bug21493|
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
drop table t1,t2;
+33 −0
Original line number Diff line number Diff line
@@ -6420,6 +6420,39 @@ SELECT bug21493(Member_ID) FROM t3|
DROP FUNCTION bug21493|
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


+11 −9
Original line number Diff line number Diff line
@@ -650,11 +650,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%token  UNIX_TIMESTAMP
%token  UNKNOWN_SYM
%token  UNLOCK_SYM
%token  UNLOCK_SYM
%token  UNSIGNED
%token  UNTIL_SYM
%token  UNTIL_SYM
%token  UPDATE_SYM
%token  UPDATE_SYM
%token  UPGRADE_SYM
%token  USAGE
@@ -1447,11 +1444,16 @@ call:
	    lex->value_list.empty();
	    sp_add_used_routine(lex, YYTHD, $2, TYPE_ENUM_PROCEDURE);
	  }
          '(' sp_cparam_list ')' {}
          opt_sp_cparam_list {}
	;

/* CALL parameters */
sp_cparam_list:
opt_sp_cparam_list:
	  /* Empty */
	| '(' opt_sp_cparams ')'
	;

opt_sp_cparams:
          /* Empty */
        | sp_cparams
        ;
@@ -5166,7 +5168,7 @@ when_list2:
/* Warning - may return NULL in case of incomplete SELECT */
table_ref:
        table_factor            { $$=$1; }
        | join_table            { $$=$1; }
        | join_table
          {
	    LEX *lex= Lex;
            if (!($$= lex->current_select->nest_last_join(lex->thd)))
@@ -5208,7 +5210,7 @@ join_table:
	| table_ref normal_join table_ref
          ON
          {
            YYERROR_UNLESS($1 && ($$=$3));
            YYERROR_UNLESS($1 && $3);
            /* Change the current name resolution context to a local context. */
            if (push_new_name_resolution_context(YYTHD, $1, $3))
              YYABORT;
@@ -5223,7 +5225,7 @@ join_table:
        | table_ref STRAIGHT_JOIN table_factor
          ON
          {
            YYERROR_UNLESS($1 && ($$=$3));
            YYERROR_UNLESS($1 && $3);
            /* Change the current name resolution context to a local context. */
            if (push_new_name_resolution_context(YYTHD, $1, $3))
              YYABORT;