summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <ramil@mysql.com>2005-03-30 14:43:56 +0500
committerunknown <ramil@mysql.com>2005-03-30 14:43:56 +0500
commit216ed8c7e282c0c993f50f19950813f5c8bf423e (patch)
tree25a0f5394faf2ab4e13b329cc4fd307be9904a2b /sql
parentdad034597ed0dc2f34fbd41489cb23fc25ec7341 (diff)
downloadmariadb-git-216ed8c7e282c0c993f50f19950813f5c8bf423e.tar.gz
A fix (bug #9401: type_timestamp segfaults mysqld)
sql/sql_select.cc: A fix (bug #9401: type_timestamp segfaults mysqld). 1. create_tmp_field_from_field() is modified to take 'Item_ref *item' and 'char *name' instead of 'bool modify_item' and 'Item *item'. 2. For Item_sum_min/max we should never modify item, so NULL is passed as item to the create_tmp_field_from_field().
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_select.cc32
1 files changed, 17 insertions, 15 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index c79912e7eae..364d1c199ac 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -4604,14 +4604,14 @@ const_expression_in_where(COND *cond, Item *comp_item, Item **const_item)
create_tmp_field_from_field()
thd Thread handler
org_field field from which new field will be created
+ name New field name
item Item to create a field for
table Temporary table
- modify_item 1 if item->result_field should point to new item.
- This is relevent for how fill_record() is going to
- work:
- If modify_item is 1 then fill_record() will update
+ item !=NULL if item->result_field should point to new field.
+ This is relevant for how fill_record() is going to work:
+ If item != NULL then fill_record() will update
the record in the original table.
- If modify_item is 0 then fill_record() will update
+ If item == NULL then fill_record() will update
the temporary table
convert_blob_length If >0 create a varstring(convert_blob_length) field
instead of blob.
@@ -4622,8 +4622,8 @@ const_expression_in_where(COND *cond, Item *comp_item, Item **const_item)
*/
static Field* create_tmp_field_from_field(THD *thd, Field* org_field,
- Item *item, TABLE *table,
- bool modify_item,
+ const char *name, TABLE *table,
+ Item_field *item,
uint convert_blob_length)
{
Field *new_field;
@@ -4636,10 +4636,10 @@ static Field* create_tmp_field_from_field(THD *thd, Field* org_field,
new_field= org_field->new_field(thd->mem_root, table);
if (new_field)
{
- if (modify_item)
- ((Item_field *)item)->result_field= new_field;
+ if (item)
+ item->result_field= new_field;
else
- new_field->field_name= item->name;
+ new_field->field_name= name;
if (org_field->maybe_null())
new_field->flags&= ~NOT_NULL_FLAG; // Because of outer join
if (org_field->type() == FIELD_TYPE_VAR_STRING)
@@ -4779,8 +4779,8 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
if (item_sum->args[0]->type() == Item::FIELD_ITEM)
{
*from_field= ((Item_field*) item_sum->args[0])->field;
- return create_tmp_field_from_field(thd, *from_field, item, table,
- modify_item, convert_blob_length);
+ return create_tmp_field_from_field(thd, *from_field, item->name, table,
+ NULL, convert_blob_length);
}
/* fall through */
default:
@@ -4818,8 +4818,10 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
case Item::DEFAULT_VALUE_ITEM:
{
Item_field *field= (Item_field*) item;
- return create_tmp_field_from_field(thd, (*from_field= field->field), item,
- table, modify_item, convert_blob_length);
+ return create_tmp_field_from_field(thd, (*from_field= field->field),
+ item->name, table,
+ modify_item ? (Item_field*) item : NULL,
+ convert_blob_length);
}
case Item::FUNC_ITEM:
case Item::COND_ITEM:
@@ -4840,7 +4842,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
{
Field *example= ((Item_type_holder *)item)->example();
if (example)
- return create_tmp_field_from_field(thd, example, item, table, 0,
+ return create_tmp_field_from_field(thd, example, item->name, table, NULL,
convert_blob_length);
return create_tmp_field_from_item(thd, item, table, copy_func, 0,
convert_blob_length);