diff options
author | unknown <sergefp@mysql.com> | 2004-12-11 19:59:09 +0300 |
---|---|---|
committer | unknown <sergefp@mysql.com> | 2004-12-11 19:59:09 +0300 |
commit | b5c119e7c0f3b0ff6885c0dc247f53902ef7f621 (patch) | |
tree | 1156ba1912e0fbfcdb51f4d4f429571f559073d3 /sql | |
parent | 9286d1c1452d53dd36c94fbe94a3f99be7b1dfb2 (diff) | |
download | mariadb-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.cc | 1 | ||||
-rw-r--r-- | sql/item.h | 14 |
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); } |