mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
Manually merged
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
18
sql/item.cc
18
sql/item.cc
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user