From 61122db5251346e5cf9f8575a70ef97017541553 Mon Sep 17 00:00:00 2001
From: unknown <Sinisa@sinisa.nasamreza.org>
Date: Wed, 16 Oct 2002 21:17:57 +0300
Subject: [PATCH] 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 28d6d93e19..de57e9f77a 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 ed8d411241..310846f2ff 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 1aea8f590f..a81561b70c 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:
-- 
2.30.9