• unknown's avatar
    Fixed bug#18739: non-standard HAVING extension was allowed in strict ANSI sql mode. · 4b7c4cd2
    unknown authored
    The SQL standard doesn't allow to use in HAVING clause fields that are not 
    present in GROUP BY clause and not under any aggregate function in the HAVING
    clause. However, mysql allows using such fields. This extension assume that 
    the non-grouping fields will have the same group-wise values. Otherwise, the 
    result will be unpredictable. This extension allowed in strict 
    MODE_ONLY_FULL_GROUP_BY sql mode results in misunderstanding of HAVING 
    capabilities.
    
    The new error message ER_NON_GROUPING_FIELD_USED message is added. It says
    "non-grouping field '%-.64s' is used in %-.64s clause". This message is
    supposed to be used for reporting errors when some field is not found in the
    GROUP BY clause but have to be present there. Use cases for this message are 
    this bug and when a field is present in a SELECT item list not under any 
    aggregate function and there is GROUP BY clause present which doesn't mention 
    that field. It renders the ER_WRONG_FIELD_WITH_GROUP error message obsolete as
    being more descriptive.
    The resolve_ref_in_select_and_group() function now reports the 
    ER_NON_GROUPING_FIELD_FOUND error if the strict mode is set and the field for 
    HAVING clause is found in the SELECT item list only.
    
    
    
    sql/share/errmsg.txt:
      Added the new ER_NON_GROUPING_FIELD_USED error message for the bug#14169.
    mysql-test/t/having.test:
      Added test case for the bug#18739:  non-standard HAVING extension was allowed in strict ANSI sql mode.
    mysql-test/r/having.result:
      Added test case for the bug#18739:  non-standard HAVING extension was allowed in strict ANSI sql mode.
    sql/sql_select.cc:
      Added TODO comment to change the ER_WRONG_FIELD_WITH_GROUP to more detailed ER_NON_GROUPING_FIELD_USED message.
    sql/item.cc:
      Fixed bug#18739: non-standard HAVING extension was allowed in strict ANSI sql mode.
      The resolve_ref_in_select_and_group() function now reports the
      ER_NON_GROUPING_FIELD_FOUND error if the strict MODE_ONLY_FULL_GROUP_BY mode
      is set and the field for HAVING clause is found in the SELECT item list only.
    4b7c4cd2
sql_select.cc 446 KB