mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
454b9b1bdc
Window functions can not be used as arguments to aggregate functions, as the aggregation happens before window function computation. Disallow such constructs by returning an error. In order to detect this case a change was needed in the base Item_sum_xxx::fix_fields to propagate the with_window_func flag. Item_func_group_concat requires the same change.
139 lines
3.4 KiB
Text
139 lines
3.4 KiB
Text
create table t1 (i int);
|
|
insert into t1 values (5),(6),(0);
|
|
|
|
--echo #
|
|
--echo # Try out all set functions with window functions as arguments.
|
|
--echo # Any such usage should return an error.
|
|
--echo #
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select MIN( SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select MIN(DISTINCT SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select MAX( SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select MAX(DISTINCT SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select SUM( SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select SUM(DISTINCT SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select AVG( SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select AVG(DISTINCT SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select COUNT( SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select COUNT(DISTINCT SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select BIT_AND( SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select BIT_OR( SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select BIT_XOR( SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select STD( SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select STDDEV( SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select STDDEV_POP( SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select STDDEV_SAMP(SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select VARIANCE(SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select VAR_POP(SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select VAR_SAMP(SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select GROUP_CONCAT(SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select GROUP_CONCAT(DISTINCT SUM(i) OVER (order by i) )
|
|
from t1;
|
|
|
|
--echo #
|
|
--echo # Test that partition instead of order by in over doesn't change result.
|
|
--echo #
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select SUM( SUM(i) OVER (PARTITION BY i) )
|
|
from t1;
|
|
|
|
--echo #
|
|
--echo # Test that no arguments in OVER() clause lead to crash in this case.
|
|
--echo #
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select SUM( SUM(i) OVER () )
|
|
from t1;
|
|
drop table t1;
|
|
|
|
-- echo #
|
|
-- echo # MDEV-13774: Server Crash on Execuate of SQL Statement
|
|
-- echo #
|
|
create table t1 (i int);
|
|
insert into t1 values (5),(6),(0);
|
|
|
|
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|
select SUM(
|
|
IF( SUM( IF(i,1,0)) OVER (PARTITION BY i) > 0
|
|
AND
|
|
SUM( IF(i,1,0)) OVER (PARTITION BY i) > 0,
|
|
1,
|
|
0) )
|
|
from t1;
|
|
|
|
--echo #
|
|
--echo # A way to get the aggregation result.
|
|
--echo #
|
|
|
|
select i, IF(SUM(IF(i,1,0)) OVER (PARTITION BY i) > 0 AND SUM( IF(i,1,0)) OVER (PARTITION BY i) > 0,1,0) AS if_col
|
|
from t1
|
|
order by i;
|
|
|
|
select sum(if_col)
|
|
from (select IF(SUM(IF(i,1,0)) OVER (PARTITION BY i) > 0 AND SUM( IF(i,1,0)) OVER (PARTITION BY i) > 0,1,0) AS if_col
|
|
from t1) tmp;
|
|
drop table t1;
|