summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <sergefp@mysql.com>2004-12-13 20:10:07 +0300
committerunknown <sergefp@mysql.com>2004-12-13 20:10:07 +0300
commit2bd5c53c18ca208c7692076b2d53d4f0284c5730 (patch)
treed267c00c924268a47f11688ca46d18ee4ad5a09c /sql
parentce8b0879ce77254c11d4dbd80c6e77083a55f713 (diff)
parent74a8fdd997ff8fd68a5364888d705a3b76c9e9ce (diff)
downloadmariadb-git-2bd5c53c18ca208c7692076b2d53d4f0284c5730.tar.gz
Merged (will need a post-merge fix)
sql/item.h: Auto merged sql/item_cmpfunc.cc: Auto merged
Diffstat (limited to 'sql')
-rw-r--r--sql/item.cc5
-rw-r--r--sql/item.h21
-rw-r--r--sql/item_cmpfunc.cc3
-rw-r--r--sql/item_func.cc2
-rw-r--r--sql/item_row.cc3
-rw-r--r--sql/item_strfunc.cc2
6 files changed, 29 insertions, 7 deletions
diff --git a/sql/item.cc b/sql/item.cc
index 9ed8b39dece..ec637eb8bce 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -1488,14 +1488,13 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
"forward reference in item list");
return -1;
}
-
Item_ref *rf= (place == IN_HAVING ?
new Item_ref(last->ref_pointer_array + counter,
(char *)table_name,
- (char *)field_name) :
+ (char *)field_name, this) :
new Item_direct_ref(last->ref_pointer_array + counter,
(char *)table_name,
- (char *)field_name));
+ (char *)field_name, this));
if (!rf)
return 1;
thd->change_item_tree(ref, rf);
diff --git a/sql/item.h b/sql/item.h
index 7a288473533..119fad83746 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -835,6 +835,26 @@ public:
:Item_ident(db_par, table_name_par, field_name_par), ref(0) {}
Item_ref(Item **item, const char *table_name_par, const char *field_name_par)
:Item_ident(NullS, table_name_par, field_name_par), ref(item) {}
+
+ /*
+ This constructor is used when processing GROUP BY and referred Item is
+ available. We set all properties here because fix_fields() will not be
+ called for the created Item_ref. (see BUG#6976)
+ TODO check if we could get rid of *_name_par parameters and if we need to
+ perform similar initialization for other ctors.
+ TODO we probably fix a superset of problems like in BUG#6658. Check this
+ with Bar, and if we have a more broader set of problems like this.
+ */
+ Item_ref(Item **item, const char *table_name_par,
+ const char *field_name_par, Item *src)
+ : Item_ident(NullS, table_name_par, field_name_par), ref(item)
+ {
+ collation.set(src->collation);
+ max_length= src->max_length;
+ decimals= src->decimals;
+ with_sum_func= src->with_sum_func;
+ maybe_null= src->maybe_null;
+ }
/* Constructor need to process subselect with temporary tables (see Item) */
Item_ref(THD *thd, Item_ref *item) :Item_ident(thd, item), ref(item->ref) {}
enum Type type() const { return REF_ITEM; }
@@ -933,6 +953,7 @@ public:
class Item_in_subselect;
+
class Item_ref_null_helper: public Item_ref
{
protected:
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 88083878053..0b824178afd 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -2022,7 +2022,8 @@ void Item_cond::split_sum_func(THD *thd, Item **ref_pointer_array,
{
Item **ref= li.ref();
uint el= fields.elements;
- Item *new_item= new Item_ref(ref_pointer_array + el, 0, item->name);
+ Item *new_item= new Item_ref(ref_pointer_array + el, 0, item->name,
+ item);
fields.push_front(item);
ref_pointer_array[el]= item;
thd->change_item_tree(ref, new_item);
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 98b204d1809..af53a771720 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -349,7 +349,7 @@ void Item_func::split_sum_func(THD *thd, Item **ref_pointer_array,
else if (item->used_tables() || item->type() == SUM_FUNC_ITEM)
{
uint el= fields.elements;
- Item *new_item= new Item_ref(ref_pointer_array + el, 0, item->name);
+ Item *new_item= new Item_ref(ref_pointer_array + el, 0, item->name, item);
new_item->collation.set(item->collation);
fields.push_front(item);
ref_pointer_array[el]= item;
diff --git a/sql/item_row.cc b/sql/item_row.cc
index 289efe45300..b65b0b7b608 100644
--- a/sql/item_row.cc
+++ b/sql/item_row.cc
@@ -95,7 +95,8 @@ void Item_row::split_sum_func(THD *thd, Item **ref_pointer_array,
else if ((*arg)->used_tables() || (*arg)->type() == SUM_FUNC_ITEM)
{
uint el= fields.elements;
- Item *new_item= new Item_ref(ref_pointer_array + el, 0, (*arg)->name);
+ Item *new_item= new Item_ref(ref_pointer_array + el, 0, (*arg)->name,
+ *arg);
fields.push_front(*arg);
ref_pointer_array[el]= *arg;
thd->change_item_tree(arg, new_item);
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index aaeeb9d8bb8..82cbd1fed72 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -1748,7 +1748,7 @@ void Item_func_make_set::split_sum_func(THD *thd, Item **ref_pointer_array,
else if (item->used_tables() || item->type() == SUM_FUNC_ITEM)
{
uint el= fields.elements;
- Item *new_item= new Item_ref(ref_pointer_array + el, 0, item->name);
+ Item *new_item= new Item_ref(ref_pointer_array + el, 0, item->name,item);
fields.push_front(item);
ref_pointer_array[el]= item;
thd->change_item_tree(&item, new_item);