Commit ab5503c8 authored by Varun Gupta's avatar Varun Gupta

Updates the tests for the percentile functions

parent 40887913
...@@ -4,58 +4,88 @@ INSERT INTO t1 VALUES ...@@ -4,58 +4,88 @@ INSERT INTO t1 VALUES
('Kaolin', 0.5, 3), ('Kaolin', 0.6, 7), ('Kaolin', 0.5, 3), ('Kaolin', 0.6, 7),
('Kaolin', 0.5, 4), ('Kaolin', 0.5, 4),
('Tatiana', 0.8, 4), ('Tata', 0.8, 4); ('Tatiana', 0.8, 4), ('Tata', 0.8, 4);
#
# Test invalid syntax
#
# Order by clause has more than one element
select percentile_disc(0.5) within group(order by score,test) over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'test) over (partition by name) from t1' at line 1
select percentile_cont(0.5) within group(order by score,test) over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'test) over (partition by name) from t1' at line 1
# Order by clause has no element
select percentile_disc(0.5) within group() over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') over (partition by name) from t1' at line 1
select percentile_cont(0.5) within group() over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') over (partition by name) from t1' at line 1
# No parameters to the percentile functions
select percentile_disc() within group() over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') within group() over (partition by name) from t1' at line 1
select percentile_cont() within group() over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') within group() over (partition by name) from t1' at line 1
#
# Test simple syntax
#
select name, percentile_cont(0.5) within group(order by score) over (partition by name) as c from t1; select name, percentile_cont(0.5) within group(order by score) over (partition by name) as c from t1;
name c name c
Chun 5.00000 Chun 5.0000000000
Chun 5.00000 Chun 5.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Tatiana 4.00000 Tatiana 4.0000000000
Tata 4.00000 Tata 4.0000000000
no partition clause select name, percentile_disc(0.5) within group(order by score) over (partition by name) as c from t1;
name c
Chun 3.0000000000
Chun 3.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
# no partition clause
select name, percentile_disc(0.5) within group(order by score) over () from t1; select name, percentile_disc(0.5) within group(order by score) over () from t1;
name percentile_disc(0.5) within group(order by score) over () name percentile_disc(0.5) within group(order by score) over ()
Chun 4.00000 Chun 4.0000000000
Chun 4.00000 Chun 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Tatiana 4.00000 Tatiana 4.0000000000
Tata 4.00000 Tata 4.0000000000
select name, percentile_cont(0.5) within group(order by score) over () from t1; select name, percentile_cont(0.5) within group(order by score) over () from t1;
name percentile_cont(0.5) within group(order by score) over () name percentile_cont(0.5) within group(order by score) over ()
Chun 4.00000 Chun 4.0000000000
Chun 4.00000 Chun 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Tatiana 4.00000 Tatiana 4.0000000000
Tata 4.00000 Tata 4.0000000000
argument set to null # argument set to null
select name, percentile_cont(null) within group(order by score) over (partition by name) from t1; select name, percentile_cont(null) within group(order by score) over (partition by name) from t1;
ERROR HY000: Numeric values are only allowed as arguments to percentile functions ERROR HY000: percentile_cont function only accepts arguments that can be converted to numerical types
select name, percentile_disc(null) within group(order by score) over (partition by name) from t1; select name, percentile_disc(null) within group(order by score) over (partition by name) from t1;
ERROR HY000: Numeric values are only allowed as arguments to percentile functions ERROR HY000: percentile_disc function only accepts arguments that can be converted to numerical types
subqueries having percentile functions #subqueries having percentile functions
select * from ( select name , percentile_cont(0.5) within group ( order by score) over (partition by name ) from t1 ) as t; select * from ( select name , percentile_cont(0.5) within group ( order by score) over (partition by name ) from t1 ) as t;
name percentile_cont(0.5) within group ( order by score) over (partition by name ) name percentile_cont(0.5) within group ( order by score) over (partition by name )
Chun 5.00000 Chun 5.0000000000
Chun 5.00000 Chun 5.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Tatiana 4.00000 Tatiana 4.0000000000
Tata 4.00000 Tata 4.0000000000
select * from ( select name , percentile_disc(0.5) within group ( order by score) over (partition by name ) from t1 ) as t; select * from ( select name , percentile_disc(0.5) within group ( order by score) over (partition by name ) from t1 ) as t;
name percentile_disc(0.5) within group ( order by score) over (partition by name ) name percentile_disc(0.5) within group ( order by score) over (partition by name )
Chun 3.00000 Chun 3.0000000000
Chun 3.00000 Chun 3.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Tatiana 4.00000 Tatiana 4.0000000000
Tata 4.00000 Tata 4.0000000000
select name from t1 a where (select percentile_disc(0.5) within group (order by score) over (partition by name) from t1 b limit 1) >= 0.5; select name from t1 a where (select percentile_disc(0.5) within group (order by score) over (partition by name) from t1 b limit 1) >= 0.5;
name name
Chun Chun
...@@ -65,241 +95,232 @@ Kaolin ...@@ -65,241 +95,232 @@ Kaolin
Kaolin Kaolin
Tatiana Tatiana
Tata Tata
disallowed fields in order by #disallowed fields in order by
select score, percentile_cont(0.5) within group(order by name) over (partition by score) from t1; select score, percentile_cont(0.5) within group(order by name) over (partition by score) from t1;
ERROR HY000: Numeric datatype is required for Percentile_CONT function ERROR HY000: Numeric datatype is required for percentile_cont function
select score, percentile_disc(0.5) within group(order by name) over (partition by score) from t1; select score, percentile_disc(0.5) within group(order by name) over (partition by score) from t1;
score percentile_disc(0.5) within group(order by name) over (partition by score) ERROR HY000: Numeric datatype is required for percentile_disc function
3.0000 Chun #parameter value should be in the range of [0,1]
7.0000 Chun
3.0000 Chun
7.0000 Chun
4.0000 Tata
4.0000 Tata
4.0000 Tata
order by clause has more than one element
select percentile_disc(0.5) within group(order by score,test) over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'test) over (partition by name) from t1' at line 1
select percentile_cont(0.5) within group(order by score,test) over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'test) over (partition by name) from t1' at line 1
parameter value should be in the range of [0,1]
select percentile_disc(1.5) within group(order by score) over (partition by name) from t1; select percentile_disc(1.5) within group(order by score) over (partition by name) from t1;
ERROR HY000: Argument to the percentile functions does not belong to the range [0,1] ERROR HY000: Argument to the percentile_disc function does not belong to the range [0,1]
select percentile_cont(1.5) within group(order by score) over (partition by name) from t1; select percentile_cont(1.5) within group(order by score) over (partition by name) from t1;
ERROR HY000: Argument to the percentile functions does not belong to the range [0,1] ERROR HY000: Argument to the percentile_cont function does not belong to the range [0,1]
#Argument should remain constant for the entire partition
select name,percentile_cont(test) within group(order by score) over (partition by name) from t1; select name,percentile_cont(test) within group(order by score) over (partition by name) from t1;
ERROR HY000: Argument to the percentile functions is not a constant ERROR HY000: Argument to the percentile_cont function is not a constant for a partition
select name, percentile_disc(test) within group(order by score) over (partition by name) from t1; select name, percentile_disc(test) within group(order by score) over (partition by name) from t1;
ERROR HY000: Argument to the percentile functions is not a constant ERROR HY000: Argument to the percentile_disc function is not a constant for a partition
only numerical types are allowed as argument to percentile functions #only numerical types are allowed as argument to percentile functions
select name, percentile_cont(name) within group(order by score) over (partition by name) from t1; select name, percentile_cont(name) within group(order by score) over (partition by name) from t1;
ERROR HY000: Numeric values are only allowed as arguments to percentile functions ERROR HY000: percentile_cont function only accepts arguments that can be converted to numerical types
complete query with partition column select name, percentile_disc(name) within group(order by score) over (partition by name) from t1;
ERROR HY000: percentile_disc function only accepts arguments that can be converted to numerical types
#complete query with partition column
select name,cume_dist() over (partition by name order by score), percentile_disc(0.5) within group(order by score) over (partition by name) as c from t1; select name,cume_dist() over (partition by name order by score), percentile_disc(0.5) within group(order by score) over (partition by name) as c from t1;
name cume_dist() over (partition by name order by score) c name cume_dist() over (partition by name order by score) c
Chun 0.5000000000 3.00000 Chun 0.5000000000 3.0000000000
Chun 1.0000000000 3.00000 Chun 1.0000000000 3.0000000000
Kaolin 0.3333333333 4.00000 Kaolin 0.3333333333 4.0000000000
Kaolin 1.0000000000 4.00000 Kaolin 1.0000000000 4.0000000000
Kaolin 0.6666666667 4.00000 Kaolin 0.6666666667 4.0000000000
Tatiana 1.0000000000 4.00000 Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.00000 Tata 1.0000000000 4.0000000000
select name, percentile_cont(0.5) within group(order by score) over (partition by name) as c from t1; select name, percentile_cont(0.5) within group(order by score) over (partition by name) as c from t1;
name c name c
Chun 5.00000 Chun 5.0000000000
Chun 5.00000 Chun 5.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Kaolin 4.00000 Kaolin 4.0000000000
Tatiana 4.00000 Tatiana 4.0000000000
Tata 4.00000 Tata 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.1) within group(order by score) over (partition by name) as c from t1; select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.1) within group(order by score) over (partition by name) as c from t1;
name b c name b c
Chun 0.5000000000 3.00000 Chun 0.5000000000 3.0000000000
Chun 1.0000000000 3.00000 Chun 1.0000000000 3.0000000000
Kaolin 0.3333333333 3.00000 Kaolin 0.3333333333 3.0000000000
Kaolin 1.0000000000 3.00000 Kaolin 1.0000000000 3.0000000000
Kaolin 0.6666666667 3.00000 Kaolin 0.6666666667 3.0000000000
Tatiana 1.0000000000 4.00000 Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.00000 Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.2) within group(order by score) over (partition by name) as c from t1; select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.2) within group(order by score) over (partition by name) as c from t1;
name b c name b c
Chun 0.5000000000 3.00000 Chun 0.5000000000 3.0000000000
Chun 1.0000000000 3.00000 Chun 1.0000000000 3.0000000000
Kaolin 0.3333333333 3.00000 Kaolin 0.3333333333 3.0000000000
Kaolin 1.0000000000 3.00000 Kaolin 1.0000000000 3.0000000000
Kaolin 0.6666666667 3.00000 Kaolin 0.6666666667 3.0000000000
Tatiana 1.0000000000 4.00000 Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.00000 Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.3) within group(order by score) over (partition by name) as c from t1; select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.3) within group(order by score) over (partition by name) as c from t1;
name b c name b c
Chun 0.5000000000 3.00000 Chun 0.5000000000 3.0000000000
Chun 1.0000000000 3.00000 Chun 1.0000000000 3.0000000000
Kaolin 0.3333333333 3.00000 Kaolin 0.3333333333 3.0000000000
Kaolin 1.0000000000 3.00000 Kaolin 1.0000000000 3.0000000000
Kaolin 0.6666666667 3.00000 Kaolin 0.6666666667 3.0000000000
Tatiana 1.0000000000 4.00000 Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.00000 Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.4) within group(order by score) over (partition by name) as c from t1; select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.4) within group(order by score) over (partition by name) as c from t1;
name b c name b c
Chun 0.5000000000 3.00000 Chun 0.5000000000 3.0000000000
Chun 1.0000000000 3.00000 Chun 1.0000000000 3.0000000000
Kaolin 0.3333333333 4.00000 Kaolin 0.3333333333 4.0000000000
Kaolin 1.0000000000 4.00000 Kaolin 1.0000000000 4.0000000000
Kaolin 0.6666666667 4.00000 Kaolin 0.6666666667 4.0000000000
Tatiana 1.0000000000 4.00000 Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.00000 Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.5) within group(order by score) over (partition by name) as c from t1; select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.5) within group(order by score) over (partition by name) as c from t1;
name b c name b c
Chun 0.5000000000 3.00000 Chun 0.5000000000 3.0000000000
Chun 1.0000000000 3.00000 Chun 1.0000000000 3.0000000000
Kaolin 0.3333333333 4.00000 Kaolin 0.3333333333 4.0000000000
Kaolin 1.0000000000 4.00000 Kaolin 1.0000000000 4.0000000000
Kaolin 0.6666666667 4.00000 Kaolin 0.6666666667 4.0000000000
Tatiana 1.0000000000 4.00000 Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.00000 Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.6) within group(order by score) over (partition by name) as c from t1; select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.6) within group(order by score) over (partition by name) as c from t1;
name b c name b c
Chun 0.5000000000 7.00000 Chun 0.5000000000 7.0000000000
Chun 1.0000000000 7.00000 Chun 1.0000000000 7.0000000000
Kaolin 0.3333333333 4.00000 Kaolin 0.3333333333 4.0000000000
Kaolin 1.0000000000 4.00000 Kaolin 1.0000000000 4.0000000000
Kaolin 0.6666666667 4.00000 Kaolin 0.6666666667 4.0000000000
Tatiana 1.0000000000 4.00000 Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.00000 Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.7) within group(order by score) over (partition by name) as c from t1; select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.7) within group(order by score) over (partition by name) as c from t1;
name b c name b c
Chun 0.5000000000 7.00000 Chun 0.5000000000 7.0000000000
Chun 1.0000000000 7.00000 Chun 1.0000000000 7.0000000000
Kaolin 0.3333333333 7.00000 Kaolin 0.3333333333 7.0000000000
Kaolin 1.0000000000 7.00000 Kaolin 1.0000000000 7.0000000000
Kaolin 0.6666666667 7.00000 Kaolin 0.6666666667 7.0000000000
Tatiana 1.0000000000 4.00000 Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.00000 Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.8) within group(order by score) over (partition by name) as c from t1; select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.8) within group(order by score) over (partition by name) as c from t1;
name b c name b c
Chun 0.5000000000 7.00000 Chun 0.5000000000 7.0000000000
Chun 1.0000000000 7.00000 Chun 1.0000000000 7.0000000000
Kaolin 0.3333333333 7.00000 Kaolin 0.3333333333 7.0000000000
Kaolin 1.0000000000 7.00000 Kaolin 1.0000000000 7.0000000000
Kaolin 0.6666666667 7.00000 Kaolin 0.6666666667 7.0000000000
Tatiana 1.0000000000 4.00000 Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.00000 Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.9) within group(order by score) over (partition by name) as c from t1; select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.9) within group(order by score) over (partition by name) as c from t1;
name b c name b c
Chun 0.5000000000 7.00000 Chun 0.5000000000 7.0000000000
Chun 1.0000000000 7.00000 Chun 1.0000000000 7.0000000000
Kaolin 0.3333333333 7.00000 Kaolin 0.3333333333 7.0000000000
Kaolin 1.0000000000 7.00000 Kaolin 1.0000000000 7.0000000000
Kaolin 0.6666666667 7.00000 Kaolin 0.6666666667 7.0000000000
Tatiana 1.0000000000 4.00000 Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.00000 Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(1) within group(order by score) over (partition by name) as c from t1; select name,cume_dist() over (partition by name order by score) as b, percentile_disc(1) within group(order by score) over (partition by name) as c from t1;
name b c name b c
Chun 0.5000000000 7.00000 Chun 0.5000000000 7.0000000000
Chun 1.0000000000 7.00000 Chun 1.0000000000 7.0000000000
Kaolin 0.3333333333 7.00000 Kaolin 0.3333333333 7.0000000000
Kaolin 1.0000000000 7.00000 Kaolin 1.0000000000 7.0000000000
Kaolin 0.6666666667 7.00000 Kaolin 0.6666666667 7.0000000000
Tatiana 1.0000000000 4.00000 Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.00000 Tata 1.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0) within group(order by score) over (partition by name) as c from t1; select median(score) over (partition by name), percentile_cont(0) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c median(score) over (partition by name) c
5.00000 3.00000 5.0000000000 3.0000000000
5.00000 3.00000 5.0000000000 3.0000000000
4.00000 3.00000 4.0000000000 3.0000000000
4.00000 3.00000 4.0000000000 3.0000000000
4.00000 3.00000 4.0000000000 3.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.1) within group(order by score) over (partition by name) as c from t1; select median(score) over (partition by name), percentile_cont(0.1) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c median(score) over (partition by name) c
5.00000 3.40000 5.0000000000 3.4000000000
5.00000 3.40000 5.0000000000 3.4000000000
4.00000 3.20000 4.0000000000 3.2000000000
4.00000 3.20000 4.0000000000 3.2000000000
4.00000 3.20000 4.0000000000 3.2000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.2) within group(order by score) over (partition by name) as c from t1; select median(score) over (partition by name), percentile_cont(0.2) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c median(score) over (partition by name) c
5.00000 3.80000 5.0000000000 3.8000000000
5.00000 3.80000 5.0000000000 3.8000000000
4.00000 3.40000 4.0000000000 3.4000000000
4.00000 3.40000 4.0000000000 3.4000000000
4.00000 3.40000 4.0000000000 3.4000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.3) within group(order by score) over (partition by name) as c from t1; select median(score) over (partition by name), percentile_cont(0.3) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c median(score) over (partition by name) c
5.00000 4.20000 5.0000000000 4.2000000000
5.00000 4.20000 5.0000000000 4.2000000000
4.00000 3.60000 4.0000000000 3.6000000000
4.00000 3.60000 4.0000000000 3.6000000000
4.00000 3.60000 4.0000000000 3.6000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.4) within group(order by score) over (partition by name) as c from t1; select median(score) over (partition by name), percentile_cont(0.4) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c median(score) over (partition by name) c
5.00000 4.60000 5.0000000000 4.6000000000
5.00000 4.60000 5.0000000000 4.6000000000
4.00000 3.80000 4.0000000000 3.8000000000
4.00000 3.80000 4.0000000000 3.8000000000
4.00000 3.80000 4.0000000000 3.8000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.5) within group(order by score) over (partition by name) as c from t1; select median(score) over (partition by name), percentile_cont(0.5) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c median(score) over (partition by name) c
5.00000 5.00000 5.0000000000 5.0000000000
5.00000 5.00000 5.0000000000 5.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.6) within group(order by score) over (partition by name) as c from t1; select median(score) over (partition by name), percentile_cont(0.6) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c median(score) over (partition by name) c
5.00000 5.40000 5.0000000000 5.4000000000
5.00000 5.40000 5.0000000000 5.4000000000
4.00000 4.60000 4.0000000000 4.6000000000
4.00000 4.60000 4.0000000000 4.6000000000
4.00000 4.60000 4.0000000000 4.6000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.7) within group(order by score) over (partition by name) as c from t1; select median(score) over (partition by name), percentile_cont(0.7) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c median(score) over (partition by name) c
5.00000 5.80000 5.0000000000 5.8000000000
5.00000 5.80000 5.0000000000 5.8000000000
4.00000 5.20000 4.0000000000 5.2000000000
4.00000 5.20000 4.0000000000 5.2000000000
4.00000 5.20000 4.0000000000 5.2000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.8) within group(order by score) over (partition by name) as c from t1; select median(score) over (partition by name), percentile_cont(0.8) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c median(score) over (partition by name) c
5.00000 6.20000 5.0000000000 6.2000000000
5.00000 6.20000 5.0000000000 6.2000000000
4.00000 5.80000 4.0000000000 5.8000000000
4.00000 5.80000 4.0000000000 5.8000000000
4.00000 5.80000 4.0000000000 5.8000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.9) within group(order by score) over (partition by name) as c from t1; select median(score) over (partition by name), percentile_cont(0.9) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c median(score) over (partition by name) c
5.00000 6.60000 5.0000000000 6.6000000000
5.00000 6.60000 5.0000000000 6.6000000000
4.00000 6.40000 4.0000000000 6.4000000000
4.00000 6.40000 4.0000000000 6.4000000000
4.00000 6.40000 4.0000000000 6.4000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(1) within group(order by score) over (partition by name) as c from t1; select median(score) over (partition by name), percentile_cont(1) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c median(score) over (partition by name) c
5.00000 7.00000 5.0000000000 7.0000000000
5.00000 7.00000 5.0000000000 7.0000000000
4.00000 7.00000 4.0000000000 7.0000000000
4.00000 7.00000 4.0000000000 7.0000000000
4.00000 7.00000 4.0000000000 7.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
4.00000 4.00000 4.0000000000 4.0000000000
drop table t1; drop table t1;
CREATE TABLE student (name CHAR(10), test double, score TINYINT);
INSERT INTO student VALUES
('Chun', 0, null), ('Chun', 0, 4),
('Esben', 1, null), ('Esben', 1, null),
('Kaolin', 0.5, 56), ('Kaolin', 0.5, 88),
('Tatiana', 0.8, 2), ('Tatiana', 0.8, 1);
select name, percentile_disc(0.6) within group(order by score) over (partition by name) from student;
select name, percentile_disc(test) within group(order by score) over (partition by name) from student;
select name, percentile_disc(0.4) within group(order by score) over (partition by name) from student;
#select name, percentile_cont(null) within group(order by score) over (partition by name) from student;
#select name, cume_dist() over (partition by name order by score) from student;
#normal parsing
#select percentile_cont(0.5) within group(order by score) over w1 from student
#window w1 AS (partition by name);
# no partition clause
#select percentile_cont(0.5) within group(order by score) over () from student;
# only one sort allowed
#select percentile_cont(0.5) within group(order by score) over (partition by name);
#parameter value should be in the range of 0 to 1
#select percentile_cont(1.5) within group(order by score) over (partition by name);
#
#select rank() over (partition by name order by score ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) from student;
drop table student;
...@@ -5,50 +5,77 @@ INSERT INTO t1 VALUES ...@@ -5,50 +5,77 @@ INSERT INTO t1 VALUES
('Kaolin', 0.5, 4), ('Kaolin', 0.5, 4),
('Tatiana', 0.8, 4), ('Tata', 0.8, 4); ('Tatiana', 0.8, 4), ('Tata', 0.8, 4);
--echo #
--echo # Test invalid syntax
--echo #
--echo # Order by clause has more than one element
--error ER_PARSE_ERROR
select percentile_disc(0.5) within group(order by score,test) over (partition by name) from t1;
--error ER_PARSE_ERROR
select percentile_cont(0.5) within group(order by score,test) over (partition by name) from t1;
--echo # Order by clause has no element
--error ER_PARSE_ERROR
select percentile_disc(0.5) within group() over (partition by name) from t1;
--error ER_PARSE_ERROR
select percentile_cont(0.5) within group() over (partition by name) from t1;
--echo # No parameters to the percentile functions
--error ER_PARSE_ERROR
select percentile_disc() within group() over (partition by name) from t1;
--error ER_PARSE_ERROR
select percentile_cont() within group() over (partition by name) from t1;
--echo #
--echo # Test simple syntax
--echo #
select name, percentile_cont(0.5) within group(order by score) over (partition by name) as c from t1; select name, percentile_cont(0.5) within group(order by score) over (partition by name) as c from t1;
select name, percentile_disc(0.5) within group(order by score) over (partition by name) as c from t1;
--echo no partition clause --echo # no partition clause
select name, percentile_disc(0.5) within group(order by score) over () from t1; select name, percentile_disc(0.5) within group(order by score) over () from t1;
select name, percentile_cont(0.5) within group(order by score) over () from t1; select name, percentile_cont(0.5) within group(order by score) over () from t1;
--echo argument set to null --echo # argument set to null
--error ER_WRONG_TYPE_OF_ARGUMENT --error ER_WRONG_TYPE_OF_ARGUMENT
select name, percentile_cont(null) within group(order by score) over (partition by name) from t1; select name, percentile_cont(null) within group(order by score) over (partition by name) from t1;
--error ER_WRONG_TYPE_OF_ARGUMENT --error ER_WRONG_TYPE_OF_ARGUMENT
select name, percentile_disc(null) within group(order by score) over (partition by name) from t1; select name, percentile_disc(null) within group(order by score) over (partition by name) from t1;
--echo subqueries having percentile functions --echo #subqueries having percentile functions
select * from ( select name , percentile_cont(0.5) within group ( order by score) over (partition by name ) from t1 ) as t; select * from ( select name , percentile_cont(0.5) within group ( order by score) over (partition by name ) from t1 ) as t;
select * from ( select name , percentile_disc(0.5) within group ( order by score) over (partition by name ) from t1 ) as t; select * from ( select name , percentile_disc(0.5) within group ( order by score) over (partition by name ) from t1 ) as t;
select name from t1 a where (select percentile_disc(0.5) within group (order by score) over (partition by name) from t1 b limit 1) >= 0.5; select name from t1 a where (select percentile_disc(0.5) within group (order by score) over (partition by name) from t1 b limit 1) >= 0.5;
--echo disallowed fields in order by --echo #disallowed fields in order by
--error ER_WRONG_TYPE_FOR_PERCENTILE_CONT --error ER_WRONG_TYPE_FOR_PERCENTILE_FUNC
select score, percentile_cont(0.5) within group(order by name) over (partition by score) from t1; select score, percentile_cont(0.5) within group(order by name) over (partition by score) from t1;
--error ER_WRONG_TYPE_FOR_PERCENTILE_FUNC
select score, percentile_disc(0.5) within group(order by name) over (partition by score) from t1; select score, percentile_disc(0.5) within group(order by name) over (partition by score) from t1;
--echo order by clause has more than one element --echo #parameter value should be in the range of [0,1]
--error ER_PARSE_ERROR
select percentile_disc(0.5) within group(order by score,test) over (partition by name) from t1;
--error ER_PARSE_ERROR
select percentile_cont(0.5) within group(order by score,test) over (partition by name) from t1;
--echo parameter value should be in the range of [0,1]
--error ER_ARGUMENT_OUT_OF_RANGE --error ER_ARGUMENT_OUT_OF_RANGE
select percentile_disc(1.5) within group(order by score) over (partition by name) from t1; select percentile_disc(1.5) within group(order by score) over (partition by name) from t1;
--error ER_ARGUMENT_OUT_OF_RANGE --error ER_ARGUMENT_OUT_OF_RANGE
select percentile_cont(1.5) within group(order by score) over (partition by name) from t1; select percentile_cont(1.5) within group(order by score) over (partition by name) from t1;
--echo #Argument should remain constant for the entire partition
--error ER_ARGUMENT_NOT_CONSTANT --error ER_ARGUMENT_NOT_CONSTANT
select name,percentile_cont(test) within group(order by score) over (partition by name) from t1; select name,percentile_cont(test) within group(order by score) over (partition by name) from t1;
--error ER_ARGUMENT_NOT_CONSTANT --error ER_ARGUMENT_NOT_CONSTANT
select name, percentile_disc(test) within group(order by score) over (partition by name) from t1; select name, percentile_disc(test) within group(order by score) over (partition by name) from t1;
--echo only numerical types are allowed as argument to percentile functions --echo #only numerical types are allowed as argument to percentile functions
--error ER_WRONG_TYPE_OF_ARGUMENT --error ER_WRONG_TYPE_OF_ARGUMENT
select name, percentile_cont(name) within group(order by score) over (partition by name) from t1; select name, percentile_cont(name) within group(order by score) over (partition by name) from t1;
--error ER_WRONG_TYPE_OF_ARGUMENT
select name, percentile_disc(name) within group(order by score) over (partition by name) from t1;
--echo complete query with partition column --echo #complete query with partition column
select name,cume_dist() over (partition by name order by score), percentile_disc(0.5) within group(order by score) over (partition by name) as c from t1; select name,cume_dist() over (partition by name order by score), percentile_disc(0.5) within group(order by score) over (partition by name) as c from t1;
select name, percentile_cont(0.5) within group(order by score) over (partition by name) as c from t1; select name, percentile_cont(0.5) within group(order by score) over (partition by name) as c from t1;
......
...@@ -178,7 +178,7 @@ bool Item_window_func::check_result_type_of_order_item() ...@@ -178,7 +178,7 @@ bool Item_window_func::check_result_type_of_order_item()
if (rtype != REAL_RESULT && rtype != INT_RESULT && if (rtype != REAL_RESULT && rtype != INT_RESULT &&
rtype != DECIMAL_RESULT && rtype != TIME_RESULT) rtype != DECIMAL_RESULT && rtype != TIME_RESULT)
{ {
my_error(ER_WRONG_TYPE_FOR_PERCENTILE_FUNC, MYF(0)); my_error(ER_WRONG_TYPE_FOR_PERCENTILE_FUNC, MYF(0), window_func()->func_name());
return TRUE; return TRUE;
} }
setting_handler_for_percentile_functions(rtype); setting_handler_for_percentile_functions(rtype);
...@@ -249,7 +249,7 @@ bool Item_sum_percentile_cont::fix_fields(THD *thd, Item **ref) ...@@ -249,7 +249,7 @@ bool Item_sum_percentile_cont::fix_fields(THD *thd, Item **ref)
case INT_RESULT: case INT_RESULT:
break; break;
default: default:
my_error(ER_WRONG_TYPE_OF_ARGUMENT, MYF(0)); my_error(ER_WRONG_TYPE_OF_ARGUMENT, MYF(0), func_name());
return TRUE; return TRUE;
} }
return res; return res;
...@@ -268,7 +268,7 @@ bool Item_sum_percentile_disc::fix_fields(THD *thd, Item **ref) ...@@ -268,7 +268,7 @@ bool Item_sum_percentile_disc::fix_fields(THD *thd, Item **ref)
case INT_RESULT: case INT_RESULT:
break; break;
default: default:
my_error(ER_WRONG_TYPE_OF_ARGUMENT, MYF(0)); my_error(ER_WRONG_TYPE_OF_ARGUMENT, MYF(0), func_name());
return TRUE; return TRUE;
} }
return res; return res;
......
...@@ -821,7 +821,7 @@ class Item_sum_percentile_disc : public Item_sum_cume_dist, ...@@ -821,7 +821,7 @@ class Item_sum_percentile_disc : public Item_sum_cume_dist,
void fix_length_and_dec() void fix_length_and_dec()
{ {
decimals = 5; // TODO-cvicentiu find out how many decimals the standard decimals = 10; // TODO-cvicentiu find out how many decimals the standard
// requires. // requires.
} }
...@@ -951,7 +951,7 @@ class Item_sum_percentile_cont : public Item_sum_cume_dist, ...@@ -951,7 +951,7 @@ class Item_sum_percentile_cont : public Item_sum_cume_dist,
void fix_length_and_dec() void fix_length_and_dec()
{ {
decimals = 5; // TODO-cvicentiu find out how many decimals the standard decimals = 10; // TODO-cvicentiu find out how many decimals the standard
// requires. // requires.
} }
......
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