mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Check that a FUNCTION contains RETURN and that we actually get a return value.
include/mysqld_error.h: New error codes/messages for missing RETURNs in FUNCTIONs. mysql-test/r/sp-error.result: New error tests for missing RETURNs in FUNCTIONs. mysql-test/t/sp-error.test: New error tests for missing RETURNs in FUNCTIONs. sql/share/czech/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/danish/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/dutch/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/english/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/estonian/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/french/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/german/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/greek/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/hungarian/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/italian/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/japanese/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/korean/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/norwegian-ny/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/norwegian/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/polish/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/portuguese/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/romanian/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/russian/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/serbian/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/slovak/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/spanish/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/swedish/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/share/ukrainian/errmsg.txt: New error codes/messages for missing RETURNs in FUNCTIONs. sql/sp_head.h: Check that a FUNCTION contains RETURN. sql/sql_parse.cc: Check that a FUNCTION contains RETURN. sql/sql_yacc.yy: Check that a FUNCTION contains RETURN.
This commit is contained in:
@ -312,4 +312,6 @@
|
|||||||
#define ER_QUERY_INTERRUPTED 1293
|
#define ER_QUERY_INTERRUPTED 1293
|
||||||
#define ER_SP_WRONG_NO_OF_ARGS 1294
|
#define ER_SP_WRONG_NO_OF_ARGS 1294
|
||||||
#define ER_SP_COND_MISMATCH 1295
|
#define ER_SP_COND_MISMATCH 1295
|
||||||
#define ER_ERROR_MESSAGES 296
|
#define ER_SP_NORETURN 1296
|
||||||
|
#define ER_SP_NORETURNEND 1297
|
||||||
|
#define ER_ERROR_MESSAGES 298
|
||||||
|
@ -121,3 +121,20 @@ set res = 1;
|
|||||||
end if;
|
end if;
|
||||||
end;
|
end;
|
||||||
ERROR HY000: Undefined CONDITION: bar
|
ERROR HY000: Undefined CONDITION: bar
|
||||||
|
create function f(val int) returns int
|
||||||
|
begin
|
||||||
|
declare x int;
|
||||||
|
set x = val+3;
|
||||||
|
end;
|
||||||
|
ERROR HY000: No RETURN found in FUNCTION f
|
||||||
|
create function f(val int) returns int
|
||||||
|
begin
|
||||||
|
declare x int;
|
||||||
|
set x = val+3;
|
||||||
|
if x < 4 then
|
||||||
|
return x;
|
||||||
|
end if;
|
||||||
|
end;
|
||||||
|
select f(10);
|
||||||
|
ERROR HY000: FUNCTION f ended without RETURN
|
||||||
|
drop function f;
|
||||||
|
@ -171,4 +171,27 @@ begin
|
|||||||
end if;
|
end if;
|
||||||
end|
|
end|
|
||||||
|
|
||||||
|
--error 1296
|
||||||
|
create function f(val int) returns int
|
||||||
|
begin
|
||||||
|
declare x int;
|
||||||
|
|
||||||
|
set x = val+3;
|
||||||
|
end|
|
||||||
|
|
||||||
|
create function f(val int) returns int
|
||||||
|
begin
|
||||||
|
declare x int;
|
||||||
|
|
||||||
|
set x = val+3;
|
||||||
|
if x < 4 then
|
||||||
|
return x;
|
||||||
|
end if;
|
||||||
|
end|
|
||||||
|
|
||||||
|
--error 1297
|
||||||
|
select f(10)|
|
||||||
|
|
||||||
|
drop function f|
|
||||||
|
|
||||||
delimiter ;|
|
delimiter ;|
|
||||||
|
@ -308,3 +308,5 @@ character-set=latin2
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -302,3 +302,5 @@ character-set=latin1
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -310,3 +310,5 @@ character-set=latin1
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -299,3 +299,5 @@ character-set=latin1
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -304,3 +304,5 @@ character-set=latin7
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -299,3 +299,5 @@ character-set=latin1
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -308,3 +308,5 @@ character-set=latin1
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -299,3 +299,5 @@ character-set=greek
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -301,3 +301,5 @@ character-set=latin2
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -299,3 +299,5 @@ character-set=latin1
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -301,3 +301,5 @@ character-set=ujis
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -299,3 +299,5 @@ character-set=euckr
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -301,3 +301,5 @@ character-set=latin1
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -301,3 +301,5 @@ character-set=latin1
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -303,3 +303,5 @@ character-set=latin2
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -300,3 +300,5 @@ character-set=latin1
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -303,3 +303,5 @@ character-set=latin2
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -301,3 +301,5 @@ character-set=koi8r
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -294,3 +294,5 @@ character-set=cp1250
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -307,3 +307,5 @@ character-set=latin2
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -301,3 +301,5 @@ character-set=latin1
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -299,3 +299,5 @@ character-set=latin1
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -304,3 +304,5 @@ character-set=koi8u
|
|||||||
"Query execution was interrupted"
|
"Query execution was interrupted"
|
||||||
"Wrong number of arguments for %s %s, expected %u, got %u"
|
"Wrong number of arguments for %s %s, expected %u, got %u"
|
||||||
"Undefined CONDITION: %s"
|
"Undefined CONDITION: %s"
|
||||||
|
"No RETURN found in FUNCTION %s"
|
||||||
|
"FUNCTION %s ended without RETURN"
|
||||||
|
@ -120,7 +120,8 @@ sp_head::operator delete(void *ptr, size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sp_head::sp_head()
|
sp_head::sp_head()
|
||||||
: Sql_alloc(), m_simple_case(FALSE), m_multi_results(FALSE), m_free_list(NULL)
|
: Sql_alloc(), m_has_return(FALSE), m_simple_case(FALSE),
|
||||||
|
m_multi_results(FALSE), m_free_list(NULL)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("sp_head::sp_head");
|
DBUG_ENTER("sp_head::sp_head");
|
||||||
|
|
||||||
@ -321,7 +322,18 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp)
|
|||||||
|
|
||||||
ret= execute(thd);
|
ret= execute(thd);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
*resp= nctx->get_result();
|
{
|
||||||
|
Item *it= nctx->get_result();
|
||||||
|
|
||||||
|
if (it)
|
||||||
|
*resp= it;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
my_printf_error(ER_SP_NORETURNEND, ER(ER_SP_NORETURNEND), MYF(0),
|
||||||
|
m_name.str);
|
||||||
|
ret= -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
thd->spcont= octx;
|
thd->spcont= octx;
|
||||||
DBUG_RETURN(ret);
|
DBUG_RETURN(ret);
|
||||||
|
@ -47,6 +47,7 @@ public:
|
|||||||
|
|
||||||
int m_type; // TYPE_ENUM_FUNCTION or TYPE_ENUM_PROCEDURE
|
int m_type; // TYPE_ENUM_FUNCTION or TYPE_ENUM_PROCEDURE
|
||||||
enum enum_field_types m_returns; // For FUNCTIONs only
|
enum enum_field_types m_returns; // For FUNCTIONs only
|
||||||
|
my_bool m_has_return; // For FUNCTIONs only
|
||||||
my_bool m_simple_case; // TRUE if parsing simple case, FALSE otherwise
|
my_bool m_simple_case; // TRUE if parsing simple case, FALSE otherwise
|
||||||
my_bool m_multi_results; // TRUE if a procedure with SELECT(s)
|
my_bool m_multi_results; // TRUE if a procedure with SELECT(s)
|
||||||
uint m_old_cmq; // Old CLIENT_MULTI_QUERIES value
|
uint m_old_cmq; // Old CLIENT_MULTI_QUERIES value
|
||||||
|
@ -3226,6 +3226,13 @@ mysql_execute_command(THD *thd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
if (lex->sphead->m_type == TYPE_ENUM_FUNCTION &&
|
||||||
|
!lex->sphead->m_has_return)
|
||||||
|
{
|
||||||
|
net_printf(thd, ER_SP_NORETURN, name);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
res= lex->sphead->create(thd);
|
res= lex->sphead->create(thd);
|
||||||
|
|
||||||
switch (res)
|
switch (res)
|
||||||
|
@ -1424,6 +1424,7 @@ sp_proc_stmt:
|
|||||||
$2, lex->sphead->m_returns);
|
$2, lex->sphead->m_returns);
|
||||||
|
|
||||||
lex->sphead->add_instr(i);
|
lex->sphead->add_instr(i);
|
||||||
|
lex->sphead->m_has_return= TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
| IF sp_if END IF {}
|
| IF sp_if END IF {}
|
||||||
|
Reference in New Issue
Block a user