summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <sergefp@mysql.com>2004-12-11 19:59:09 +0300
committerunknown <sergefp@mysql.com>2004-12-11 19:59:09 +0300
commitb5c119e7c0f3b0ff6885c0dc247f53902ef7f621 (patch)
tree1156ba1912e0fbfcdb51f4d4f429571f559073d3 /sql
parent9286d1c1452d53dd36c94fbe94a3f99be7b1dfb2 (diff)
downloadmariadb-git-b5c119e7c0f3b0ff6885c0dc247f53902ef7f621.tar.gz
Fix for BUG#6976:
In Item_ref::Item_ref set maybe_null (and other fields fix_fields sets) to be the same as in (*ref), because Item_ref::fix_fields() will not be called. Previously maybe_null was 0 always and this produced a bogus state where maybe_null==0 && is_null() == true which broke evaluation for some upper-level Items, like AND and OR. mysql-test/r/group_by.result: Test for BUG#6976 mysql-test/t/group_by.test: Test for BUG#6976 sql/item.cc: Comment added sql/item.h: Fix for BUG#6976: in Item_ref::Item_ref(Item**...) fix all fields because fix_fields() will not be called.
Diffstat (limited to 'sql')
-rw-r--r--sql/item.cc1
-rw-r--r--sql/item.h14
2 files changed, 14 insertions, 1 deletions
diff --git a/sql/item.cc b/sql/item.cc
index 739b5385b55..8737cc06bbd 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -687,6 +687,7 @@ bool Item_null::send(THD *thd, String *packet)
/*
This is used for HAVING clause
Find field in select list having the same name
+ This is not always called, see also Item_ref::Item_ref
*/
bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables)
diff --git a/sql/item.h b/sql/item.h
index f6f9e1c0621..cc6a846d6c1 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -401,7 +401,19 @@ public:
Item_ref(char *db_par,char *table_name_par,char *field_name_par)
:Item_ident(db_par,table_name_par,field_name_par),ref(0) {}
Item_ref(Item **item, char *table_name_par,char *field_name_par)
- :Item_ident(NullS,table_name_par,field_name_par),ref(item) {}
+ :Item_ident(NullS,table_name_par,field_name_par),ref(item)
+ {
+ /*
+ This ctor is called from Item_XXX::split_sum_func, and fix_fields will
+ not be called for *this, so we must setup everything here. **ref is
+ already fixed at this point.
+ */
+ max_length= (*ref)->max_length;
+ decimals= (*ref)->decimals;
+ binary= (*ref)->binary;
+ with_sum_func= (*ref)->with_sum_func;
+ maybe_null= (*ref)->maybe_null;
+ }
enum Type type() const { return REF_ITEM; }
bool eq(const Item *item, bool binary_cmp) const
{ return (*ref)->eq(item, binary_cmp); }