Fix for bug#22338 "Valgrind warning: uninitialized variable in
create_tmp_table()". The fix for bug 21787 "COUNT(*) + ORDER BY + LIMIT returns wrong result" introduced valgrind warnings which occured during execution of information_schema.test and sp-prelocking.test in version 5.0. There were no user visible effects. The latter fix made create_tmp_table() dependant on THD::lex::current_select value. Valgrind warnings occured when this function was executed and THD::lex::current_select member pointed to uninitialized SELECT_LEX instance. This fix tries to remove this dependancy by moving some logic outside of create_tmp_table() function.
This commit is contained in:
parent
7897f061aa
commit
acaa584c55
@ -932,17 +932,28 @@ JOIN::optimize()
|
|||||||
|
|
||||||
tmp_table_param.hidden_field_count= (all_fields.elements -
|
tmp_table_param.hidden_field_count= (all_fields.elements -
|
||||||
fields_list.elements);
|
fields_list.elements);
|
||||||
|
ORDER *tmp_group= ((!simple_group && !procedure &&
|
||||||
|
!(test_flags & TEST_NO_KEY_GROUP)) ? group_list :
|
||||||
|
(ORDER*) 0);
|
||||||
|
/*
|
||||||
|
Pushing LIMIT to the temporary table creation is not applicable
|
||||||
|
when there is ORDER BY or GROUP BY or there is no GROUP BY, but
|
||||||
|
there are aggregate functions, because in all these cases we need
|
||||||
|
all result rows.
|
||||||
|
*/
|
||||||
|
ha_rows tmp_rows_limit= ((order == 0 || skip_sort_order ||
|
||||||
|
test(select_options & OPTION_BUFFER_RESULT)) &&
|
||||||
|
!tmp_group &&
|
||||||
|
!thd->lex->current_select->with_sum_func) ?
|
||||||
|
select_limit : HA_POS_ERROR;
|
||||||
|
|
||||||
if (!(exec_tmp_table1 =
|
if (!(exec_tmp_table1 =
|
||||||
create_tmp_table(thd, &tmp_table_param, all_fields,
|
create_tmp_table(thd, &tmp_table_param, all_fields,
|
||||||
((!simple_group && !procedure &&
|
tmp_group,
|
||||||
!(test_flags & TEST_NO_KEY_GROUP)) ?
|
|
||||||
group_list : (ORDER*) 0),
|
|
||||||
group_list ? 0 : select_distinct,
|
group_list ? 0 : select_distinct,
|
||||||
group_list && simple_group,
|
group_list && simple_group,
|
||||||
select_options,
|
select_options,
|
||||||
(order == 0 || skip_sort_order ||
|
tmp_rows_limit,
|
||||||
test(select_options & OPTION_BUFFER_RESULT)) ?
|
|
||||||
select_limit : HA_POS_ERROR,
|
|
||||||
(char *) "")))
|
(char *) "")))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
|
||||||
@ -5566,6 +5577,13 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
|||||||
thd->variables.max_heap_table_size) :
|
thd->variables.max_heap_table_size) :
|
||||||
thd->variables.tmp_table_size)/ table->reclength);
|
thd->variables.tmp_table_size)/ table->reclength);
|
||||||
set_if_bigger(table->max_rows,1); // For dummy start options
|
set_if_bigger(table->max_rows,1); // For dummy start options
|
||||||
|
/*
|
||||||
|
Push the LIMIT clause to the temporary table creation, so that we
|
||||||
|
materialize only up to 'rows_limit' records instead of all result records.
|
||||||
|
*/
|
||||||
|
set_if_smaller(table->max_rows, rows_limit);
|
||||||
|
param->end_write_records= rows_limit;
|
||||||
|
|
||||||
keyinfo=param->keyinfo;
|
keyinfo=param->keyinfo;
|
||||||
|
|
||||||
if (group)
|
if (group)
|
||||||
@ -5686,19 +5704,6 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Push the LIMIT clause to the temporary table creation, so that we
|
|
||||||
materialize only up to 'rows_limit' records instead of all result records.
|
|
||||||
This optimization is not applicable when there is GROUP BY or there is
|
|
||||||
no GROUP BY, but there are aggregate functions, because both must be
|
|
||||||
computed for all result rows.
|
|
||||||
*/
|
|
||||||
if (!group && !thd->lex->current_select->with_sum_func)
|
|
||||||
{
|
|
||||||
set_if_smaller(table->max_rows, rows_limit);
|
|
||||||
param->end_write_records= rows_limit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (thd->is_fatal_error) // If end of memory
|
if (thd->is_fatal_error) // If end of memory
|
||||||
goto err; /* purecov: inspected */
|
goto err; /* purecov: inspected */
|
||||||
table->db_record_offset=1;
|
table->db_record_offset=1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user