mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
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.
This commit is contained in:
@ -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|
|
||||
|
@ -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
|
||||
#
|
||||
|
@ -584,6 +584,13 @@ public:
|
||||
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();
|
||||
|
@ -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 '(' ')'
|
||||
|
Reference in New Issue
Block a user