diff options
Diffstat (limited to 'sql/filesort.cc')
-rw-r--r-- | sql/filesort.cc | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/sql/filesort.cc b/sql/filesort.cc index 96eabfdab89..026c9d0d670 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -242,7 +242,7 @@ SORT_INFO *filesort(THD *thd, TABLE *table, Filesort *filesort, MYSQL_FILESORT_START(table->s->db.str, table->s->table_name.str); DEBUG_SYNC(thd, "filesort_start"); - if (!(sort= new SORT_INFO)) + if (!(sort= new SORT_INFO)) // Note that this is not automatically freed! return 0; if (subselect && subselect->filesort_buffer.is_allocated()) @@ -490,6 +490,7 @@ SORT_INFO *filesort(THD *thd, TABLE *table, Filesort *filesort, error= 0; err: + param.tmp_buffer.free(); if (!subselect || !subselect->is_uncacheable()) { if (!param.using_addon_fields()) @@ -1169,7 +1170,7 @@ void store_length(uchar *to, uint length, uint pack_length) void Type_handler_string_result::make_sort_key_part(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, - Sort_param *param) const + String *tmp_buffer) const { CHARSET_INFO *cs= item->collation.collation; bool maybe_null= item->maybe_null(); @@ -1177,7 +1178,7 @@ Type_handler_string_result::make_sort_key_part(uchar *to, Item *item, if (maybe_null) *to++= 1; - String *res= item->str_result(¶m->tmp_buffer); + Binary_string *res= item->str_result(tmp_buffer); if (!res) { if (maybe_null) @@ -1239,7 +1240,7 @@ Type_handler_string_result::make_sort_key_part(uchar *to, Item *item, void Type_handler_int_result::make_sort_key_part(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, - Sort_param *param) const + String *tmp_buffer) const { longlong value= item->val_int_result(); make_sort_key_longlong(to, item->maybe_null(), item->null_value, @@ -1250,7 +1251,7 @@ Type_handler_int_result::make_sort_key_part(uchar *to, Item *item, void Type_handler_temporal_result::make_sort_key_part(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, - Sort_param *param) const + String *tmp_buffer) const { MYSQL_TIME buf; // This is a temporal type. No nanoseconds. Rounding mode is not important. @@ -1272,7 +1273,7 @@ Type_handler_temporal_result::make_sort_key_part(uchar *to, Item *item, void Type_handler_timestamp_common::make_sort_key_part(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, - Sort_param *param) const + String *tmp_buffer) const { THD *thd= current_thd; uint binlen= my_timestamp_binary_length(item->decimals); @@ -1365,7 +1366,7 @@ Type_handler::make_packed_sort_key_longlong(uchar *to, bool maybe_null, void Type_handler_decimal_result::make_sort_key_part(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, - Sort_param *param) const + String *tmp_buffer) const { my_decimal dec_buf, *dec_val= item->val_decimal_result(&dec_buf); if (item->maybe_null()) @@ -1385,7 +1386,7 @@ Type_handler_decimal_result::make_sort_key_part(uchar *to, Item *item, void Type_handler_real_result::make_sort_key_part(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, - Sort_param *param) const + String *tmp_buffer) const { double value= item->val_result(); if (item->maybe_null()) @@ -2492,7 +2493,7 @@ void Sort_param::try_to_pack_sortkeys() uint Type_handler_string_result::make_packed_sort_key_part(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, - Sort_param *param) const + String *tmp) const { CHARSET_INFO *cs= item->collation.collation; bool maybe_null= item->maybe_null(); @@ -2500,7 +2501,7 @@ Type_handler_string_result::make_packed_sort_key_part(uchar *to, Item *item, if (maybe_null) *to++= 1; - Binary_string *res= item->str_result(¶m->tmp_buffer); + Binary_string *res= item->str_result(tmp); if (!res) { if (maybe_null) @@ -2531,7 +2532,7 @@ Type_handler_string_result::make_packed_sort_key_part(uchar *to, Item *item, uint Type_handler_int_result::make_packed_sort_key_part(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, - Sort_param *param) const + String *tmp) const { longlong value= item->val_int_result(); return make_packed_sort_key_longlong(to, item->maybe_null(), @@ -2543,7 +2544,7 @@ Type_handler_int_result::make_packed_sort_key_part(uchar *to, Item *item, uint Type_handler_decimal_result::make_packed_sort_key_part(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, - Sort_param *param) const + String *tmp) const { my_decimal dec_buf, *dec_val= item->val_decimal_result(&dec_buf); if (item->maybe_null()) @@ -2565,7 +2566,7 @@ Type_handler_decimal_result::make_packed_sort_key_part(uchar *to, Item *item, uint Type_handler_real_result::make_packed_sort_key_part(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, - Sort_param *param) const + String *tmp) const { double value= item->val_result(); if (item->maybe_null()) @@ -2586,7 +2587,7 @@ Type_handler_real_result::make_packed_sort_key_part(uchar *to, Item *item, uint Type_handler_temporal_result::make_packed_sort_key_part(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, - Sort_param *param) const + String *tmp) const { MYSQL_TIME buf; // This is a temporal type. No nanoseconds. Rounding mode is not important. @@ -2608,7 +2609,7 @@ Type_handler_temporal_result::make_packed_sort_key_part(uchar *to, Item *item, uint Type_handler_timestamp_common::make_packed_sort_key_part(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, - Sort_param *param) const + String *tmp) const { THD *thd= current_thd; uint binlen= my_timestamp_binary_length(item->decimals); @@ -2952,7 +2953,8 @@ static uint make_sortkey(Sort_param *param, uchar *to) { // Item sort_field->item->type_handler()->make_sort_key_part(to, sort_field->item, - sort_field, param); + sort_field, + ¶m->tmp_buffer); if ((maybe_null= sort_field->item->maybe_null())) to++; } @@ -3005,7 +3007,7 @@ static uint make_packed_sortkey(Sort_param *param, uchar *to) Item *item= sort_field->item; length= item->type_handler()->make_packed_sort_key_part(to, item, sort_field, - param); + ¶m->tmp_buffer); if ((maybe_null= sort_field->item->maybe_null())) to++; } |