diff options
author | Igor Babaev <igor@askmonty.org> | 2010-05-25 23:14:18 -0700 |
---|---|---|
committer | Igor Babaev <igor@askmonty.org> | 2010-05-25 23:14:18 -0700 |
commit | d120c5b562629dda782e3c9a66cfeaa48cbb01d1 (patch) | |
tree | 6da6a69adc00f657dc62d863a334d57f7a0f1907 /sql/item.cc | |
parent | d6c97c913e4e0084f01b7551c5c2f06e10c2fdc7 (diff) | |
download | mariadb-git-d120c5b562629dda782e3c9a66cfeaa48cbb01d1.tar.gz |
Changed the fixes for the following bugs:
Bug #39022: completed
Bug #39653: reverted as invalid
Bug #45640: ameliorated, simplified, optimized
Bug #48483: completed
Bug #49324: improved
Bug #51242/52336: reverted, applied a real fix.
Diffstat (limited to 'sql/item.cc')
-rw-r--r-- | sql/item.cc | 59 |
1 files changed, 41 insertions, 18 deletions
diff --git a/sql/item.cc b/sql/item.cc index c2d1bb30d0a..5e8a941185a 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -4321,31 +4321,18 @@ bool Item_field::fix_fields(THD *thd, Item **reference) It's not an Item_field in the select list so we must make a new Item_ref to point to the Item in the select list and replace the Item_field created by the parser with the new Item_ref. - - NOTE: If we are fixing an alias reference inside ORDER/GROUP BY - item tree, then we use new Item_ref as an intermediate value - to resolve referenced item only. - In this case the new Item_ref item is unused. */ Item_ref *rf= new Item_ref(context, db_name,table_name,field_name); if (!rf) return 1; - - bool save_group_fix_field= thd->lex->current_select->group_fix_field; - /* - No need for recursive resolving of aliases. - */ - thd->lex->current_select->group_fix_field= 0; - bool ret= rf->fix_fields(thd, (Item **) &rf) || rf->check_cols(1); - thd->lex->current_select->group_fix_field= save_group_fix_field; if (ret) return TRUE; - - if (save_group_fix_field && alias_name_used) - thd->change_item_tree(reference, *rf->ref); - else - thd->change_item_tree(reference, rf); + + SELECT_LEX *select= thd->lex->current_select; + thd->change_item_tree(reference, + select->parsing_place == IN_GROUP_BY && + alias_name_used ? *rf->ref : rf); return FALSE; } @@ -6439,6 +6426,42 @@ bool Item_outer_ref::fix_fields(THD *thd, Item **reference) /** + Mark references from inner selects used in group by clause + + The method is used by the walk method when called for the expressions + from the group by clause. The callsare occurred in the function + fix_inner_refs invoked by JOIN::prepare. + The parameter passed to Item_outer_ref::check_inner_refs_processor + is the iterator over the list of inner references from the subselects + of the select to be prepared. The function marks those references + from this list whose occurrences are encountered in the group by + expressions passed to the walk method. + + @param arg pointer to the iterator over a list of inner references + + @return + FALSE always +*/ + +bool Item_outer_ref::check_inner_refs_processor(uchar *arg) +{ + List_iterator_fast<Item_outer_ref> *it= + ((List_iterator_fast<Item_outer_ref> *) arg); + Item_outer_ref *ref; + while ((ref= (*it)++)) + { + if (ref == this) + { + ref->found_in_group_by= 1; + break; + } + } + (*it).rewind(); + return FALSE; +} + + +/** Compare two view column references for equality. A view column reference is considered equal to another column |