@ -1134,17 +1134,28 @@ JOIN::optimize()
tmp_table_param . hidden_field_count = ( all_fields . 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 =
create_tmp_table ( thd , & tmp_table_param , all_fields ,
( ( ! simple_group & & ! procedure & &
! ( test_flags & TEST_NO_KEY_GROUP ) ) ?
group_list : ( ORDER * ) 0 ) ,
tmp_group ,
group_list ? 0 : select_distinct ,
group_list & & simple_group ,
select_options ,
( order = = 0 | | skip_sort_order | |
test ( select_options & OPTION_BUFFER_RESULT ) ) ?
select_limit : HA_POS_ERROR ,
tmp_rows_limit ,
( char * ) " " ) ) )
DBUG_RETURN ( 1 ) ;
@ -9097,6 +9108,13 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
thd - > variables . max_heap_table_size ) :
thd - > variables . tmp_table_size ) / table - > s - > reclength ) ;
set_if_bigger ( table - > s - > 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 - > s - > max_rows , rows_limit ) ;
param - > end_write_records = rows_limit ;
keyinfo = param - > keyinfo ;
if ( group )
@ -9226,19 +9244,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 - > s - > max_rows , rows_limit ) ;
param - > end_write_records = rows_limit ;
}
if ( thd - > is_fatal_error ) // If end of memory
goto err ; /* purecov: inspected */
table - > s - > db_record_offset = 1 ;