• unknown's avatar
    Bug#23417: Too strict checks against GROUP BY in the ONLY_FULL_GROUP_BY mode. · 4d143a6f
    unknown authored
    Currently in the ONLY_FULL_GROUP_BY mode no hidden fields are allowed in the
    select list. To ensure this each expression in the select list is checked
    to be a constant, an aggregate function or to occur in the GROUP BY list.
    The last two requirements are wrong and doesn't allow valid expressions like
    "MAX(b) - MIN(b)" or "a + 1" in a query with grouping by a.
    
    The correct check implemented by the patch will ensure that:
    any field reference in the [sub]expressions of the select list 
      is under an aggregate function or
      is mentioned as member of the group list or
      is an outer reference or
      is part of the select list element that coincide with a grouping element.
    
    The Item_field objects now can contain the position of the select list
    expression which they belong to. The position is saved during the
    field's Item_field::fix_fields() call.
    
    The non_agg_fields list for non-aggregated fields is added to the SELECT_LEX
    class. The SELECT_LEX::cur_pos_in_select_list now contains the position in the
    select list of the expression being currently fixed.
    
    
    sql/item.cc:
      Bug#23417: Too strict checks against GROUP BY in the ONLY_FULL_GROUP_BY mode.
      The Item_field objects now contain the position of the select list
      expression which they belong to. The position is saved at the field's
      Item_field::fix_fields() call.
    sql/item.h:
      Bug#23417: Too strict checks against GROUP BY in the ONLY_FULL_GROUP_BY mode.
      The Item_field objects now can store the position in the select list of the
      expression to which they are belongs to.
    sql/mysql_priv.h:
      Bug#23417: Too strict checks against GROUP BY in the ONLY_FULL_GROUP_BY mode.
      Added the UNDEF_POS constant.
    sql/sql_base.cc:
      Bug#23417: Too strict checks against GROUP BY in the ONLY_FULL_GROUP_BY mode.
      Now the setup_fields() function maintains the cur_pos_in_select_list variable.
    sql/sql_lex.cc:
      Bug#23417: Too strict checks against GROUP BY in the ONLY_FULL_GROUP_BY mode.
      Set the cur_pos_in_select_list variable and the non_agg_fields list to their initial state.
    sql/sql_lex.h:
      Bug#23417: Too strict checks against GROUP BY in the ONLY_FULL_GROUP_BY mode.
      The non_agg_fields list for non-aggregated fields is added to the SELECT_LEX
      class. The SELECT_LEX::cur_pos_in_select_list now stores the position in the
      select list of the expression being currently fixed.
    sql/sql_select.cc:
      Bug#23417: Too strict checks against GROUP BY in the ONLY_FULL_GROUP_BY mode.
      Each select now keeps the list of fields that aren't
      used under any aggregate function. If an expression from the select list
      isn't found in the GROUP BY list the setup_group() function additionally
      checks whether non-aggregated fields occur in that expression.
      If there at least one such field and it isn't found in the GROUP BY list
      then an error is thrown.
    sql/sql_union.cc:
      Bug#23417: Too strict checks against GROUP BY in the ONLY_FULL_GROUP_BY mode.
      Clean up of the non_agg_fields list.
    mysql-test/r/group_by.result:
      Added a test case for the bug#23417: Too strict checks against GROUP BY in the ONLY_FULL_GROUP_BY mode.
    mysql-test/t/group_by.test:
      Added a test case for the bug#23417: Too strict checks against GROUP BY in the ONLY_FULL_GROUP_BY mode.
    4d143a6f
sql_select.cc 475 KB