mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Some small accelerations ...
I intend to do some more accelerations in mysql_execute_command and in SQLCOM_SELECT part for which I need to fix EXPLAIN with derived tables plus few additional items. If this proves to be much I wil just make it a new SCRUM task
This commit is contained in:
@ -378,7 +378,7 @@ typedef struct st_lex
|
||||
uint param_count;
|
||||
bool drop_primary, drop_if_exists, local_file, olap;
|
||||
bool in_comment, ignore_space, verbose, simple_alter;
|
||||
bool derived_tables;
|
||||
bool derived_tables, describe;
|
||||
uint slave_thd_opt;
|
||||
CHARSET_INFO *charset;
|
||||
} LEX;
|
||||
|
@ -1335,8 +1335,7 @@ mysql_execute_command(THD *thd)
|
||||
TODO: solve problem with depended derived tables in subselects
|
||||
*/
|
||||
if (lex->sql_command == SQLCOM_SELECT &&
|
||||
(select_lex->options & SELECT_DESCRIBE) &&
|
||||
lex->derived_tables)
|
||||
lex->describe && lex->derived_tables)
|
||||
{
|
||||
if (!(explain_result= new select_send()))
|
||||
{
|
||||
@ -1405,8 +1404,6 @@ mysql_execute_command(THD *thd)
|
||||
case SQLCOM_SELECT:
|
||||
{
|
||||
select_result *result=lex->result;
|
||||
if (select_lex->options & SELECT_DESCRIBE)
|
||||
lex->exchange=0;
|
||||
if (tables)
|
||||
{
|
||||
res=check_table_access(thd,
|
||||
@ -1431,6 +1428,27 @@ mysql_execute_command(THD *thd)
|
||||
if (unit->select_limit_cnt == HA_POS_ERROR)
|
||||
select_lex->options&= ~OPTION_FOUND_ROWS;
|
||||
|
||||
if (!(res=open_and_lock_tables(thd,tables)))
|
||||
{
|
||||
if (lex->describe)
|
||||
{
|
||||
if (!explain_result)
|
||||
if (!(explain_result= new select_send()))
|
||||
{
|
||||
send_error(thd, ER_OUT_OF_RESOURCES);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
else
|
||||
thd->send_explain_fields(explain_result);
|
||||
fix_tables_pointers(select_lex);
|
||||
res= mysql_explain_union(thd, &thd->lex.unit, explain_result);
|
||||
MYSQL_LOCK *save_lock= thd->lock;
|
||||
thd->lock= (MYSQL_LOCK *)0;
|
||||
explain_result->send_eof();
|
||||
thd->lock= save_lock;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!result)
|
||||
{
|
||||
if ((result=new select_send()))
|
||||
@ -1454,35 +1472,10 @@ mysql_execute_command(THD *thd)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(res=open_and_lock_tables(thd,tables)))
|
||||
{
|
||||
if (select_lex->options & SELECT_DESCRIBE)
|
||||
{
|
||||
delete result; // we do not need it for explain
|
||||
if (!explain_result)
|
||||
if (!(explain_result= new select_send()))
|
||||
{
|
||||
send_error(thd, ER_OUT_OF_RESOURCES);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
else
|
||||
thd->send_explain_fields(explain_result);
|
||||
fix_tables_pointers(select_lex);
|
||||
res= mysql_explain_union(thd, &thd->lex.unit, explain_result);
|
||||
MYSQL_LOCK *save_lock= thd->lock;
|
||||
thd->lock= (MYSQL_LOCK *)0;
|
||||
explain_result->send_eof();
|
||||
thd->lock= save_lock;
|
||||
}
|
||||
else
|
||||
{
|
||||
query_cache_store_query(thd, tables);
|
||||
res=handle_select(thd, lex, result);
|
||||
}
|
||||
}
|
||||
else
|
||||
delete result;
|
||||
break;
|
||||
}
|
||||
case SQLCOM_DO:
|
||||
@ -2913,7 +2906,7 @@ mysql_init_query(THD *thd)
|
||||
thd->free_list= 0;
|
||||
thd->lex.union_option= 0;
|
||||
thd->lex.select= &thd->lex.select_lex;
|
||||
thd->lex.olap=0;
|
||||
thd->lex.olap=thd->lex.describe=0;
|
||||
thd->lex.select->olap= UNSPECIFIED_OLAP_TYPE;
|
||||
thd->fatal_error= 0; // Safety
|
||||
thd->total_warn_count=0; // Warnings for this query
|
||||
|
@ -2553,7 +2553,8 @@ procedure_item:
|
||||
|
||||
select_var_list_init:
|
||||
{
|
||||
if (!(Lex->result= new select_dumpvar()))
|
||||
LEX *lex=Lex;
|
||||
if (!lex->describe && (!(lex->result= new select_dumpvar())))
|
||||
YYABORT;
|
||||
}
|
||||
select_var_list
|
||||
@ -2567,28 +2568,35 @@ select_var_list:
|
||||
select_var_ident: '@' ident_or_text
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
if ( ((select_dumpvar *)lex->result)->var_list.push_back((LEX_STRING*) sql_memdup(&$2,sizeof(LEX_STRING))))
|
||||
if (lex->result && ((select_dumpvar *)lex->result)->var_list.push_back((LEX_STRING*) sql_memdup(&$2,sizeof(LEX_STRING))))
|
||||
YYABORT;
|
||||
}
|
||||
;
|
||||
|
||||
opt_into:
|
||||
INTO OUTFILE TEXT_STRING
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
if (!lex->describe)
|
||||
{
|
||||
if (!(lex->exchange= new sql_exchange($3.str,0)))
|
||||
YYABORT;
|
||||
if (!(lex->result= new select_export(lex->exchange)))
|
||||
YYABORT;
|
||||
}
|
||||
}
|
||||
opt_field_term opt_line_term
|
||||
| INTO DUMPFILE TEXT_STRING
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
if (!lex->describe)
|
||||
{
|
||||
if (!(lex->exchange= new sql_exchange($3.str,1)))
|
||||
YYABORT;
|
||||
if (!(lex->result= new select_dump(lex->exchange)))
|
||||
YYABORT;
|
||||
}
|
||||
}
|
||||
| INTO select_var_list_init
|
||||
{
|
||||
current_thd->safe_to_cache_query=0;
|
||||
@ -3057,7 +3065,11 @@ describe:
|
||||
}
|
||||
opt_describe_column
|
||||
| describe_command select
|
||||
{ Lex->select_lex.options|= SELECT_DESCRIBE; };
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
lex->select_lex.options|= SELECT_DESCRIBE;
|
||||
lex->describe=1;
|
||||
};
|
||||
|
||||
|
||||
describe_command:
|
||||
|
Reference in New Issue
Block a user