summaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2020-06-01 14:00:35 +0400
committerAlexander Barkov <bar@mariadb.com>2020-06-01 14:02:31 +0400
commitf22093ad392b6a7c9906ff97551fc9e1eda8ffa7 (patch)
tree982363f57da04a52a4363a624da9425fcb7ac24b /plugin
parentdec3f8ca69e5eb19a4be7a175d3834874c4d880b (diff)
downloadmariadb-git-f22093ad392b6a7c9906ff97551fc9e1eda8ffa7.tar.gz
MDEV-22764 Crash with a stored aggregate function returning INET6
Item_sum_sp did not override val_native(). So the reported script crashed in the default implementation in Item::val_native() on DBUG_ASSERT(). Implementing a correct Item_sum_sp::val_native().
Diffstat (limited to 'plugin')
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6.result35
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6.test37
2 files changed, 72 insertions, 0 deletions
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6.result b/plugin/type_inet/mysql-test/type_inet/type_inet6.result
index edcdc64dade..b0363b7f5bd 100644
--- a/plugin/type_inet/mysql-test/type_inet/type_inet6.result
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6.result
@@ -1986,3 +1986,38 @@ ERROR HY000: Illegal parameter data type inet6 for operation 'extract(day)'
DROP TABLE t1;
SELECT EXTRACT(DAY FROM CAST('::' AS INET6));
ERROR HY000: Illegal parameter data type inet6 for operation 'extract(day)'
+#
+# MDEV-22764 Crash with a stored aggregate function returning INET6
+#
+CREATE OR REPLACE AGGREGATE FUNCTION aggregate_min_inet6(x INET6) RETURNS INET6
+BEGIN
+DECLARE res INET6 DEFAULT NULL;
+DECLARE CONTINUE HANDLER FOR NOT FOUND
+RETURN res;
+LOOP
+FETCH GROUP NEXT ROW;
+IF (res IS NULL) OR (res > x) THEN
+SET res= x;
+END IF;
+END LOOP;
+END;
+$$
+CREATE OR REPLACE TABLE t1 (name CHAR(30), val INET6);
+INSERT INTO t1 VALUES ('a', '::05');
+INSERT INTO t1 VALUES ('a', '::03');
+INSERT INTO t1 VALUES ('b', '::01');
+INSERT INTO t1 VALUES ('b', '::02');
+INSERT INTO t1 VALUES ('b', '::05');
+SELECT name, aggregate_min_inet6(val) pc FROM t1 GROUP BY name;
+name pc
+a ::3
+b ::1
+CREATE OR REPLACE TABLE t2 (name CHAR(30), val INET6);
+INSERT INTO t2 SELECT name, aggregate_min_inet6(val) pc FROM t1 GROUP BY name;
+SELECT * FROM t2;
+name val
+a ::3
+b ::1
+DROP TABLE t2;
+DROP TABLE t1;
+DROP FUNCTION aggregate_min_inet6;
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6.test b/plugin/type_inet/mysql-test/type_inet/type_inet6.test
index 92ca0d95644..90cf08a1131 100644
--- a/plugin/type_inet/mysql-test/type_inet/type_inet6.test
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6.test
@@ -1457,3 +1457,40 @@ SELECT EXTRACT(DAY FROM a) FROM t1;
DROP TABLE t1;
--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
SELECT EXTRACT(DAY FROM CAST('::' AS INET6));
+
+
+--echo #
+--echo # MDEV-22764 Crash with a stored aggregate function returning INET6
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE AGGREGATE FUNCTION aggregate_min_inet6(x INET6) RETURNS INET6
+BEGIN
+ DECLARE res INET6 DEFAULT NULL;
+ DECLARE CONTINUE HANDLER FOR NOT FOUND
+ RETURN res;
+ LOOP
+ FETCH GROUP NEXT ROW;
+ IF (res IS NULL) OR (res > x) THEN
+ SET res= x;
+ END IF;
+ END LOOP;
+END;
+$$
+DELIMITER ;$$
+
+CREATE OR REPLACE TABLE t1 (name CHAR(30), val INET6);
+INSERT INTO t1 VALUES ('a', '::05');
+INSERT INTO t1 VALUES ('a', '::03');
+INSERT INTO t1 VALUES ('b', '::01');
+INSERT INTO t1 VALUES ('b', '::02');
+INSERT INTO t1 VALUES ('b', '::05');
+SELECT name, aggregate_min_inet6(val) pc FROM t1 GROUP BY name;
+
+CREATE OR REPLACE TABLE t2 (name CHAR(30), val INET6);
+INSERT INTO t2 SELECT name, aggregate_min_inet6(val) pc FROM t1 GROUP BY name;
+SELECT * FROM t2;
+DROP TABLE t2;
+
+DROP TABLE t1;
+DROP FUNCTION aggregate_min_inet6;