Commit ccee4036 authored by unknown's avatar unknown
Browse files

Manually merged


sql/item.cc:
  Auto merged
sql/sql_select.cc:
  Auto merged
parents 2a138695 4b7c4cd2
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -392,3 +392,16 @@ HAVING HU.PROJ.CITY = HU.STAFF.CITY);
EMPNUM	GRADE*1000
E3	13000
DROP SCHEMA HU;
USE test;
create table t1(f1 int);
select f1 from t1 having max(f1)=f1;
f1
select f1 from t1 group by f1 having max(f1)=f1;
f1
set session sql_mode='ONLY_FULL_GROUP_BY';
select f1 from t1 having max(f1)=f1;
ERROR 42000: non-grouping field 'f1' is used in HAVING clause
select f1 from t1 group by f1 having max(f1)=f1;
f1
set session sql_mode='';
drop table t1;
+13 −0
Original line number Diff line number Diff line
@@ -393,3 +393,16 @@ SELECT EMPNUM, GRADE*1000
                           HAVING HU.PROJ.CITY = HU.STAFF.CITY);

DROP SCHEMA HU;
USE test;
#
# Bug#18739: non-standard HAVING extension was allowed in strict ANSI sql mode.
#
create table t1(f1 int);
select f1 from t1 having max(f1)=f1;
select f1 from t1 group by f1 having max(f1)=f1;
set session sql_mode='ONLY_FULL_GROUP_BY';
--error 1461
select f1 from t1 having max(f1)=f1;
select f1 from t1 group by f1 having max(f1)=f1;
set session sql_mode='';
drop table t1;
+16 −2
Original line number Diff line number Diff line
@@ -3137,7 +3137,8 @@ static Item** find_field_in_group_list(Item *find_item, ORDER *group_list)
    both clauses contain different fields with the same names, a warning is
    issued that name of 'ref' is ambiguous. We extend ANSI SQL in that when no
    GROUP BY column is found, then a HAVING name is resolved as a possibly
    derived SELECT column.
    derived SELECT column. This extension is allowed only if the
    MODE_ONLY_FULL_GROUP_BY sql mode isn't enabled.

  NOTES
    The resolution procedure is:
@@ -3147,7 +3148,9 @@ static Item** find_field_in_group_list(Item *find_item, ORDER *group_list)
      in the GROUP BY clause of Q.
    - If found different columns with the same name in GROUP BY and SELECT
      - issue a warning and return the GROUP BY column,
      - otherwise return the found SELECT column.
      - otherwise
        - if the MODE_ONLY_FULL_GROUP_BY mode is enabled return error
        - else return the found SELECT column.


  RETURN
@@ -3192,6 +3195,17 @@ resolve_ref_in_select_and_group(THD *thd, Item_ident *ref, SELECT_LEX *select)
    }
  }

  if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY &&
      select_ref != not_found_item && !group_by_ref)
  {
    /*
      Report the error if fields was found only in the SELECT item list and
      the strict mode is enabled.
    */
    my_error(ER_NON_GROUPING_FIELD_USED, MYF(0),
             ref->name, "HAVING");
    return NULL;
  }
  if (select_ref != not_found_item || group_by_ref)
  {
    if (select_ref != not_found_item && !ambiguous_fields)
+2 −0
Original line number Diff line number Diff line
@@ -5615,3 +5615,5 @@ ER_MAX_PREPARED_STMT_COUNT_REACHED 42000
        eng "Can't create more than max_prepared_stmt_count statements (current value: %lu)"
ER_VIEW_RECURSIVE
        eng "`%-.64s`.`%-.64s` contain view recursion"
ER_NON_GROUPING_FIELD_USED 42000
	eng "non-grouping field '%-.64s' is used in %-.64s clause"
+4 −0
Original line number Diff line number Diff line
@@ -12613,6 +12613,10 @@ setup_group(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
      if (item->type() != Item::SUM_FUNC_ITEM && !item->marker &&
	  !item->const_item())
      {
        /*
          TODO: change ER_WRONG_FIELD_WITH_GROUP to more detailed
          ER_NON_GROUPING_FIELD_USED
        */
	my_error(ER_WRONG_FIELD_WITH_GROUP, MYF(0), item->full_name());
	return 1;
      }