summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <monty@mysql.com>2006-01-06 21:42:17 +0200
committerunknown <monty@mysql.com>2006-01-06 21:42:17 +0200
commit2dcedd9cbc4effee5a1c7e4c8045f2e8adced065 (patch)
treec5fd0198611166ad940fadddeedd2018b9aa73c4 /sql
parent409a472905b7d34d68efeeb0b4f619627d12d3ad (diff)
downloadmariadb-git-2dcedd9cbc4effee5a1c7e4c8045f2e8adced065.tar.gz
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)
Diffstat (limited to 'sql')
-rw-r--r--sql/item_cmpfunc.cc2
-rw-r--r--sql/sql_handler.cc46
-rw-r--r--sql/sql_select.cc9
3 files changed, 21 insertions, 36 deletions
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 107a17815ae..db6c4d9789b 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -659,7 +659,7 @@ bool
Item_func_nullif::is_null()
{
if (!(this->*cmp_func)())
- return null_value=1;
+ return (null_value= 1);
return 0;
}
diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc
index 28e94d1a477..58b75e667b5 100644
--- a/sql/sql_handler.cc
+++ b/sql/sql_handler.cc
@@ -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)
@@ -462,6 +446,11 @@ 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;
@@ -469,17 +458,6 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
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; )
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 6dd68a60f88..32658f92416 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -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