Bug#15463: EXPLAIN SELECT..INTO hangs the client (QB, command line)
There were two distict bugs: parse error was returned for valid statement and that error wasn't reported to the client. The fix ensures that EXPLAIN SELECT..INTO is accepted by parser and any other parse error will be reported to the client.
This commit is contained in:
parent
c40f8557dc
commit
96f0aa3cfb
@ -53,3 +53,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE ÔÁÂ ref ÉÎÄ0,ÉÎÄ01 ÉÎÄ0 5 const 1 Using where; Using index
|
||||
drop table ÔÁÂ;
|
||||
set names latin1;
|
||||
select 3 into @v1;
|
||||
explain select 3 into @v1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
|
@ -43,3 +43,12 @@ drop table
|
||||
set names latin1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
|
||||
#
|
||||
# Bug#15463: EXPLAIN SELECT..INTO hangs the client (QB, command line)
|
||||
#
|
||||
select 3 into @v1;
|
||||
explain select 3 into @v1;
|
||||
|
||||
# End of 5.0 tests.
|
||||
|
@ -5709,6 +5709,7 @@ void mysql_parse(THD *thd, char *inBuf, uint length)
|
||||
}
|
||||
else
|
||||
{
|
||||
DBUG_ASSERT(thd->net.report_error);
|
||||
DBUG_PRINT("info",("Command aborted. Fatal_error: %d",
|
||||
thd->is_fatal_error));
|
||||
query_cache_abort(&thd->net);
|
||||
|
@ -5795,7 +5795,11 @@ select_var_ident:
|
||||
if (lex->result)
|
||||
((select_dumpvar *)lex->result)->var_list.push_back( new my_var($2,0,0,(enum_field_types)0));
|
||||
else
|
||||
YYABORT;
|
||||
/*
|
||||
The parser won't create select_result instance only
|
||||
if it's an EXPLAIN.
|
||||
*/
|
||||
DBUG_ASSERT(lex->describe);
|
||||
}
|
||||
| ident_or_text
|
||||
{
|
||||
@ -5807,10 +5811,8 @@ select_var_ident:
|
||||
my_error(ER_SP_UNDECLARED_VAR, MYF(0), $1.str);
|
||||
YYABORT;
|
||||
}
|
||||
if (! lex->result)
|
||||
YYABORT;
|
||||
else
|
||||
{
|
||||
if (lex->result)
|
||||
{
|
||||
my_var *var;
|
||||
((select_dumpvar *)lex->result)->
|
||||
var_list.push_back(var= new my_var($1,1,t->offset,t->type));
|
||||
@ -5818,6 +5820,14 @@ select_var_ident:
|
||||
if (var)
|
||||
var->sp= lex->sphead;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
The parser won't create select_result instance only
|
||||
if it's an EXPLAIN.
|
||||
*/
|
||||
DBUG_ASSERT(lex->describe);
|
||||
}
|
||||
}
|
||||
;
|
||||
|
Loading…
x
Reference in New Issue
Block a user