Commit fd4a0403 authored by monty@mysql.com's avatar monty@mysql.com

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"
parent 9014fef4
...@@ -252,7 +252,6 @@ static int write_to_table(char *filename, MYSQL *sock) ...@@ -252,7 +252,6 @@ static int write_to_table(char *filename, MYSQL *sock)
{ {
char tablename[FN_REFLEN], hard_path[FN_REFLEN], char tablename[FN_REFLEN], hard_path[FN_REFLEN],
sql_statement[FN_REFLEN*16+256], *end; sql_statement[FN_REFLEN*16+256], *end;
my_bool local_file;
DBUG_ENTER("write_to_table"); DBUG_ENTER("write_to_table");
DBUG_PRINT("enter",("filename: %s",filename)); DBUG_PRINT("enter",("filename: %s",filename));
......
...@@ -66,7 +66,7 @@ int main(int argc,char *argv[]) ...@@ -66,7 +66,7 @@ int main(int argc,char *argv[])
struct { MI_INFO *info; } aio0, *aio=&aio0; /* for GWS_IN_USE */ struct { MI_INFO *info; } aio0, *aio=&aio0; /* for GWS_IN_USE */
MY_INIT(argv[0]); 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); exit(error);
if (count || dump) if (count || dump)
verbose=0; verbose=0;
......
...@@ -659,7 +659,7 @@ bool ...@@ -659,7 +659,7 @@ bool
Item_func_nullif::is_null() Item_func_nullif::is_null()
{ {
if (!(this->*cmp_func)()) if (!(this->*cmp_func)())
return null_value=1; return (null_value= 1);
return 0; return 0;
} }
......
...@@ -380,27 +380,6 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -380,27 +380,6 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
DBUG_PRINT("info-in-hash",("'%s'.'%s' as '%s' tab %p", DBUG_PRINT("info-in-hash",("'%s'.'%s' as '%s' tab %p",
hash_tables->db, hash_tables->real_name, hash_tables->db, hash_tables->real_name,
hash_tables->alias, table)); 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) if (!table)
{ {
/* /*
...@@ -447,11 +426,16 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -447,11 +426,16 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
} }
tables->table=table; 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)) if (cond && cond->fix_fields(thd,tables))
goto err0; goto err0;
table->file->init_table_handle_for_HANDLER(); // Only InnoDB requires it
if (keyname) if (keyname)
{ {
if ((keyno=find_type(keyname, &table->keynames, 1+2)-1)<0) if ((keyno=find_type(keyname, &table->keynames, 1+2)-1)<0)
...@@ -463,23 +447,17 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -463,23 +447,17 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
table->file->index_init(keyno); 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)) if (insert_fields(thd,tables,tables->db,tables->alias,&it))
goto err0; goto err0;
select_limit+=offset_limit; select_limit+=offset_limit;
send_fields(thd,list,1); 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 table->file->init_table_handle_for_HANDLER(); // Only InnoDB requires it
for (num_rows=0; num_rows < select_limit; ) for (num_rows=0; num_rows < select_limit; )
......
...@@ -4082,7 +4082,14 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, ...@@ -4082,7 +4082,14 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
*(reg_field++) =new_field; *(reg_field++) =new_field;
} }
if (!--hidden_field_count) if (!--hidden_field_count)
{
hidden_null_count=null_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)); DBUG_ASSERT(field_count >= (uint) (reg_field - table->field));
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, ...@@ -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 Create an unique key or an unique constraint over all columns
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment