Commit ccee4036 authored by unknown's avatar unknown

Manually merged


sql/item.cc:
  Auto merged
sql/sql_select.cc:
  Auto merged
parents 2a138695 4b7c4cd2
...@@ -392,3 +392,16 @@ HAVING HU.PROJ.CITY = HU.STAFF.CITY); ...@@ -392,3 +392,16 @@ HAVING HU.PROJ.CITY = HU.STAFF.CITY);
EMPNUM GRADE*1000 EMPNUM GRADE*1000
E3 13000 E3 13000
DROP SCHEMA HU; 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;
...@@ -393,3 +393,16 @@ SELECT EMPNUM, GRADE*1000 ...@@ -393,3 +393,16 @@ SELECT EMPNUM, GRADE*1000
HAVING HU.PROJ.CITY = HU.STAFF.CITY); HAVING HU.PROJ.CITY = HU.STAFF.CITY);
DROP SCHEMA HU; 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;
...@@ -3137,7 +3137,8 @@ static Item** find_field_in_group_list(Item *find_item, ORDER *group_list) ...@@ -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 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 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 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 NOTES
The resolution procedure is: The resolution procedure is:
...@@ -3147,7 +3148,9 @@ static Item** find_field_in_group_list(Item *find_item, ORDER *group_list) ...@@ -3147,7 +3148,9 @@ static Item** find_field_in_group_list(Item *find_item, ORDER *group_list)
in the GROUP BY clause of Q. in the GROUP BY clause of Q.
- If found different columns with the same name in GROUP BY and SELECT - If found different columns with the same name in GROUP BY and SELECT
- issue a warning and return the GROUP BY column, - 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 RETURN
...@@ -3192,6 +3195,17 @@ resolve_ref_in_select_and_group(THD *thd, Item_ident *ref, SELECT_LEX *select) ...@@ -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 || group_by_ref)
{ {
if (select_ref != not_found_item && !ambiguous_fields) if (select_ref != not_found_item && !ambiguous_fields)
......
...@@ -5615,3 +5615,5 @@ ER_MAX_PREPARED_STMT_COUNT_REACHED 42000 ...@@ -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)" eng "Can't create more than max_prepared_stmt_count statements (current value: %lu)"
ER_VIEW_RECURSIVE ER_VIEW_RECURSIVE
eng "`%-.64s`.`%-.64s` contain view recursion" eng "`%-.64s`.`%-.64s` contain view recursion"
ER_NON_GROUPING_FIELD_USED 42000
eng "non-grouping field '%-.64s' is used in %-.64s clause"
...@@ -12613,6 +12613,10 @@ setup_group(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, ...@@ -12613,6 +12613,10 @@ setup_group(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
if (item->type() != Item::SUM_FUNC_ITEM && !item->marker && if (item->type() != Item::SUM_FUNC_ITEM && !item->marker &&
!item->const_item()) !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()); my_error(ER_WRONG_FIELD_WITH_GROUP, MYF(0), item->full_name());
return 1; return 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment