Commit 2dcedd9c authored by unknown's avatar unknown
Browse files

Fixes during review of new pushed code:

Remove wrong fix for Bug#14397 - OPTIMIZE TABLE with an open HANDLER causes a crash
Safety fix for bug #13855 "select distinct with group by caused server crash"


client/mysqlimport.c:
  Remove not used variable
myisam/myisam_ftdump.c:
  Fixed compiler warning
sql/item_cmpfunc.cc:
  Removed compiler warning
sql/sql_handler.cc:
  Remove wrong fix for Bug#14397 - OPTIMIZE TABLE with an open HANDLER causes a crash.
  It's better to let mysql_lock_tables reopen the TABLE object in case of OPTIMIZE TABLE and fix items AFTER mysql_lock_table() instead of before
sql/sql_select.cc:
  Safety fix for bug #13855 "select distinct with group by caused server crash"
  The previous patch only removed the symptomps, this fix removed the cause of the problem
  (Which was that not all hidden_fields was stored in the temporary table)
parent 409a4729
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -252,7 +252,6 @@ static int write_to_table(char *filename, MYSQL *sock)
{
  char tablename[FN_REFLEN], hard_path[FN_REFLEN],
       sql_statement[FN_REFLEN*16+256], *end;
  my_bool local_file;
  DBUG_ENTER("write_to_table");
  DBUG_PRINT("enter",("filename: %s",filename));

+1 −1
Original line number Diff line number Diff line
@@ -66,7 +66,7 @@ int main(int argc,char *argv[])
  struct { MI_INFO *info; } aio0, *aio=&aio0; /* for GWS_IN_USE */

  MY_INIT(argv[0]);
  if (error=handle_options(&argc, &argv, my_long_options, get_one_option))
  if ((error= handle_options(&argc, &argv, my_long_options, get_one_option)))
    exit(error);
  if (count || dump)
    verbose=0;
+1 −1
Original line number Diff line number Diff line
@@ -659,7 +659,7 @@ bool
Item_func_nullif::is_null()
{
  if (!(this->*cmp_func)())
    return null_value=1;
    return (null_value= 1);
  return 0;
}

+12 −34
Original line number Diff line number Diff line
@@ -380,27 +380,6 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
    DBUG_PRINT("info-in-hash",("'%s'.'%s' as '%s' tab %p",
                               hash_tables->db, hash_tables->real_name,
                               hash_tables->alias, table));
    /* Table might have been flushed. */
    if (table && (table->version != refresh_version))
    {
      /*
        We must follow the thd->handler_tables chain, as we need the
        address of the 'next' pointer referencing this table
        for close_thread_table().
      */
      for (table_ptr= &(thd->handler_tables);
           *table_ptr && (*table_ptr != table);
           table_ptr= &(*table_ptr)->next)
      {}
      VOID(pthread_mutex_lock(&LOCK_open));
      if (close_thread_table(thd, table_ptr))
      {
        /* Tell threads waiting for refresh that something has happened */
        VOID(pthread_cond_broadcast(&COND_refresh));
      }
      VOID(pthread_mutex_unlock(&LOCK_open));
      table= hash_tables->table= NULL;
    }
    if (!table)
    {
      /*
@@ -447,11 +426,16 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
  }
  tables->table=table;

  HANDLER_TABLES_HACK(thd);
  lock= mysql_lock_tables(thd, &tables->table, 1, 0);
  HANDLER_TABLES_HACK(thd);

  if (!lock)
    goto err0; // mysql_lock_tables() printed error message already

  if (cond && cond->fix_fields(thd,tables))
    goto err0;

  table->file->init_table_handle_for_HANDLER(); // Only InnoDB requires it

  if (keyname)
  {
    if ((keyno=find_type(keyname, &table->keynames, 1+2)-1)<0)
@@ -463,23 +447,17 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
    table->file->index_init(keyno);
  }
 
  byte *key;
  uint key_len;
  LINT_INIT(key); 
  LINT_INIT(key_len); 

  if (insert_fields(thd,tables,tables->db,tables->alias,&it))
    goto err0;

  select_limit+=offset_limit;
  send_fields(thd,list,1);

  HANDLER_TABLES_HACK(thd);
  lock= mysql_lock_tables(thd, &tables->table, 1, 0);
  HANDLER_TABLES_HACK(thd);
  
  byte *key;
  uint key_len;
  LINT_INIT(key); 
  LINT_INIT(key_len); 
  if (!lock)
     goto err0; // mysql_lock_tables() printed error message already

  table->file->init_table_handle_for_HANDLER(); // Only InnoDB requires it

  for (num_rows=0; num_rows < select_limit; )
+8 −1
Original line number Diff line number Diff line
@@ -4082,7 +4082,14 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
      *(reg_field++) =new_field;
    }
    if (!--hidden_field_count)
    {
      hidden_null_count=null_count;
      /*
        We need to update hidden_field_count as we may have stored group
        functions with constant arguments
      */
      param->hidden_field_count= (uint) (reg_field - table->field);
    }
  }
  DBUG_ASSERT(field_count >= (uint) (reg_field - table->field));
  field_count= (uint) (reg_field - table->field);
@@ -4270,7 +4277,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
    }
  }

  if (distinct)
  if (distinct && field_count != param->hidden_field_count)
  {
    /*
      Create an unique key or an unique constraint over all columns