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)
This commit is contained in:
parent
409a472905
commit
2dcedd9cbc
@ -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[])
|
|||||||
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
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
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,
|
|||||||
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,
|
|||||||
*(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,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user