mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-17785: Window functions not working in ONLY_FULL_GROUP_BY mode
(Backport Varun Gupta's patch + edit the commit comment) Name resolution code produced errors for valid queries with window functions (but not for queries which used aggregate functions as window functions). Name resolution code worked incorrectly, because window function objects had is_window_func_sum_expr()=false. This was so, because mark_as_window_func_sum_expr() was only called for aggregate functions used as window functions. The fix is to call it for any window function.
This commit is contained in:
@ -4198,5 +4198,37 @@ drop procedure sp7;
|
|||||||
drop view v1,v2;
|
drop view v1,v2;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-17785: Window functions not working in ONLY_FULL_GROUP_BY mode
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(a VARCHAR(10), b int);
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
('Maths', 60),('Maths', 60),
|
||||||
|
('Maths', 70),('Maths', 55),
|
||||||
|
('Biology', 60), ('Biology', 70);
|
||||||
|
SET @save_sql_mode= @@sql_mode;
|
||||||
|
SET sql_mode = 'ONLY_FULL_GROUP_BY';
|
||||||
|
SELECT
|
||||||
|
RANK() OVER (PARTITION BY a ORDER BY b) AS rank,
|
||||||
|
a, b FROM t1 ORDER BY a, b DESC;
|
||||||
|
rank a b
|
||||||
|
2 Biology 70
|
||||||
|
1 Biology 60
|
||||||
|
4 Maths 70
|
||||||
|
2 Maths 60
|
||||||
|
2 Maths 60
|
||||||
|
1 Maths 55
|
||||||
|
SET sql_mode= @save_sql_mode;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1(i int,j int);
|
||||||
|
INSERT INTO t1 VALUES (1,1), (1,5),(1,4), (2,2),(2,5), (3,3),(4,4);
|
||||||
|
INSERT INTO t1 VALUES (1,1), (1,5),(1,4), (2,2),(2,5), (3,3),(4,4);
|
||||||
|
SELECT i, LAST_VALUE(COUNT(i)) OVER (PARTITION BY i ORDER BY j) FROM t1 GROUP BY i;
|
||||||
|
i LAST_VALUE(COUNT(i)) OVER (PARTITION BY i ORDER BY j)
|
||||||
|
1 6
|
||||||
|
2 4
|
||||||
|
3 2
|
||||||
|
4 2
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
|
@ -4204,6 +4204,38 @@ drop procedure sp7;
|
|||||||
drop view v1,v2;
|
drop view v1,v2;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-17785: Window functions not working in ONLY_FULL_GROUP_BY mode
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(a VARCHAR(10), b int);
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
('Maths', 60),('Maths', 60),
|
||||||
|
('Maths', 70),('Maths', 55),
|
||||||
|
('Biology', 60), ('Biology', 70);
|
||||||
|
SET @save_sql_mode= @@sql_mode;
|
||||||
|
SET sql_mode = 'ONLY_FULL_GROUP_BY';
|
||||||
|
SELECT
|
||||||
|
RANK() OVER (PARTITION BY a ORDER BY b) AS rank,
|
||||||
|
a, b FROM t1 ORDER BY a, b DESC;
|
||||||
|
rank a b
|
||||||
|
2 Biology 70
|
||||||
|
1 Biology 60
|
||||||
|
4 Maths 70
|
||||||
|
2 Maths 60
|
||||||
|
2 Maths 60
|
||||||
|
1 Maths 55
|
||||||
|
SET sql_mode= @save_sql_mode;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1(i int,j int);
|
||||||
|
INSERT INTO t1 VALUES (1,1), (1,5),(1,4), (2,2),(2,5), (3,3),(4,4);
|
||||||
|
INSERT INTO t1 VALUES (1,1), (1,5),(1,4), (2,2),(2,5), (3,3),(4,4);
|
||||||
|
SELECT i, LAST_VALUE(COUNT(i)) OVER (PARTITION BY i ORDER BY j) FROM t1 GROUP BY i;
|
||||||
|
i LAST_VALUE(COUNT(i)) OVER (PARTITION BY i ORDER BY j)
|
||||||
|
1 6
|
||||||
|
2 4
|
||||||
|
3 2
|
||||||
|
4 2
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -2703,6 +2703,33 @@ drop procedure sp7;
|
|||||||
drop view v1,v2;
|
drop view v1,v2;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-17785: Window functions not working in ONLY_FULL_GROUP_BY mode
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1(a VARCHAR(10), b int);
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
('Maths', 60),('Maths', 60),
|
||||||
|
('Maths', 70),('Maths', 55),
|
||||||
|
('Biology', 60), ('Biology', 70);
|
||||||
|
|
||||||
|
SET @save_sql_mode= @@sql_mode;
|
||||||
|
SET sql_mode = 'ONLY_FULL_GROUP_BY';
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
RANK() OVER (PARTITION BY a ORDER BY b) AS rank,
|
||||||
|
a, b FROM t1 ORDER BY a, b DESC;
|
||||||
|
|
||||||
|
SET sql_mode= @save_sql_mode;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1(i int,j int);
|
||||||
|
INSERT INTO t1 VALUES (1,1), (1,5),(1,4), (2,2),(2,5), (3,3),(4,4);
|
||||||
|
INSERT INTO t1 VALUES (1,1), (1,5),(1,4), (2,2),(2,5), (3,3),(4,4);
|
||||||
|
SELECT i, LAST_VALUE(COUNT(i)) OVER (PARTITION BY i ORDER BY j) FROM t1 GROUP BY i;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -93,6 +93,9 @@ Item_window_func::fix_fields(THD *thd, Item **ref)
|
|||||||
my_error(ER_NO_ORDER_LIST_IN_WINDOW_SPEC, MYF(0), window_func()->func_name());
|
my_error(ER_NO_ORDER_LIST_IN_WINDOW_SPEC, MYF(0), window_func()->func_name());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window_func()->mark_as_window_func_sum_expr();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TODO: why the last parameter is 'ref' in this call? What if window_func
|
TODO: why the last parameter is 'ref' in this call? What if window_func
|
||||||
decides to substitute itself for something else and does *ref=.... ?
|
decides to substitute itself for something else and does *ref=.... ?
|
||||||
|
@ -10557,9 +10557,6 @@ window_func:
|
|||||||
simple_window_func
|
simple_window_func
|
||||||
|
|
|
|
||||||
sum_expr
|
sum_expr
|
||||||
{
|
|
||||||
((Item_sum *) $1)->mark_as_window_func_sum_expr();
|
|
||||||
}
|
|
||||||
;
|
;
|
||||||
|
|
||||||
simple_window_func:
|
simple_window_func:
|
||||||
|
Reference in New Issue
Block a user