1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

MDEV-15073: Generic UDAF parser code in server for windows functions

Added support for usual agreggate UDF (UDAF)
Added remove() call support for more efficient window function processing
Added example of aggregate UDF with efficient windows function support
This commit is contained in:
Oleksandr Byelkin
2018-11-20 10:58:34 +01:00
parent a956260d82
commit 555921a9c3
10 changed files with 386 additions and 0 deletions

View File

@ -528,3 +528,69 @@ DROP FUNCTION METAPHON;
#INSERT INTO t1 (a) VALUES ('Hello');
#SELECT * FROM t1;
DROP TABLE t1;
--echo
--echo MDEV-15073: Generic UDAF parser code in server for windows functions
--echo
--replace_result $UDF_EXAMPLE_SO UDF_EXAMPLE_LIB
eval CREATE AGGREGATE FUNCTION avgcost
RETURNS REAL SONAME "$UDF_EXAMPLE_SO";
--replace_result $UDF_EXAMPLE_SO UDF_EXAMPLE_LIB
eval CREATE AGGREGATE FUNCTION avg2
RETURNS REAL SONAME "$UDF_EXAMPLE_SO";
--replace_result $UDF_EXAMPLE_SO UDF_EXAMPLE_LIB
eval CREATE FUNCTION myfunc_double RETURNS REAL SONAME "$UDF_EXAMPLE_SO";
create table t1(pk int primary key,
a int,
sum int,
price float(24));
insert into t1 values
(1, 1, 100, 50.00),
(2, 1, 100, 100.00),
(3, 1, 100, 50.00),
(4, 1, 100, 50.00),
(5, 1, 100, 50.00),
(6, 1, 100, NULL),
(7, 1, NULL, NULL),
(8, 2, 2, 2),
(9, 2, 4, 4);
--sorted_result
select pk, a, sum, price, avgcost(sum, price) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
from t1;
--sorted_result
select pk, a, sum, price, avgcost(sum, price) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING)
from t1;
--sorted_result
select pk, a, sum, price, avg2(sum, price) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
from t1;
--sorted_result
select pk, a, sum, price, avg2(sum, price) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING)
from t1;
--error ER_PARSE_ERROR
select pk, a, sum, price, tttttttt(sprice,sum) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING)
from t1;
--error ER_PARSE_ERROR
select pk, a, sum, price, myfunc_double(sum) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING)
from t1;
--error ER_PARSE_ERROR
select pk, a, sum, price, round(sprice,sum) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING)
from t1;
--error ER_PARSE_ERROR
select pk, a, sum, price, myfunc_double(sum) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING)
from t1;
set @save_sql_mode = @@sql_mode;
set sql_mode="oracle";
--sorted_result
select pk, a, sum, price, avg2(sum, price) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING)
from t1;
set sql_mode= @save_sql_mode;
drop table t1;
DROP FUNCTION avgcost;
DROP FUNCTION avg2;
DROP FUNCTION myfunc_double;