mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Post-review fixes, mainly fixing all print() methods for sp_instr* classes.
Also added mysql-test files: include/is_debug_build.inc r/is_debug_build.require r/sp-code.result t/sp-code.test
This commit is contained in:
4
mysql-test/include/is_debug_build.inc
Normal file
4
mysql-test/include/is_debug_build.inc
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
-- require r/is_debug_build.require
|
||||||
|
--disable_query_log
|
||||||
|
select instr(version(), "debug") > 0;
|
||||||
|
--enable_query_log
|
2
mysql-test/r/is_debug_build.require
Normal file
2
mysql-test/r/is_debug_build.require
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
instr(version(), "debug") > 0
|
||||||
|
1
|
65
mysql-test/r/sp-code.result
Normal file
65
mysql-test/r/sp-code.result
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
select version(), substring_index(version(), "-", -1);
|
||||||
|
version() substring_index(version(), "-", -1)
|
||||||
|
5.0.17-debug-log log
|
||||||
|
create procedure empty()
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
show procedure code empty;
|
||||||
|
Pos Instruction
|
||||||
|
drop procedure empty;
|
||||||
|
create function almost_empty()
|
||||||
|
returns int
|
||||||
|
return 0;
|
||||||
|
show function code almost_empty;
|
||||||
|
Pos Instruction
|
||||||
|
0 freturn 3 0
|
||||||
|
drop function almost_empty;
|
||||||
|
create procedure code_sample(x int, out err int, out nulls int)
|
||||||
|
begin
|
||||||
|
declare count int default 0;
|
||||||
|
set nulls = 0;
|
||||||
|
begin
|
||||||
|
declare c cursor for select name from t1;
|
||||||
|
declare exit handler for not found close c;
|
||||||
|
open c;
|
||||||
|
loop
|
||||||
|
begin
|
||||||
|
declare n varchar(20);
|
||||||
|
declare continue handler for sqlexception set err=1;
|
||||||
|
fetch c into n;
|
||||||
|
if isnull(n) then
|
||||||
|
set nulls = nulls + 1;
|
||||||
|
else
|
||||||
|
set count = count + 1;
|
||||||
|
update t2 set idx = count where name=n;
|
||||||
|
end if;
|
||||||
|
end;
|
||||||
|
end loop;
|
||||||
|
end;
|
||||||
|
select t.name, t.idx from t2 t order by idx asc;
|
||||||
|
end//
|
||||||
|
show procedure code code_sample;
|
||||||
|
Pos Instruction
|
||||||
|
0 set count@3 0
|
||||||
|
1 set nulls@2 0
|
||||||
|
2 cpush c@0
|
||||||
|
3 hpush_jump 6 4 EXIT
|
||||||
|
4 cclose c@0
|
||||||
|
5 hreturn 0 19
|
||||||
|
6 copen c@0
|
||||||
|
7 set n@4 NULL
|
||||||
|
8 hpush_jump 11 5 CONTINUE
|
||||||
|
9 set err@1 1
|
||||||
|
10 hreturn 5
|
||||||
|
11 cfetch c@0 n@4
|
||||||
|
12 jump_if_not 15 isnull(n@4)
|
||||||
|
13 set nulls@2 (nulls@2 + 1)
|
||||||
|
14 jump 17
|
||||||
|
15 set count@3 (count@3 + 1)
|
||||||
|
16 stmt 4 "update t2 set idx = count where name=n"
|
||||||
|
17 hpop 1
|
||||||
|
18 jump 7
|
||||||
|
19 hpop 1
|
||||||
|
20 cpop 1
|
||||||
|
21 stmt 0 "select t.name, t.idx from t2 t order ..."
|
||||||
|
drop procedure code_sample;
|
50
mysql-test/t/sp-code.test
Normal file
50
mysql-test/t/sp-code.test
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#
|
||||||
|
# Test the debugging feature "show procedure/function code <name>"
|
||||||
|
#
|
||||||
|
|
||||||
|
-- source include/is_debug_build.inc
|
||||||
|
select version(), substring_index(version(), "-", -1);
|
||||||
|
|
||||||
|
create procedure empty()
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
show procedure code empty;
|
||||||
|
drop procedure empty;
|
||||||
|
|
||||||
|
create function almost_empty()
|
||||||
|
returns int
|
||||||
|
return 0;
|
||||||
|
show function code almost_empty;
|
||||||
|
drop function almost_empty;
|
||||||
|
|
||||||
|
delimiter //;
|
||||||
|
create procedure code_sample(x int, out err int, out nulls int)
|
||||||
|
begin
|
||||||
|
declare count int default 0;
|
||||||
|
|
||||||
|
set nulls = 0;
|
||||||
|
begin
|
||||||
|
declare c cursor for select name from t1;
|
||||||
|
declare exit handler for not found close c;
|
||||||
|
|
||||||
|
open c;
|
||||||
|
loop
|
||||||
|
begin
|
||||||
|
declare n varchar(20);
|
||||||
|
declare continue handler for sqlexception set err=1;
|
||||||
|
|
||||||
|
fetch c into n;
|
||||||
|
if isnull(n) then
|
||||||
|
set nulls = nulls + 1;
|
||||||
|
else
|
||||||
|
set count = count + 1;
|
||||||
|
update t2 set idx = count where name=n;
|
||||||
|
end if;
|
||||||
|
end;
|
||||||
|
end loop;
|
||||||
|
end;
|
||||||
|
select t.name, t.idx from t2 t order by idx asc;
|
||||||
|
end//
|
||||||
|
delimiter ;//
|
||||||
|
show procedure code code_sample;
|
||||||
|
drop procedure code_sample;
|
162
sql/sp_head.cc
162
sql/sp_head.cc
@ -1853,14 +1853,13 @@ sp_head::show_routine_code(THD *thd)
|
|||||||
Protocol *protocol= thd->protocol;
|
Protocol *protocol= thd->protocol;
|
||||||
char buff[2048];
|
char buff[2048];
|
||||||
String buffer(buff, sizeof(buff), system_charset_info);
|
String buffer(buff, sizeof(buff), system_charset_info);
|
||||||
int res;
|
|
||||||
List<Item> field_list;
|
List<Item> field_list;
|
||||||
bool full_access;
|
|
||||||
uint ip;
|
|
||||||
sp_instr *i;
|
sp_instr *i;
|
||||||
|
bool full_access;
|
||||||
|
int res;
|
||||||
|
uint ip;
|
||||||
DBUG_ENTER("sp_head::show_routine_code");
|
DBUG_ENTER("sp_head::show_routine_code");
|
||||||
DBUG_PRINT("info", ("procedure %s", m_name.str));
|
DBUG_PRINT("info", ("procedure: %s", m_name.str));
|
||||||
|
|
||||||
if (check_show_routine_access(thd, this, &full_access) || !full_access)
|
if (check_show_routine_access(thd, this, &full_access) || !full_access)
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
@ -1880,7 +1879,7 @@ sp_head::show_routine_code(THD *thd)
|
|||||||
|
|
||||||
buffer.set("", 0, system_charset_info);
|
buffer.set("", 0, system_charset_info);
|
||||||
i->print(&buffer);
|
i->print(&buffer);
|
||||||
protocol->store(buffer.c_ptr_quick(), buffer.length(), system_charset_info);
|
protocol->store(buffer.ptr(), buffer.length(), system_charset_info);
|
||||||
if ((res= protocol->write()))
|
if ((res= protocol->write()))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2055,10 +2054,12 @@ sp_instr_stmt::print(String *str)
|
|||||||
{
|
{
|
||||||
uint i, len;
|
uint i, len;
|
||||||
|
|
||||||
str->reserve(STMT_PRINT_MAXLEN+20);
|
/* Reserve enough space for 'stmt CMD "..."'; max+20 is more than enough. */
|
||||||
str->append("stmt ");
|
if (str->reserve(STMT_PRINT_MAXLEN+20))
|
||||||
|
return;
|
||||||
|
str->qs_append("stmt ", 5);
|
||||||
str->qs_append((uint)m_lex_keeper.sql_command());
|
str->qs_append((uint)m_lex_keeper.sql_command());
|
||||||
str->append(" \"");
|
str->qs_append(" \"", 2);
|
||||||
len= m_query.length;
|
len= m_query.length;
|
||||||
/*
|
/*
|
||||||
Print the query string (but not too much of it), just to indicate which
|
Print the query string (but not too much of it), just to indicate which
|
||||||
@ -2068,13 +2069,15 @@ sp_instr_stmt::print(String *str)
|
|||||||
len= STMT_PRINT_MAXLEN-3;
|
len= STMT_PRINT_MAXLEN-3;
|
||||||
/* Copy the query string and replace '\n' with ' ' in the process */
|
/* Copy the query string and replace '\n' with ' ' in the process */
|
||||||
for (i= 0 ; i < len ; i++)
|
for (i= 0 ; i < len ; i++)
|
||||||
|
{
|
||||||
if (m_query.str[i] == '\n')
|
if (m_query.str[i] == '\n')
|
||||||
str->append(' ');
|
str->qs_append(' ');
|
||||||
else
|
else
|
||||||
str->append(m_query.str[i]);
|
str->qs_append(m_query.str[i]);
|
||||||
|
}
|
||||||
if (m_query.length > STMT_PRINT_MAXLEN)
|
if (m_query.length > STMT_PRINT_MAXLEN)
|
||||||
str->append("..."); /* Indicate truncated string */
|
str->qs_append("...", 3); /* Indicate truncated string */
|
||||||
str->append('"');
|
str->qs_append('"');
|
||||||
}
|
}
|
||||||
#undef STMT_PRINT_MAXLEN
|
#undef STMT_PRINT_MAXLEN
|
||||||
|
|
||||||
@ -2119,15 +2122,16 @@ sp_instr_set::print(String *str)
|
|||||||
/* 'var' should always be non-null, but just in case... */
|
/* 'var' should always be non-null, but just in case... */
|
||||||
if (var)
|
if (var)
|
||||||
rsrv+= var->name.length;
|
rsrv+= var->name.length;
|
||||||
str->reserve(rsrv);
|
if (str->reserve(rsrv))
|
||||||
str->append("set ");
|
return;
|
||||||
|
str->qs_append("set ", 4);
|
||||||
if (var)
|
if (var)
|
||||||
{
|
{
|
||||||
str->append(var->name.str, var->name.length);
|
str->qs_append(var->name.str, var->name.length);
|
||||||
str->append('@');
|
str->qs_append('@');
|
||||||
}
|
}
|
||||||
str->qs_append(m_offset);
|
str->qs_append(m_offset);
|
||||||
str->append(' ');
|
str->qs_append(' ');
|
||||||
m_value->print(str);
|
m_value->print(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2184,8 +2188,9 @@ sp_instr_jump::execute(THD *thd, uint *nextp)
|
|||||||
void
|
void
|
||||||
sp_instr_jump::print(String *str)
|
sp_instr_jump::print(String *str)
|
||||||
{
|
{
|
||||||
str->reserve(12);
|
if (str->reserve(12))
|
||||||
str->append("jump ");
|
return;
|
||||||
|
str->qs_append("jump ", 5);
|
||||||
str->qs_append(m_dest);
|
str->qs_append(m_dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2266,10 +2271,11 @@ sp_instr_jump_if::exec_core(THD *thd, uint *nextp)
|
|||||||
void
|
void
|
||||||
sp_instr_jump_if::print(String *str)
|
sp_instr_jump_if::print(String *str)
|
||||||
{
|
{
|
||||||
str->reserve(12);
|
if (str->reserve(32))
|
||||||
str->append("jump_if ");
|
return;
|
||||||
|
str->qs_append("jump_if ", 8);
|
||||||
str->qs_append(m_dest);
|
str->qs_append(m_dest);
|
||||||
str->append(' ');
|
str->qs_append(' ');
|
||||||
m_expr->print(str);
|
m_expr->print(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2327,10 +2333,11 @@ sp_instr_jump_if_not::exec_core(THD *thd, uint *nextp)
|
|||||||
void
|
void
|
||||||
sp_instr_jump_if_not::print(String *str)
|
sp_instr_jump_if_not::print(String *str)
|
||||||
{
|
{
|
||||||
str->reserve(16);
|
if (str->reserve(32))
|
||||||
str->append("jump_if_not ");
|
return;
|
||||||
|
str->qs_append("jump_if_not ", 12);
|
||||||
str->qs_append(m_dest);
|
str->qs_append(m_dest);
|
||||||
str->append(' ');
|
str->qs_append(' ');
|
||||||
m_expr->print(str);
|
m_expr->print(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2385,10 +2392,11 @@ sp_instr_freturn::exec_core(THD *thd, uint *nextp)
|
|||||||
void
|
void
|
||||||
sp_instr_freturn::print(String *str)
|
sp_instr_freturn::print(String *str)
|
||||||
{
|
{
|
||||||
str->reserve(12);
|
if (str->reserve(32))
|
||||||
str->append("freturn ");
|
return;
|
||||||
|
str->qs_append("freturn ", 8);
|
||||||
str->qs_append((uint)m_type);
|
str->qs_append((uint)m_type);
|
||||||
str->append(' ');
|
str->qs_append(' ');
|
||||||
m_value->print(str);
|
m_value->print(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2413,27 +2421,28 @@ sp_instr_hpush_jump::execute(THD *thd, uint *nextp)
|
|||||||
void
|
void
|
||||||
sp_instr_hpush_jump::print(String *str)
|
sp_instr_hpush_jump::print(String *str)
|
||||||
{
|
{
|
||||||
str->reserve(32);
|
if (str->reserve(32))
|
||||||
str->append("hpush_jump ");
|
return;
|
||||||
|
str->qs_append("hpush_jump ", 11);
|
||||||
str->qs_append(m_dest);
|
str->qs_append(m_dest);
|
||||||
str->append(' ');
|
str->qs_append(' ');
|
||||||
str->qs_append(m_frame);
|
str->qs_append(m_frame);
|
||||||
switch (m_type)
|
switch (m_type)
|
||||||
{
|
{
|
||||||
case SP_HANDLER_NONE:
|
case SP_HANDLER_NONE:
|
||||||
str->append(" NONE"); // This would be a bug
|
str->qs_append(" NONE", 5); // This would be a bug
|
||||||
break;
|
break;
|
||||||
case SP_HANDLER_EXIT:
|
case SP_HANDLER_EXIT:
|
||||||
str->append(" EXIT");
|
str->qs_append(" EXIT", 5);
|
||||||
break;
|
break;
|
||||||
case SP_HANDLER_CONTINUE:
|
case SP_HANDLER_CONTINUE:
|
||||||
str->append(" CONTINUE");
|
str->qs_append(" CONTINUE", 9);
|
||||||
break;
|
break;
|
||||||
case SP_HANDLER_UNDO:
|
case SP_HANDLER_UNDO:
|
||||||
str->append(" UNDO");
|
str->qs_append(" UNDO", 5);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
str->append(" UNKNOWN:"); // This would be a bug as well
|
str->qs_append(" UNKNOWN:", 9); // This would be a bug as well
|
||||||
str->qs_append(m_type);
|
str->qs_append(m_type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2470,8 +2479,9 @@ sp_instr_hpop::execute(THD *thd, uint *nextp)
|
|||||||
void
|
void
|
||||||
sp_instr_hpop::print(String *str)
|
sp_instr_hpop::print(String *str)
|
||||||
{
|
{
|
||||||
str->reserve(12);
|
if (str->reserve(12))
|
||||||
str->append("hpop ");
|
return;
|
||||||
|
str->qs_append("hpop ", 5);
|
||||||
str->qs_append(m_count);
|
str->qs_append(m_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2505,12 +2515,13 @@ sp_instr_hreturn::execute(THD *thd, uint *nextp)
|
|||||||
void
|
void
|
||||||
sp_instr_hreturn::print(String *str)
|
sp_instr_hreturn::print(String *str)
|
||||||
{
|
{
|
||||||
str->reserve(16);
|
if (str->reserve(20))
|
||||||
str->append("hreturn ");
|
return;
|
||||||
|
str->qs_append("hreturn ", 8);
|
||||||
str->qs_append(m_frame);
|
str->qs_append(m_frame);
|
||||||
if (m_dest)
|
if (m_dest)
|
||||||
{
|
{
|
||||||
str->append(' ');
|
str->qs_append(' ');
|
||||||
str->qs_append(m_dest);
|
str->qs_append(m_dest);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2559,14 +2570,18 @@ void
|
|||||||
sp_instr_cpush::print(String *str)
|
sp_instr_cpush::print(String *str)
|
||||||
{
|
{
|
||||||
LEX_STRING n;
|
LEX_STRING n;
|
||||||
|
uint rsrv= 12;
|
||||||
my_bool found= m_ctx->find_cursor(m_cursor, &n);
|
my_bool found= m_ctx->find_cursor(m_cursor, &n);
|
||||||
|
|
||||||
str->reserve(32);
|
if (found)
|
||||||
str->append("cpush ");
|
rsrv+= n.length;
|
||||||
|
if (str->reserve(rsrv))
|
||||||
|
return;
|
||||||
|
str->qs_append("cpush ", 6);
|
||||||
if (found)
|
if (found)
|
||||||
{
|
{
|
||||||
str->append(n.str, n.length);
|
str->qs_append(n.str, n.length);
|
||||||
str->append('@');
|
str->qs_append('@');
|
||||||
}
|
}
|
||||||
str->qs_append(m_cursor);
|
str->qs_append(m_cursor);
|
||||||
}
|
}
|
||||||
@ -2589,8 +2604,9 @@ sp_instr_cpop::execute(THD *thd, uint *nextp)
|
|||||||
void
|
void
|
||||||
sp_instr_cpop::print(String *str)
|
sp_instr_cpop::print(String *str)
|
||||||
{
|
{
|
||||||
str->reserve(12);
|
if (str->reserve(12))
|
||||||
str->append("cpop ");
|
return;
|
||||||
|
str->qs_append("cpop ", 5);
|
||||||
str->qs_append(m_count);
|
str->qs_append(m_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2665,14 +2681,18 @@ void
|
|||||||
sp_instr_copen::print(String *str)
|
sp_instr_copen::print(String *str)
|
||||||
{
|
{
|
||||||
LEX_STRING n;
|
LEX_STRING n;
|
||||||
|
uint rsrv= 16;
|
||||||
my_bool found= m_ctx->find_cursor(m_cursor, &n);
|
my_bool found= m_ctx->find_cursor(m_cursor, &n);
|
||||||
|
|
||||||
str->reserve(32);
|
if (found)
|
||||||
str->append("copen ");
|
rsrv+= n.length;
|
||||||
|
if (str->reserve(rsrv))
|
||||||
|
return;
|
||||||
|
str->qs_append("copen ", 6);
|
||||||
if (found)
|
if (found)
|
||||||
{
|
{
|
||||||
str->append(n.str, n.length);
|
str->qs_append(n.str, n.length);
|
||||||
str->append('@');
|
str->qs_append('@');
|
||||||
}
|
}
|
||||||
str->qs_append(m_cursor);
|
str->qs_append(m_cursor);
|
||||||
}
|
}
|
||||||
@ -2702,14 +2722,18 @@ void
|
|||||||
sp_instr_cclose::print(String *str)
|
sp_instr_cclose::print(String *str)
|
||||||
{
|
{
|
||||||
LEX_STRING n;
|
LEX_STRING n;
|
||||||
|
uint rsrv= 16;
|
||||||
my_bool found= m_ctx->find_cursor(m_cursor, &n);
|
my_bool found= m_ctx->find_cursor(m_cursor, &n);
|
||||||
|
|
||||||
str->reserve(32);
|
if (found)
|
||||||
str->append("cclose ");
|
rsrv+= n.length;
|
||||||
|
if (str->reserve(rsrv))
|
||||||
|
return;
|
||||||
|
str->qs_append("cclose ", 7);
|
||||||
if (found)
|
if (found)
|
||||||
{
|
{
|
||||||
str->append(n.str, n.length);
|
str->qs_append(n.str, n.length);
|
||||||
str->append('@');
|
str->qs_append('@');
|
||||||
}
|
}
|
||||||
str->qs_append(m_cursor);
|
str->qs_append(m_cursor);
|
||||||
}
|
}
|
||||||
@ -2740,22 +2764,27 @@ sp_instr_cfetch::print(String *str)
|
|||||||
List_iterator_fast<struct sp_pvar> li(m_varlist);
|
List_iterator_fast<struct sp_pvar> li(m_varlist);
|
||||||
sp_pvar_t *pv;
|
sp_pvar_t *pv;
|
||||||
LEX_STRING n;
|
LEX_STRING n;
|
||||||
|
uint rsrv= 16;
|
||||||
my_bool found= m_ctx->find_cursor(m_cursor, &n);
|
my_bool found= m_ctx->find_cursor(m_cursor, &n);
|
||||||
|
|
||||||
str->reserve(32);
|
if (found)
|
||||||
str->append("cfetch ");
|
rsrv+= n.length;
|
||||||
|
if (str->reserve(rsrv))
|
||||||
|
return;
|
||||||
|
str->qs_append("cfetch ", 7);
|
||||||
if (found)
|
if (found)
|
||||||
{
|
{
|
||||||
str->append(n.str, n.length);
|
str->qs_append(n.str, n.length);
|
||||||
str->append('@');
|
str->qs_append('@');
|
||||||
}
|
}
|
||||||
str->qs_append(m_cursor);
|
str->qs_append(m_cursor);
|
||||||
while ((pv= li++))
|
while ((pv= li++))
|
||||||
{
|
{
|
||||||
str->reserve(16);
|
if (str->reserve(pv->name.length+10))
|
||||||
str->append(' ');
|
return;
|
||||||
str->append(pv->name.str, pv->name.length);
|
str->qs_append(' ');
|
||||||
str->append('@');
|
str->qs_append(pv->name.str, pv->name.length);
|
||||||
|
str->qs_append('@');
|
||||||
str->qs_append(pv->offset);
|
str->qs_append(pv->offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2779,8 +2808,9 @@ sp_instr_error::execute(THD *thd, uint *nextp)
|
|||||||
void
|
void
|
||||||
sp_instr_error::print(String *str)
|
sp_instr_error::print(String *str)
|
||||||
{
|
{
|
||||||
str->reserve(12);
|
if (str->reserve(12))
|
||||||
str->append("error ");
|
return;
|
||||||
|
str->qs_append("error ", 6);
|
||||||
str->qs_append(m_errcode);
|
str->qs_append(m_errcode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,19 +177,18 @@ sp_pcontext::find_pvar(LEX_STRING *name, my_bool scoped)
|
|||||||
- For printing of sp_instr_set. (Debug mode only.)
|
- For printing of sp_instr_set. (Debug mode only.)
|
||||||
*/
|
*/
|
||||||
sp_pvar_t *
|
sp_pvar_t *
|
||||||
sp_pcontext::find_pvar(uint i)
|
sp_pcontext::find_pvar(uint offset)
|
||||||
{
|
{
|
||||||
if (m_poffset <= i && i < m_poffset + m_pvar.elements)
|
if (m_poffset <= offset && offset < m_poffset + m_pvar.elements)
|
||||||
{ // This frame
|
{ // This frame
|
||||||
sp_pvar_t *p;
|
sp_pvar_t *p;
|
||||||
|
|
||||||
get_dynamic(&m_pvar, (gptr)&p, i - m_poffset);
|
get_dynamic(&m_pvar, (gptr)&p, offset - m_poffset);
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
else if (m_parent)
|
if (m_parent)
|
||||||
return m_parent->find_pvar(i); // Some previous frame
|
return m_parent->find_pvar(offset); // Some previous frame
|
||||||
else
|
return NULL; // index out of bounds
|
||||||
return NULL; // index out of bounds
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -360,16 +359,15 @@ sp_pcontext::find_cursor(LEX_STRING *name, uint *poff, my_bool scoped)
|
|||||||
This is only used for debugging.
|
This is only used for debugging.
|
||||||
*/
|
*/
|
||||||
my_bool
|
my_bool
|
||||||
sp_pcontext::find_cursor(uint i, LEX_STRING *n)
|
sp_pcontext::find_cursor(uint offset, LEX_STRING *n)
|
||||||
{
|
{
|
||||||
if (m_coffset <= i && i < m_coffset + m_cursor.elements)
|
if (m_coffset <= offset && offset < m_coffset + m_cursor.elements)
|
||||||
{ // This frame
|
{ // This frame
|
||||||
get_dynamic(&m_cursor, (gptr)n, i - m_poffset);
|
get_dynamic(&m_cursor, (gptr)n, offset - m_coffset);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
else if (m_parent)
|
if (m_parent)
|
||||||
return m_parent->find_cursor(i, n); // Some previous frame
|
return m_parent->find_cursor(offset, n); // Some previous frame
|
||||||
else
|
return FALSE; // index out of bounds
|
||||||
return FALSE; // index out of bounds
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,9 +170,9 @@ class sp_pcontext : public Sql_alloc
|
|||||||
sp_pvar_t *
|
sp_pvar_t *
|
||||||
find_pvar(LEX_STRING *name, my_bool scoped=0);
|
find_pvar(LEX_STRING *name, my_bool scoped=0);
|
||||||
|
|
||||||
// Find by index
|
// Find by offset
|
||||||
sp_pvar_t *
|
sp_pvar_t *
|
||||||
find_pvar(uint i);
|
find_pvar(uint offset);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Labels
|
// Labels
|
||||||
@ -252,9 +252,9 @@ class sp_pcontext : public Sql_alloc
|
|||||||
my_bool
|
my_bool
|
||||||
find_cursor(LEX_STRING *name, uint *poff, my_bool scoped=0);
|
find_cursor(LEX_STRING *name, uint *poff, my_bool scoped=0);
|
||||||
|
|
||||||
/* Find by index (for debugging only) */
|
/* Find by offset (for debugging only) */
|
||||||
my_bool
|
my_bool
|
||||||
find_cursor(uint i, LEX_STRING *n);
|
find_cursor(uint offset, LEX_STRING *n);
|
||||||
|
|
||||||
inline uint
|
inline uint
|
||||||
max_cursors()
|
max_cursors()
|
||||||
|
@ -4576,7 +4576,8 @@ end_with_restore_list:
|
|||||||
else
|
else
|
||||||
sp= sp_find_function(thd, lex->spname);
|
sp= sp_find_function(thd, lex->spname);
|
||||||
if (!sp || !sp->show_routine_code(thd))
|
if (!sp || !sp->show_routine_code(thd))
|
||||||
{ /* We don't distinguish between errors for now */
|
{
|
||||||
|
/* We don't distinguish between errors for now */
|
||||||
my_error(ER_SP_DOES_NOT_EXIST, MYF(0),
|
my_error(ER_SP_DOES_NOT_EXIST, MYF(0),
|
||||||
SP_COM_STRING(lex), lex->spname->m_name.str);
|
SP_COM_STRING(lex), lex->spname->m_name.str);
|
||||||
goto error;
|
goto error;
|
||||||
|
Reference in New Issue
Block a user