From e66e0c1a04b78c899c9a6a0218a215023ec5bfa0 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 23 Aug 2004 10:53:53 +0200 Subject: [PATCH] better for for bug#4767 --- sql/item_sum.cc | 3 --- sql/sql_select.cc | 23 ++++++++++++++--------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 3aacf7605c6..cbb4cd41046 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -159,10 +159,7 @@ Item *Item_sum::get_tmp_table_item(THD *thd) if (!arg->const_item()) { if (arg->type() == Item::FIELD_ITEM) - { - arg->maybe_null= result_field_tmp->maybe_null(); ((Item_field*) arg)->field= result_field_tmp++; - } else sum_item->args[i]= new Item_field(result_field_tmp++); } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index fdea963b3ca..4ee3fa234e3 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4740,7 +4740,7 @@ static Field* create_tmp_field_from_item(THD *thd, copy_func If set and item is a function, store copy of item in this array from_field if field will be created using other field as example, - pointer example field will be written here + pointer example field will be written here group 1 if we are going to do a relative group by on result modify_item 1 if item->result_field should point to new item. This is relevent for how fill_record() is going to @@ -4749,7 +4749,7 @@ static Field* create_tmp_field_from_item(THD *thd, the record in the original table. If modify_item is 0 then fill_record() will update the temporary table - + RETURN 0 on error new_created field @@ -4773,13 +4773,13 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, return new Field_double(item_sum->max_length,maybe_null, item->name, table, item_sum->decimals); case Item_sum::VARIANCE_FUNC: /* Place for sum & count */ - case Item_sum::STD_FUNC: + case Item_sum::STD_FUNC: if (group) return new Field_string(sizeof(double)*2+sizeof(longlong), 0, item->name,table,&my_charset_bin); else return new Field_double(item_sum->max_length, maybe_null, - item->name,table,item_sum->decimals); + item->name,table,item_sum->decimals); case Item_sum::UNIQUE_USERS_FUNC: return new Field_long(9,maybe_null,item->name,table,1); default: @@ -4887,7 +4887,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, else // if we run out of slots or we are not using tempool sprintf(path,"%s%s%lx_%lx_%x",mysql_tmpdir,tmp_file_prefix,current_pid, thd->thread_id, thd->tmp_table++); - + if (lower_case_table_names) my_casedn_str(files_charset_info, path); @@ -5003,16 +5003,21 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, tmp_from_field++; *(reg_field++)= new_field; reclength+=new_field->pack_length(); - if (!(new_field->flags & NOT_NULL_FLAG)) - null_count++; if (new_field->flags & BLOB_FLAG) { *blob_field++= new_field; blob_count++; } ((Item_sum*) item)->args[i]= new Item_field(new_field); - if (((Item_sum*) item)->arg_count == 1) - ((Item_sum*) item)->result_field= new_field; + if (!(new_field->flags & NOT_NULL_FLAG)) + { + null_count++; + /* + new_field->maybe_null() is still false, it will be + changed below. But we have to setup Item_field correctly + */ + ((Item_sum*) item)->args[i]->maybe_null=1; + } } } }