Commit ae28b3bd authored by unknown's avatar unknown
Browse files

Fixed BUG#10969: Stored procedures: crash if default() function

  Return an error if default() is used on a local variable.
  This is actaully a side-effect of BUG#5967: Stored procedure declared
  variable used instead of column (to be fixed later), so this is really a
  workaround until that is fixed.


mysql-test/r/sp-error.result:
  New test case for BUG#10969.
mysql-test/t/sp-error.test:
  New test case for BUG#10969.
sql/item.h:
  Get name of local variable for error messages.
sql/sql_yacc.yy:
  Return an error if default() is applied on a local SP variable.
parent 77bd9d36
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -658,4 +658,17 @@ create procedure bug9529_9012345678901234567890123456789012345678901234567890123
begin
end|
ERROR 42000: Identifier name 'bug9529_90123456789012345678901234567890123456789012345678901234567890' is too long
drop procedure if exists bug10969|
create procedure bug10969()
begin
declare s1 int default 0;
select default(s1) from t30;
end|
ERROR 42000: Incorrect column name 's1'
create procedure bug10969()
begin
declare s1 int default 0;
select default(t30.s1) from t30;
end|
drop procedure bug10969|
drop table t1|
+23 −0
Original line number Diff line number Diff line
@@ -930,6 +930,29 @@ begin
end|


#
# BUG#10969: Stored procedures: crash if default() function
#
--disable_warnings
drop procedure if exists bug10969|
--enable_warnings
--error ER_WRONG_COLUMN_NAME
create procedure bug10969()
begin
  declare s1 int default 0;
  select default(s1) from t30;
end|

# This should work
create procedure bug10969()
begin
  declare s1 int default 0;
  select default(t30.s1) from t30;
end|

drop procedure bug10969|


#
# BUG#NNNN: New bug synopsis
#
+7 −0
Original line number Diff line number Diff line
@@ -584,6 +584,13 @@ class Item_splocal : public Item
    Item::maybe_null= TRUE;
  }

  /* For error printing */
  inline void my_name(char **strp, uint *lengthp)
  {
    *strp= m_name.str;
    *lengthp= m_name.length;
  }

  bool is_splocal() { return 1; } /* Needed for error checking */

  Item *this_item();
+12 −1
Original line number Diff line number Diff line
@@ -4343,7 +4343,18 @@ simple_expr:
	| CONVERT_SYM '(' expr USING charset_name ')'
	  { $$= new Item_func_conv_charset($3,$5); }
	| DEFAULT '(' simple_ident ')'
	  { $$= new Item_default_value($3); }
	  {
	    if ($3->is_splocal())
	    {
	      LEX_STRING name;
	      Item_splocal *il= static_cast<Item_splocal *>($3);

	      il->my_name(&name.str, &name.length);
	      my_error(ER_WRONG_COLUMN_NAME, MYF(0), name.str);
	      YYABORT;
	    }
	    $$= new Item_default_value($3);
	  }
	| VALUES '(' simple_ident ')'
	  { $$= new Item_insert_value($3); }
	| FUNC_ARG0 '(' ')'