Loading mysql-test/r/having.result +13 −0 Original line number Diff line number Diff line Loading @@ -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; mysql-test/t/having.test +13 −0 Original line number Diff line number Diff line Loading @@ -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; sql/item.cc +16 −2 Original line number Diff line number Diff line Loading @@ -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: Loading @@ -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 Loading Loading @@ -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) Loading sql/share/errmsg.txt +2 −0 Original line number Diff line number Diff line Loading @@ -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" sql/sql_select.cc +4 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading
mysql-test/r/having.result +13 −0 Original line number Diff line number Diff line Loading @@ -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;
mysql-test/t/having.test +13 −0 Original line number Diff line number Diff line Loading @@ -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;
sql/item.cc +16 −2 Original line number Diff line number Diff line Loading @@ -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: Loading @@ -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 Loading Loading @@ -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) Loading
sql/share/errmsg.txt +2 −0 Original line number Diff line number Diff line Loading @@ -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"
sql/sql_select.cc +4 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading