summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <Sinisa@sinisa.nasamreza.org>2002-10-16 21:17:57 +0300
committerunknown <Sinisa@sinisa.nasamreza.org>2002-10-16 21:17:57 +0300
commit14cc2fc140dd1bc96d00c93aeb558a7dfc937889 (patch)
tree591f269a779c937e9badc95cb89c7c80c0c64bf5
parente8ba6a7627711423bfa251853182b67b3e9998ea (diff)
downloadmariadb-git-14cc2fc140dd1bc96d00c93aeb558a7dfc937889.tar.gz
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 ...
-rw-r--r--sql/sql_lex.h2
-rw-r--r--sql/sql_parse.cc59
-rw-r--r--sql/sql_yacc.yy34
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: