mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
Fixed MDEV-5617: mysqld crashes when running a query with ONLY_FULL_GROUP_BY
Problem was that we used cache_table in some cases where it was not initialized mysql-test/r/func_group.result: Added test case mysql-test/t/func_group.test: Added test case sql/item.cc: Don't use cached_table if not set sql/item_sum.cc: Don't use cached_table
This commit is contained in:
parent
2d48e9f11c
commit
1bdf2151da
4 changed files with 32 additions and 8 deletions
|
@ -1458,6 +1458,8 @@ DROP TABLE derived1;
|
||||||
DROP TABLE D;
|
DROP TABLE D;
|
||||||
CREATE TABLE t1 (a INT, b INT);
|
CREATE TABLE t1 (a INT, b INT);
|
||||||
INSERT INTO t1 VALUES (1,1), (1,2), (1,3);
|
INSERT INTO t1 VALUES (1,1), (1,2), (1,3);
|
||||||
|
CREATE TABLE t2 (b INT);
|
||||||
|
INSERT INTO t2 VALUES (3),(4);
|
||||||
SET SQL_MODE='ONLY_FULL_GROUP_BY';
|
SET SQL_MODE='ONLY_FULL_GROUP_BY';
|
||||||
SELECT COUNT(*) FROM t1;
|
SELECT COUNT(*) FROM t1;
|
||||||
COUNT(*)
|
COUNT(*)
|
||||||
|
@ -1473,12 +1475,19 @@ COUNT(*)
|
||||||
SELECT COUNT(*), (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a)
|
SELECT COUNT(*), (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a)
|
||||||
FROM t1 outr;
|
FROM t1 outr;
|
||||||
ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
|
ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
|
||||||
|
SELECT COUNT(*) FROM t1 outr, (SELECT b, count(*) FROM t2) as t3;
|
||||||
|
ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
|
||||||
|
SELECT COUNT(*) FROM t1 outr where (1,1) in (SELECT a, count(*) FROM t2);
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
SELECT COUNT(*) FROM t1 a JOIN t1 outr
|
SELECT COUNT(*) FROM t1 a JOIN t1 outr
|
||||||
ON a.a= (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a);
|
ON a.a= (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a);
|
||||||
COUNT(*)
|
COUNT(*)
|
||||||
0
|
0
|
||||||
|
SELECT * FROM (SELECT a FROM t1 GROUP BY a) sq JOIN t2 ON a = b;
|
||||||
|
a b
|
||||||
SET SQL_MODE=default;
|
SET SQL_MODE=default;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1,t2;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
#
|
#
|
||||||
# BUG#47280 - strange results from count(*) with order by multiple
|
# BUG#47280 - strange results from count(*) with order by multiple
|
||||||
|
|
|
@ -981,10 +981,13 @@ DROP TABLE D;
|
||||||
#
|
#
|
||||||
# Bug #39656: Behaviour different for agg functions with & without where -
|
# Bug #39656: Behaviour different for agg functions with & without where -
|
||||||
# ONLY_FULL_GROUP_BY
|
# ONLY_FULL_GROUP_BY
|
||||||
|
# MDEV-5617 mysqld crashes when running a query with ONLY_FULL_GROUP_BY
|
||||||
#
|
#
|
||||||
|
|
||||||
CREATE TABLE t1 (a INT, b INT);
|
CREATE TABLE t1 (a INT, b INT);
|
||||||
INSERT INTO t1 VALUES (1,1), (1,2), (1,3);
|
INSERT INTO t1 VALUES (1,1), (1,2), (1,3);
|
||||||
|
CREATE TABLE t2 (b INT);
|
||||||
|
INSERT INTO t2 VALUES (3),(4);
|
||||||
|
|
||||||
SET SQL_MODE='ONLY_FULL_GROUP_BY';
|
SET SQL_MODE='ONLY_FULL_GROUP_BY';
|
||||||
|
|
||||||
|
@ -1000,11 +1003,18 @@ SELECT COUNT(*) FROM t1 a JOIN t1 b ON a.a= b.a;
|
||||||
SELECT COUNT(*), (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a)
|
SELECT COUNT(*), (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a)
|
||||||
FROM t1 outr;
|
FROM t1 outr;
|
||||||
|
|
||||||
|
--error ER_MIX_OF_GROUP_FUNC_AND_FIELDS
|
||||||
|
SELECT COUNT(*) FROM t1 outr, (SELECT b, count(*) FROM t2) as t3;
|
||||||
|
|
||||||
|
SELECT COUNT(*) FROM t1 outr where (1,1) in (SELECT a, count(*) FROM t2);
|
||||||
|
|
||||||
SELECT COUNT(*) FROM t1 a JOIN t1 outr
|
SELECT COUNT(*) FROM t1 a JOIN t1 outr
|
||||||
ON a.a= (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a);
|
ON a.a= (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a);
|
||||||
|
|
||||||
|
SELECT * FROM (SELECT a FROM t1 GROUP BY a) sq JOIN t2 ON a = b;
|
||||||
|
|
||||||
SET SQL_MODE=default;
|
SET SQL_MODE=default;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
|
|
||||||
###
|
###
|
||||||
|
|
15
sql/item.cc
15
sql/item.cc
|
@ -5230,8 +5230,8 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
|
||||||
if (any_privileges)
|
if (any_privileges)
|
||||||
{
|
{
|
||||||
char *db, *tab;
|
char *db, *tab;
|
||||||
db= cached_table->get_db_name();
|
db= field->table->s->db.str;
|
||||||
tab= cached_table->get_table_name();
|
tab= field->table->s->table_name.str;
|
||||||
if (!(have_privileges= (get_column_grant(thd, &field->table->grant,
|
if (!(have_privileges= (get_column_grant(thd, &field->table->grant,
|
||||||
db, tab, field_name) &
|
db, tab, field_name) &
|
||||||
VIEW_ANY_ACL)))
|
VIEW_ANY_ACL)))
|
||||||
|
@ -5252,7 +5252,12 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
|
||||||
marker= thd->lex->current_select->cur_pos_in_select_list;
|
marker= thd->lex->current_select->cur_pos_in_select_list;
|
||||||
}
|
}
|
||||||
mark_non_agg_field:
|
mark_non_agg_field:
|
||||||
if (fixed && thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY)
|
/*
|
||||||
|
table->pos_in_table_list can be 0 when fixing partition functions
|
||||||
|
or virtual fields.
|
||||||
|
*/
|
||||||
|
if (fixed && (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY) &&
|
||||||
|
field->table->pos_in_table_list)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Mark selects according to presence of non aggregated fields.
|
Mark selects according to presence of non aggregated fields.
|
||||||
|
@ -5265,7 +5270,7 @@ mark_non_agg_field:
|
||||||
(the current level) or a stub added by non-SELECT queries.
|
(the current level) or a stub added by non-SELECT queries.
|
||||||
*/
|
*/
|
||||||
SELECT_LEX *select_lex= cached_table ?
|
SELECT_LEX *select_lex= cached_table ?
|
||||||
cached_table->select_lex : context->select_lex;
|
cached_table->select_lex : field->table->pos_in_table_list->select_lex;
|
||||||
if (!thd->lex->in_sum_func)
|
if (!thd->lex->in_sum_func)
|
||||||
select_lex->set_non_agg_field_used(true);
|
select_lex->set_non_agg_field_used(true);
|
||||||
else
|
else
|
||||||
|
@ -8234,7 +8239,7 @@ int Item_default_value::save_in_field(Field *field_arg, bool no_conversions)
|
||||||
|
|
||||||
if (context->error_processor == &view_error_processor)
|
if (context->error_processor == &view_error_processor)
|
||||||
{
|
{
|
||||||
TABLE_LIST *view= cached_table->top_table();
|
TABLE_LIST *view= field_arg->table->pos_in_table_list->top_table();
|
||||||
push_warning_printf(field_arg->table->in_use,
|
push_warning_printf(field_arg->table->in_use,
|
||||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||||
ER_NO_DEFAULT_FOR_VIEW_FIELD,
|
ER_NO_DEFAULT_FOR_VIEW_FIELD,
|
||||||
|
|
|
@ -261,7 +261,7 @@ bool Item_sum::check_sum_func(THD *thd, Item **ref)
|
||||||
List_iterator<Item_field> of(outer_fields);
|
List_iterator<Item_field> of(outer_fields);
|
||||||
while ((field= of++))
|
while ((field= of++))
|
||||||
{
|
{
|
||||||
SELECT_LEX *sel= field->cached_table->select_lex;
|
SELECT_LEX *sel= field->field->table->pos_in_table_list->select_lex;
|
||||||
if (sel->nest_level < aggr_level)
|
if (sel->nest_level < aggr_level)
|
||||||
{
|
{
|
||||||
if (in_sum_func)
|
if (in_sum_func)
|
||||||
|
|
Loading…
Add table
Reference in a new issue