diff options
author | Daniel Black <daniel@mariadb.org> | 2022-11-29 15:19:37 +1100 |
---|---|---|
committer | Daniel Black <daniel@mariadb.org> | 2022-12-02 17:22:04 +1100 |
commit | 072b3668ca6ef3c32817536e3f9f922f8cda6175 (patch) | |
tree | 25a4679ca7463eb0bf32498dc4dd20e7b4afa95a | |
parent | 4783f37cf79150db55a7258683e50a04d987af1d (diff) | |
download | mariadb-git-072b3668ca6ef3c32817536e3f9f922f8cda6175.tar.gz |
MDEV-28206: SIGSEGV in Item_field::fix_fields when using LEAD...OVER
thd->lex->in_sum_func->max_arg_level cannot be set to a
bigger value of select->nest_level if select is null.
-rw-r--r-- | mysql-test/main/win.result | 24 | ||||
-rw-r--r-- | mysql-test/main/win.test | 28 | ||||
-rw-r--r-- | mysql-test/suite/encryption/r/tempfiles_encrypted.result | 24 | ||||
-rw-r--r-- | sql/item.cc | 1 |
4 files changed, 77 insertions, 0 deletions
diff --git a/mysql-test/main/win.result b/mysql-test/main/win.result index 0874e5b9a24..3e130c9653e 100644 --- a/mysql-test/main/win.result +++ b/mysql-test/main/win.result @@ -4352,3 +4352,27 @@ row_number() OVER (order by a) 2 3 drop table t1; +# +# MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER +# +CREATE TABLE t(c1 INT); +CREATE FUNCTION f() RETURNS INT READS SQL DATA BEGIN +DECLARE v INT; +SELECT 1 INTO v FROM (SELECT c1,COALESCE(LEAD(a2.c1) OVER (PARTITION BY a2.c1 ORDER BY a2.c1),a2.c1) AS a1 FROM (t a2 JOIN t a3 USING (c1))) a4; +RETURN 1; +END// +SELECT f(),f(); +f() f() +1 1 +EXECUTE IMMEDIATE "SELECT LEAD(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; +LEAD(c1) OVER (ORDER BY c1) +EXECUTE IMMEDIATE "SELECT SUM(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; +SUM(c1) OVER (ORDER BY c1) +EXECUTE IMMEDIATE "SELECT LEAD(c) OVER (ORDER BY c) FROM (SELECT 1 AS c) AS a NATURAL JOIN (SELECT 1 AS c) AS b;"; +LEAD(c) OVER (ORDER BY c) +NULL +DROP FUNCTION f; +DROP TABLE t; +# +# End of 10.6 tests +# diff --git a/mysql-test/main/win.test b/mysql-test/main/win.test index 5a216123369..d7f52ec32e9 100644 --- a/mysql-test/main/win.test +++ b/mysql-test/main/win.test @@ -2829,3 +2829,31 @@ create table t1 (a int); insert into t1 values (1),(2),(3); SELECT row_number() OVER (order by a) FROM t1 order by NAME_CONST('myname',NULL); drop table t1; + +--echo # +--echo # MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER +--echo # + +CREATE TABLE t(c1 INT); + +DELIMITER //; +CREATE FUNCTION f() RETURNS INT READS SQL DATA BEGIN + DECLARE v INT; + SELECT 1 INTO v FROM (SELECT c1,COALESCE(LEAD(a2.c1) OVER (PARTITION BY a2.c1 ORDER BY a2.c1),a2.c1) AS a1 FROM (t a2 JOIN t a3 USING (c1))) a4; + RETURN 1; +END// +DELIMITER ;// + +SELECT f(),f(); + +EXECUTE IMMEDIATE "SELECT LEAD(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; +EXECUTE IMMEDIATE "SELECT SUM(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; + +EXECUTE IMMEDIATE "SELECT LEAD(c) OVER (ORDER BY c) FROM (SELECT 1 AS c) AS a NATURAL JOIN (SELECT 1 AS c) AS b;"; + +DROP FUNCTION f; +DROP TABLE t; + +--echo # +--echo # End of 10.6 tests +--echo # diff --git a/mysql-test/suite/encryption/r/tempfiles_encrypted.result b/mysql-test/suite/encryption/r/tempfiles_encrypted.result index fb4738a1fed..2b91cd638e2 100644 --- a/mysql-test/suite/encryption/r/tempfiles_encrypted.result +++ b/mysql-test/suite/encryption/r/tempfiles_encrypted.result @@ -4359,6 +4359,30 @@ row_number() OVER (order by a) 3 drop table t1; # +# MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER +# +CREATE TABLE t(c1 INT); +CREATE FUNCTION f() RETURNS INT READS SQL DATA BEGIN +DECLARE v INT; +SELECT 1 INTO v FROM (SELECT c1,COALESCE(LEAD(a2.c1) OVER (PARTITION BY a2.c1 ORDER BY a2.c1),a2.c1) AS a1 FROM (t a2 JOIN t a3 USING (c1))) a4; +RETURN 1; +END// +SELECT f(),f(); +f() f() +1 1 +EXECUTE IMMEDIATE "SELECT LEAD(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; +LEAD(c1) OVER (ORDER BY c1) +EXECUTE IMMEDIATE "SELECT SUM(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; +SUM(c1) OVER (ORDER BY c1) +EXECUTE IMMEDIATE "SELECT LEAD(c) OVER (ORDER BY c) FROM (SELECT 1 AS c) AS a NATURAL JOIN (SELECT 1 AS c) AS b;"; +LEAD(c) OVER (ORDER BY c) +NULL +DROP FUNCTION f; +DROP TABLE t; +# +# End of 10.6 tests +# +# # MDEV-23867: select crash in compute_window_func # set @save_sort_buffer_size=@@sort_buffer_size; diff --git a/sql/item.cc b/sql/item.cc index 91bc175ca13..a63ac1f1119 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -6114,6 +6114,7 @@ bool Item_field::fix_fields(THD *thd, Item **reference) if (!thd->lex->current_select->no_wrap_view_item && thd->lex->in_sum_func && + select && thd->lex == select->parent_lex && thd->lex->in_sum_func->nest_level == select->nest_level) |