diff options
Diffstat (limited to 'mysql-test/main/custom_aggregate_functions.test')
-rw-r--r-- | mysql-test/main/custom_aggregate_functions.test | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/mysql-test/main/custom_aggregate_functions.test b/mysql-test/main/custom_aggregate_functions.test index 13eb3bed2af..ab799b48bdb 100644 --- a/mysql-test/main/custom_aggregate_functions.test +++ b/mysql-test/main/custom_aggregate_functions.test @@ -783,3 +783,185 @@ end| delimiter ;| select f1('2001-01-01'),cast(f1('2001-01-01') as time); drop function f1; + + +--echo # +--echo # MDEV-15957 Unexpected "Data too long" when doing CREATE..SELECT with stored functions +--echo # + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2),(3); +DELIMITER $$; +CREATE AGGREGATE FUNCTION f1(x INT) RETURNS INT(3) +BEGIN + DECLARE res INT DEFAULT 0; + DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN res-200; + LOOP + FETCH GROUP NEXT ROW; + SET res= res + x; + END LOOP; + RETURN res; +END; +$$ +DELIMITER ;$$ +CREATE TABLE t2 AS SELECT CONCAT(f1(a)) FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t1,t2; +DROP FUNCTION f1; + + +DELIMITER $$; +CREATE AGGREGATE FUNCTION f1() RETURNS TINYTEXT CHARACTER SET latin1 +BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN ''; + LOOP + FETCH GROUP NEXT ROW; + END LOOP; + RETURN ''; +END; +$$ +DELIMITER ;$$ +CREATE TABLE t1 AS SELECT f1() AS c1, COALESCE(f1()) AS c2, CONCAT(f1()) AS c3; +SHOW CREATE TABLE t1; +DROP TABLE t1; +DROP FUNCTION f1; + +DELIMITER $$; +CREATE AGGREGATE FUNCTION f1() RETURNS TEXT CHARACTER SET latin1 +BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN ''; + LOOP + FETCH GROUP NEXT ROW; + END LOOP; + RETURN ''; +END; +$$ +DELIMITER ;$$ +CREATE TABLE t1 AS SELECT f1() AS c1, COALESCE(f1()) AS c2, CONCAT(f1()) AS c3; +SHOW CREATE TABLE t1; +DROP TABLE t1; +DROP FUNCTION f1; + +DELIMITER $$; +CREATE AGGREGATE FUNCTION f1() RETURNS MEDIUMTEXT CHARACTER SET latin1 +BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN ''; + LOOP + FETCH GROUP NEXT ROW; + END LOOP; + RETURN ''; +END; +$$ +DELIMITER ;$$ +CREATE TABLE t1 AS SELECT f1() AS c1, COALESCE(f1()) AS c2, CONCAT(f1()) AS c3; +SHOW CREATE TABLE t1; +DROP TABLE t1; +DROP FUNCTION f1; + +DELIMITER $$; +CREATE AGGREGATE FUNCTION f1() RETURNS LONGTEXT CHARACTER SET latin1 +BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN ''; + LOOP + FETCH GROUP NEXT ROW; + END LOOP; + RETURN ''; +END; +$$ +DELIMITER ;$$ +CREATE TABLE t1 AS SELECT f1() AS c1, COALESCE(f1()) AS c2, CONCAT(f1()) AS c3; +SHOW CREATE TABLE t1; +DROP TABLE t1; +DROP FUNCTION f1; + + +DELIMITER $$; +CREATE AGGREGATE FUNCTION f1() RETURNS TINYTEXT CHARACTER SET utf8 +BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN ''; + LOOP + FETCH GROUP NEXT ROW; + END LOOP; + RETURN ''; +END; +$$ +DELIMITER ;$$ +CREATE TABLE t1 AS SELECT f1() AS c1, COALESCE(f1()) AS c2, CONCAT(f1()) AS c3; +SHOW CREATE TABLE t1; +DROP TABLE t1; +DROP FUNCTION f1; + +DELIMITER $$; +CREATE AGGREGATE FUNCTION f1() RETURNS TEXT CHARACTER SET utf8 +BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN ''; + LOOP + FETCH GROUP NEXT ROW; + END LOOP; + RETURN ''; +END; +$$ +DELIMITER ;$$ +CREATE TABLE t1 AS SELECT f1() AS c1, COALESCE(f1()) AS c2, CONCAT(f1()) AS c3; +SHOW CREATE TABLE t1; +DROP TABLE t1; +DROP FUNCTION f1; + +DELIMITER $$; +CREATE AGGREGATE FUNCTION f1() RETURNS MEDIUMTEXT CHARACTER SET utf8 +BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN ''; + LOOP + FETCH GROUP NEXT ROW; + END LOOP; + RETURN ''; +END; +$$ +DELIMITER ;$$ +CREATE TABLE t1 AS SELECT f1() AS c1, COALESCE(f1()) AS c2, CONCAT(f1()) AS c3; +SHOW CREATE TABLE t1; +DROP TABLE t1; +DROP FUNCTION f1; + +DELIMITER $$; +CREATE AGGREGATE FUNCTION f1() RETURNS LONGTEXT CHARACTER SET utf8 +BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN ''; + LOOP + FETCH GROUP NEXT ROW; + END LOOP; + RETURN ''; +END; +$$ +DELIMITER ;$$ +CREATE TABLE t1 AS SELECT f1() AS c1, COALESCE(f1()) AS c2, CONCAT(f1()) AS c3; +SHOW CREATE TABLE t1; +DROP TABLE t1; +DROP FUNCTION f1; + +--echo # +--echo # MDEV-14520: Custom aggregate functions work incorrectly with WITH ROLLUP clause +--echo # + +--delimiter | +create aggregate function agg_sum(x INT) returns INT +begin +declare z int default 0; +declare continue handler for not found return z; +loop +fetch group next row; +set z= z+x; +end loop; +end| +--delimiter ; + +create table t1 (i int); +insert into t1 values (1),(2),(2),(3); +select i, agg_sum(i) from t1 group by i with rollup; +--echo # +--echo # Compare with +select i, sum(i) from t1 group by i with rollup; + +# Cleanup +drop function agg_sum; +drop table t1; |