Commit 3b5ae7f4 authored by Sinisa@sinisa.nasamreza.org's avatar Sinisa@sinisa.nasamreza.org
Browse files

Merge sinisa@work.mysql.com:/home/bk/mysql-4.0

into sinisa.nasamreza.org:/mnt/hdc/Sinisa/mysql-4.0
parents 4ef5a7de 7bda9e72
Loading
Loading
Loading
Loading
+168 −131
Original line number Diff line number Diff line
@@ -144,7 +144,7 @@ static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab);
static void init_sum_functions(Item_sum **func);
static bool update_sum_func(Item_sum **func);
static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
			    bool distinct);
			    bool distinct, const char *message=NullS);
static void describe_info(THD *thd, const char *info);

/*
@@ -195,6 +195,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
  Procedure	*procedure;
  List<Item>	all_fields(fields);
  bool		select_distinct;
  SELECT_LEX *select_lex = &(thd->lex.select_lex);
  DBUG_ENTER("mysql_select");

  /* Check that all tables, fields, conds and order are ok */
@@ -350,6 +351,9 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
  }
  if (cond_value == Item::COND_FALSE || !thd->select_limit)
  {					/* Impossible cond */
    if (select_options & SELECT_DESCRIBE && select_lex->next)
      select_describe(&join,false,false,false,"Impossible WHERE");
    else 
      error=return_zero_rows(result, tables, fields,
			     join.tmp_table_param.sum_func_count != 0 && !group,
			     select_options,"Impossible WHERE",having,
@@ -366,6 +370,9 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
    {
      if (res < 0)
      {
	if (select_options & SELECT_DESCRIBE && select_lex->next)
	  select_describe(&join,false,false,false,"No matching min/max row");
	else 
	  error=return_zero_rows(result, tables, fields, !group,
				 select_options,"No matching min/max row",
				 having,procedure);
@@ -374,9 +381,12 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
      }
      if (select_options & SELECT_DESCRIBE)
      {
	if (select_lex->next)
	  select_describe(&join,false,false,false,"Select tables optimized away");
	else
	  describe_info(thd,"Select tables optimized away");
	delete procedure;
	DBUG_RETURN(0);
	DBUG_RETURN(error);
      }
      tables=0;					// All tables resolved
    }
@@ -385,7 +395,12 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
  {						// Only test of functions
    error=0;
    if (select_options & SELECT_DESCRIBE)
    {
      if (select_lex->next)
	select_describe(&join,false,false,false,"No tables used");
      else
	describe_info(thd,"No tables used");
    }
    else
    {
      result->send_fields(fields,1);
@@ -463,6 +478,9 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
  }
  if (make_join_select(&join,select,conds))
  {
    if (select_options & SELECT_DESCRIBE && select_lex->next)
      select_describe(&join,false,false,false,"Impossible WHERE noticed after reading const tables");
    else 
      error=return_zero_rows(result,tables,fields,
			     join.tmp_table_param.sum_func_count != 0 && !group,
			     select_options,
@@ -535,7 +553,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
  make_join_readinfo(&join,
		     (select_options & (SELECT_DESCRIBE |
					SELECT_NO_JOIN_CACHE)) |
     (thd->lex.select_lex.ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0));
     (select_lex->ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0));

  /* Need to tell Innobase that to play it safe, it should fetch all
     columns of the tables: this is because MySQL
@@ -2516,6 +2534,7 @@ static void
make_join_readinfo(JOIN *join,uint options)
{
  uint i;
  SELECT_LEX *select_lex = &(join->thd->lex.select_lex);
  DBUG_ENTER("make_join_readinfo");

  for (i=join->const_tables ; i < join->tables ; i++)
@@ -2598,7 +2617,7 @@ make_join_readinfo(JOIN *join,uint options)
      /* These init changes read_record */
      if (tab->use_quick == 2)
      {
	join->thd->lex.select_lex.options|=QUERY_NO_GOOD_INDEX_USED;
	select_lex->options|=QUERY_NO_GOOD_INDEX_USED;
	tab->read_first_record= join_init_quick_read_record;
	statistic_increment(select_range_check_count, &LOCK_status);
      }
@@ -2613,7 +2632,7 @@ make_join_readinfo(JOIN *join,uint options)
	  }
	  else
	  {
	    join->thd->lex.select_lex.options|=QUERY_NO_INDEX_USED;
	    select_lex->options|=QUERY_NO_INDEX_USED;
	    statistic_increment(select_scan_count, &LOCK_status);
	  }
	}
@@ -2625,7 +2644,7 @@ make_join_readinfo(JOIN *join,uint options)
	  }
	  else
	  {
	    join->thd->lex.select_lex.options|=QUERY_NO_INDEX_USED;
	    select_lex->options|=QUERY_NO_INDEX_USED;
	    statistic_increment(select_full_join_count, &LOCK_status);
	  }
	}
@@ -6940,16 +6959,17 @@ static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab)
****************************************************************************/

static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
			    bool distinct)
			    bool distinct,const char *message)
{
  List<Item> field_list;
  Item *item;
  THD *thd=join->thd;
  SELECT_LEX *select_lex = &(join->thd->lex.select_lex);
  DBUG_ENTER("select_describe");

  /* Don't log this into the slow query log */
  join->thd->lex.select_lex.options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED);
  if (join->thd->lex.select == &join->thd->lex.select_lex)
  select_lex->options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED);
  if (join->thd->lex.select == select_lex)
  {
    field_list.push_back(new Item_empty_string("table",NAME_LEN));
    field_list.push_back(new Item_empty_string("type",10));
@@ -6970,6 +6990,22 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
  }
  char buff[512],*buff_ptr;
  String tmp(buff,sizeof(buff)),*packet= &thd->packet;
  if (message)
  {
    packet->length(0);
    net_store_null(packet);
    net_store_null(packet);
    net_store_null(packet);
    net_store_null(packet);
    net_store_null(packet);
    net_store_null(packet);
    net_store_null(packet);
    net_store_data(packet,message,strlen(message));
    if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length()))
      DBUG_VOID_RETURN;
  }
  else
  {
    table_map used_tables=0;
    for (uint i=0 ; i < join->tables ; i++)
    {
@@ -7093,11 +7129,12 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
      }
      net_store_data(packet,buff,(uint) (buff_ptr - buff));
      if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length()))
      DBUG_VOID_RETURN;				/* purecov: inspected */
	DBUG_VOID_RETURN;				/* Purecov: Inspected */

      // For next iteration
      used_tables|=table->map;
    }
  }
  if (!join->thd->lex.select->next)
    send_eof(&thd->net);
  DBUG_VOID_RETURN;
+6 −0
Original line number Diff line number Diff line
@@ -76,6 +76,12 @@ int mysql_union(THD *thd, LEX *lex,select_result *result)
    for (sl= &lex->select_lex; sl; sl=sl->next)
    {
      lex->select=sl;
      thd->offset_limit=sl->offset_limit;
      thd->select_limit=sl->select_limit+sl->offset_limit;
      if (thd->select_limit < sl->select_limit)
	thd->select_limit= HA_POS_ERROR;		// no limit
      if (thd->select_limit == HA_POS_ERROR)
	sl->options&= ~OPTION_FOUND_ROWS;
      res=mysql_select(thd, (TABLE_LIST*) sl->table_list.first,
		       sl->item_list,
		       sl->where,