diff options
author | Monty <monty@mariadb.org> | 2015-08-31 12:57:46 +0300 |
---|---|---|
committer | Monty <monty@mariadb.org> | 2015-09-01 18:42:02 +0300 |
commit | 56aa19989f5800df8a398173727558bfb3ea1251 (patch) | |
tree | f87dbcca91d699cbc2539a344d6dabd6b71c2131 /sql/item_sum.cc | |
parent | 8ea9b8c0b168b3e5aad08886477d8726531abcd5 (diff) | |
download | mariadb-git-56aa19989f5800df8a398173727558bfb3ea1251.tar.gz |
MDEV-6152: Remove calls to current_thd while creating Item
Part 5: Removing calls to current_thd in net_read calls, creating fields,
query_cache, acl and some other places where thd was available
Diffstat (limited to 'sql/item_sum.cc')
-rw-r--r-- | sql/item_sum.cc | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/sql/item_sum.cc b/sql/item_sum.cc index b67986f0fb0..c56c4c217fb 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -502,23 +502,27 @@ Field *Item_sum::create_tmp_field(bool group, TABLE *table, uint convert_blob_length) { Field *UNINIT_VAR(field); + MEM_ROOT *mem_root= table->in_use->mem_root; + switch (result_type()) { case REAL_RESULT: - field= new Field_double(max_length, maybe_null, name, decimals, TRUE); + field= new (mem_root) + Field_double(max_length, maybe_null, name, decimals, TRUE); break; case INT_RESULT: - field= new Field_longlong(max_length, maybe_null, name, unsigned_flag); + field= new (mem_root) + Field_longlong(max_length, maybe_null, name, unsigned_flag); break; case STRING_RESULT: if (max_length/collation.collation->mbmaxlen <= 255 || convert_blob_length > Field_varstring::MAX_SIZE || !convert_blob_length) return make_string_field(table); - field= new Field_varstring(convert_blob_length, maybe_null, - name, table->s, collation.collation); + field= new (mem_root) Field_varstring(convert_blob_length, maybe_null, + name, table->s, collation.collation); break; case DECIMAL_RESULT: - field= Field_new_decimal::create_from_item(this); + field= Field_new_decimal::create_from_item(mem_root, this); break; case ROW_RESULT: case TIME_RESULT: @@ -1266,33 +1270,37 @@ Field *Item_sum_hybrid::create_tmp_field(bool group, TABLE *table, uint convert_blob_length) { Field *field; + MEM_ROOT *mem_root; + if (args[0]->type() == Item::FIELD_ITEM) { field= ((Item_field*) args[0])->field; - if ((field= create_tmp_field_from_field(current_thd, field, name, table, + if ((field= create_tmp_field_from_field(table->in_use, field, name, table, NULL, convert_blob_length))) field->flags&= ~NOT_NULL_FLAG; return field; } + /* DATE/TIME fields have STRING_RESULT result types. In order to preserve field type, it's needed to handle DATE/TIME fields creations separately. */ + mem_root= table->in_use->mem_root; switch (args[0]->field_type()) { case MYSQL_TYPE_DATE: - field= new Field_newdate(0, maybe_null ? (uchar*)"" : 0, 0, Field::NONE, - name); + field= new (mem_root) + Field_newdate(0, maybe_null ? (uchar*)"" : 0, 0, Field::NONE, name); break; case MYSQL_TYPE_TIME: - field= new_Field_time(0, maybe_null ? (uchar*)"" : 0, 0, Field::NONE, - name, decimals); + field= new_Field_time(mem_root, 0, maybe_null ? (uchar*)"" : 0, 0, + Field::NONE, name, decimals); break; case MYSQL_TYPE_TIMESTAMP: case MYSQL_TYPE_DATETIME: - field= new_Field_datetime(0, maybe_null ? (uchar*)"" : 0, 0, Field::NONE, - name, decimals); + field= new_Field_datetime(mem_root, 0, maybe_null ? (uchar*)"" : 0, 0, + Field::NONE, name, decimals); break; default: return Item_sum::create_tmp_field(group, table, convert_blob_length); @@ -1657,6 +1665,8 @@ Field *Item_sum_avg::create_tmp_field(bool group, TABLE *table, uint convert_blob_len) { Field *field; + MEM_ROOT *mem_root= table->in_use->mem_root; + if (group) { /* @@ -1664,14 +1674,16 @@ Field *Item_sum_avg::create_tmp_field(bool group, TABLE *table, The easiest way is to do this is to store both value in a string and unpack on access. */ - field= new Field_string(((hybrid_type == DECIMAL_RESULT) ? - dec_bin_size : sizeof(double)) + sizeof(longlong), - 0, name, &my_charset_bin); + field= new (mem_root) + Field_string(((hybrid_type == DECIMAL_RESULT) ? + dec_bin_size : sizeof(double)) + sizeof(longlong), + 0, name, &my_charset_bin); } else if (hybrid_type == DECIMAL_RESULT) - field= Field_new_decimal::create_from_item(this); + field= Field_new_decimal::create_from_item(mem_root, this); else - field= new Field_double(max_length, maybe_null, name, decimals, TRUE); + field= new (mem_root) Field_double(max_length, maybe_null, name, decimals, + TRUE); if (field) field->init(table); return field; |