Commit c466a191 authored by unknown's avatar unknown

Fixed memory leaks in SP

Some code cleanup


mysql-test/r/sp.result:
  Update results after adding quotes around function/procedure names
sql/sp.cc:
  Moved DBUG_ENTER after all variable declarations
  Eliminated some variables.
  Added more DBUG_ENTER commands.
  Added memory allocation checking in create_string()
  Fixed memory leak in sp_show_create_function()
  Removed usage of sprintf
sql/sql_parse.cc:
  Simple cleanup
  Fixed memory leaks for mailformed SP definitions
parent 292bb8cb
...@@ -732,7 +732,7 @@ delete from t1| ...@@ -732,7 +732,7 @@ delete from t1|
alter procedure chistics sql security invoker name chistics2| alter procedure chistics sql security invoker name chistics2|
show create procedure chistics2| show create procedure chistics2|
Procedure Create Procedure Procedure Create Procedure
chistics2 CREATE PROCEDURE chistics2() chistics2 CREATE PROCEDURE `chistics2`()
SQL SECURITY INVOKER SQL SECURITY INVOKER
COMMENT 'Characteristics procedure test' COMMENT 'Characteristics procedure test'
insert into t1 values ("chistics", 1) insert into t1 values ("chistics", 1)
...@@ -749,7 +749,7 @@ chistics() ...@@ -749,7 +749,7 @@ chistics()
alter function chistics name chistics2 comment 'Characteristics function test'| alter function chistics name chistics2 comment 'Characteristics function test'|
show create function chistics2| show create function chistics2|
Function Create Function Function Create Function
chistics2 CREATE FUNCTION chistics2() RETURNS int chistics2 CREATE FUNCTION `chistics2`() RETURNS int
DETERMINISTIC DETERMINISTIC
SQL SECURITY INVOKER SQL SECURITY INVOKER
COMMENT 'Characteristics function test' COMMENT 'Characteristics function test'
...@@ -999,7 +999,7 @@ end while; ...@@ -999,7 +999,7 @@ end while;
end| end|
show create procedure opp| show create procedure opp|
Procedure Create Procedure Procedure Create Procedure
opp CREATE PROCEDURE opp(n bigint unsigned, out pp bool) opp CREATE PROCEDURE `opp`(n bigint unsigned, out pp bool)
begin begin
declare r double; declare r double;
declare b, s bigint unsigned default 0; declare b, s bigint unsigned default 0;
...@@ -1096,7 +1096,7 @@ alter procedure bar2 name bar comment "3333333333"| ...@@ -1096,7 +1096,7 @@ alter procedure bar2 name bar comment "3333333333"|
alter procedure bar| alter procedure bar|
show create procedure bar| show create procedure bar|
Procedure Create Procedure Procedure Create Procedure
bar CREATE PROCEDURE bar(x char(16), y int) bar CREATE PROCEDURE `bar`(x char(16), y int)
COMMENT '3333333333' COMMENT '3333333333'
insert into test.t1 values (x, y) insert into test.t1 values (x, y)
show procedure status like 'bar'| show procedure status like 'bar'|
......
This diff is collapsed.
...@@ -3084,23 +3084,23 @@ mysql_execute_command(THD *thd) ...@@ -3084,23 +3084,23 @@ mysql_execute_command(THD *thd)
break; break;
} }
case SQLCOM_CREATE_FUNCTION: // UDF function case SQLCOM_CREATE_FUNCTION: // UDF function
{ {
if (check_access(thd,INSERT_ACL,"mysql",0,1,0)) sp_head *sph;
break; if (check_access(thd,INSERT_ACL,"mysql",0,1,0))
break;
#ifdef HAVE_DLOPEN #ifdef HAVE_DLOPEN
sp_head *sph= sp_find_function(thd, &lex->udf.name); if (!(sph= sp_find_function(thd, &lex->udf.name)))
if (sph) {
{ net_printf(thd, ER_UDF_EXISTS, lex->udf.name.str);
net_printf(thd, ER_UDF_EXISTS, lex->udf.name.str); goto error;
goto error; }
} if (!(res = mysql_create_function(thd,&lex->udf)))
if (!(res = mysql_create_function(thd,&lex->udf))) send_ok(thd);
send_ok(thd);
#else #else
res= -1; res= -1;
#endif #endif
break; break;
} }
#ifndef NO_EMBEDDED_ACCESS_CHECKS #ifndef NO_EMBEDDED_ACCESS_CHECKS
case SQLCOM_DROP_USER: case SQLCOM_DROP_USER:
{ {
...@@ -3374,62 +3374,62 @@ mysql_execute_command(THD *thd) ...@@ -3374,62 +3374,62 @@ mysql_execute_command(THD *thd)
break; break;
case SQLCOM_CREATE_PROCEDURE: case SQLCOM_CREATE_PROCEDURE:
case SQLCOM_CREATE_SPFUNCTION: case SQLCOM_CREATE_SPFUNCTION:
{
if (!lex->sphead) if (!lex->sphead)
{ {
res= -1; // Shouldn't happen res= -1; // Shouldn't happen
break; break;
} }
else uint namelen;
{ char *name= lex->sphead->name(&namelen);
uint namelen;
char *name= lex->sphead->name(&namelen);
#ifdef HAVE_DLOPEN #ifdef HAVE_DLOPEN
if (lex->sphead->m_type == TYPE_ENUM_FUNCTION) if (lex->sphead->m_type == TYPE_ENUM_FUNCTION)
{ {
udf_func *udf = find_udf(name, namelen); udf_func *udf = find_udf(name, namelen);
if (udf)
{
net_printf(thd, ER_UDF_EXISTS, name);
goto error;
}
}
#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);
switch (res) if (udf)
{ {
case SP_OK: net_printf(thd, ER_UDF_EXISTS, name);
send_ok(thd);
delete lex->sphead;
lex->sphead= 0;
break;
case SP_WRITE_ROW_FAILED:
net_printf(thd, ER_SP_ALREADY_EXISTS, SP_TYPE_STRING(lex), name);
delete lex->sphead;
lex->sphead= 0;
goto error;
default:
net_printf(thd, ER_SP_STORE_FAILED, SP_TYPE_STRING(lex), name);
delete lex->sphead; delete lex->sphead;
lex->sphead= 0; lex->sphead=0;
goto error; goto error;
} }
}
#endif
if (lex->sphead->m_type == TYPE_ENUM_FUNCTION &&
!lex->sphead->m_has_return)
{
net_printf(thd, ER_SP_NORETURN, name);
delete lex->sphead;
lex->sphead=0;
goto error;
}
res= lex->sphead->create(thd);
switch (res) {
case SP_OK:
send_ok(thd);
delete lex->sphead;
lex->sphead= 0;
break; break;
case SP_WRITE_ROW_FAILED:
net_printf(thd, ER_SP_ALREADY_EXISTS, SP_TYPE_STRING(lex), name);
delete lex->sphead;
lex->sphead= 0;
goto error;
default:
net_printf(thd, ER_SP_STORE_FAILED, SP_TYPE_STRING(lex), name);
delete lex->sphead;
lex->sphead= 0;
goto error;
} }
break;
}
case SQLCOM_CALL: case SQLCOM_CALL:
{ {
sp_head *sp; sp_head *sp;
sp= sp_find_procedure(thd, &lex->udf.name); if (!(sp= sp_find_procedure(thd, &lex->udf.name)))
if (! sp)
{ {
net_printf(thd, ER_SP_DOES_NOT_EXIST, "PROCEDURE", lex->udf.name); net_printf(thd, ER_SP_DOES_NOT_EXIST, "PROCEDURE", lex->udf.name);
goto error; goto error;
...@@ -3611,6 +3611,7 @@ mysql_execute_command(THD *thd) ...@@ -3611,6 +3611,7 @@ mysql_execute_command(THD *thd)
res= 0; res= 0;
goto error; goto error;
} }
res= 0;
break; break;
} }
case SQLCOM_SHOW_STATUS_PROC: case SQLCOM_SHOW_STATUS_PROC:
...@@ -4157,6 +4158,7 @@ mysql_parse(THD *thd, char *inBuf, uint length) ...@@ -4157,6 +4158,7 @@ mysql_parse(THD *thd, char *inBuf, uint length)
query_cache_abort(&thd->net); query_cache_abort(&thd->net);
if (thd->lex->sphead) if (thd->lex->sphead)
{ {
/* Clean up after failed stored procedure/function */
if (lex != thd->lex) if (lex != thd->lex)
thd->lex->sphead->restore_lex(thd); thd->lex->sphead->restore_lex(thd);
delete thd->lex->sphead; delete thd->lex->sphead;
......
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