From 14cc2fc140dd1bc96d00c93aeb558a7dfc937889 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 16 Oct 2002 21:17:57 +0300 Subject: 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 sql/sql_lex.h: Some small accelerations ... sql/sql_parse.cc: Some small accelerations ... sql/sql_yacc.yy: Some small accelerations ... --- sql/sql_lex.h | 2 +- sql/sql_parse.cc | 59 +++++++++++++++++++++++++------------------------------- sql/sql_yacc.yy | 34 +++++++++++++++++++++----------- 3 files changed, 50 insertions(+), 45 deletions(-) diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 28d6d93e194..de57e9f77a8 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -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; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ed8d4112410..310846f2ffe 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -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,35 +1428,10 @@ mysql_execute_command(THD *thd) if (unit->select_limit_cnt == HA_POS_ERROR) select_lex->options&= ~OPTION_FOUND_ROWS; - if (!result) - { - if ((result=new select_send())) - { - /* - Normal select: - Change lock if we are using SELECT HIGH PRIORITY, - FOR UPDATE or IN SHARE MODE - */ - TABLE_LIST *table; - for (table = tables ; table ; table=table->next) - table->lock_type= lex->lock_option; - } - else - { - res= -1; -#ifdef DELETE_ITEMS - delete select_lex->having; - delete select_lex->where; -#endif - break; - } - } - if (!(res=open_and_lock_tables(thd,tables))) { - if (select_lex->options & SELECT_DESCRIBE) + if (lex->describe) { - delete result; // we do not need it for explain if (!explain_result) if (!(explain_result= new select_send())) { @@ -1477,12 +1449,33 @@ mysql_execute_command(THD *thd) } else { + if (!result) + { + if ((result=new select_send())) + { + /* + Normal select: + Change lock if we are using SELECT HIGH PRIORITY, + FOR UPDATE or IN SHARE MODE + */ + TABLE_LIST *table; + for (table = tables ; table ; table=table->next) + table->lock_type= lex->lock_option; + } + else + { + res= -1; +#ifdef DELETE_ITEMS + delete select_lex->having; + delete select_lex->where; +#endif + break; + } + } 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 diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 1aea8f590f1..a81561b70c0 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -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,27 +2568,34 @@ 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->exchange= new sql_exchange($3.str,0))) - YYABORT; - if (!(lex->result= new select_export(lex->exchange))) - YYABORT; + 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->exchange= new sql_exchange($3.str,1))) - YYABORT; - if (!(lex->result= new select_dump(lex->exchange))) - YYABORT; + 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 { @@ -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: -- cgit v1.2.1