mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-25630: Crash with window function in left expr of IN subquery
* Make Item_in_optimizer::fix_fields inherit the with_window_func attribute of the subquery's left expression (the subquery itself cannot have window functions that are aggregated in this select) * Make Item_cache_wrapper::Item_cache_wrapper() inherit with_window_func attribute of the item it is caching.
This commit is contained in:
@ -3892,5 +3892,24 @@ id rn
|
|||||||
1 1
|
1 1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-25630: Crash with window function in left expr of IN subquery
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (i int);
|
||||||
|
INSERT INTO t1 VALUES (1),(2),(3);
|
||||||
|
SELECT lag(i) over (ORDER BY i) IN ( SELECT 1 FROM t1 a) FROM t1;
|
||||||
|
lag(i) over (ORDER BY i) IN ( SELECT 1 FROM t1 a)
|
||||||
|
NULL
|
||||||
|
1
|
||||||
|
0
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (i int);
|
||||||
|
INSERT INTO t1 VALUES (1),(2),(3);
|
||||||
|
SELECT sum(i) over () IN ( SELECT 1 FROM t1 a) FROM t1;
|
||||||
|
sum(i) over () IN ( SELECT 1 FROM t1 a)
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
|
@ -3898,6 +3898,25 @@ id rn
|
|||||||
1 1
|
1 1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-25630: Crash with window function in left expr of IN subquery
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (i int);
|
||||||
|
INSERT INTO t1 VALUES (1),(2),(3);
|
||||||
|
SELECT lag(i) over (ORDER BY i) IN ( SELECT 1 FROM t1 a) FROM t1;
|
||||||
|
lag(i) over (ORDER BY i) IN ( SELECT 1 FROM t1 a)
|
||||||
|
NULL
|
||||||
|
1
|
||||||
|
0
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (i int);
|
||||||
|
INSERT INTO t1 VALUES (1),(2),(3);
|
||||||
|
SELECT sum(i) over () IN ( SELECT 1 FROM t1 a) FROM t1;
|
||||||
|
sum(i) over () IN ( SELECT 1 FROM t1 a)
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -2542,6 +2542,20 @@ order by rn desc;
|
|||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-25630: Crash with window function in left expr of IN subquery
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i int);
|
||||||
|
INSERT INTO t1 VALUES (1),(2),(3);
|
||||||
|
SELECT lag(i) over (ORDER BY i) IN ( SELECT 1 FROM t1 a) FROM t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i int);
|
||||||
|
INSERT INTO t1 VALUES (1),(2),(3);
|
||||||
|
SELECT sum(i) over () IN ( SELECT 1 FROM t1 a) FROM t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -8203,6 +8203,7 @@ Item_cache_wrapper::Item_cache_wrapper(THD *thd, Item *item_arg):
|
|||||||
name= item_arg->name;
|
name= item_arg->name;
|
||||||
name_length= item_arg->name_length;
|
name_length= item_arg->name_length;
|
||||||
with_subselect= orig_item->with_subselect;
|
with_subselect= orig_item->with_subselect;
|
||||||
|
with_window_func= orig_item->with_window_func;
|
||||||
|
|
||||||
if ((expr_value= Item_cache::get_cache(thd, orig_item)))
|
if ((expr_value= Item_cache::get_cache(thd, orig_item)))
|
||||||
expr_value->setup(thd, orig_item);
|
expr_value->setup(thd, orig_item);
|
||||||
|
@ -1416,6 +1416,9 @@ bool Item_in_optimizer::fix_fields(THD *thd, Item **ref)
|
|||||||
maybe_null=1;
|
maybe_null=1;
|
||||||
with_subselect= 1;
|
with_subselect= 1;
|
||||||
with_sum_func= with_sum_func || args[1]->with_sum_func;
|
with_sum_func= with_sum_func || args[1]->with_sum_func;
|
||||||
|
with_window_func= args[0]->with_window_func;
|
||||||
|
// The subquery cannot have window functions aggregated in this select
|
||||||
|
DBUG_ASSERT(!args[1]->with_window_func);
|
||||||
with_field= with_field || args[1]->with_field;
|
with_field= with_field || args[1]->with_field;
|
||||||
with_param= args[0]->with_param || args[1]->with_param;
|
with_param= args[0]->with_param || args[1]->with_param;
|
||||||
used_tables_and_const_cache_join(args[1]);
|
used_tables_and_const_cache_join(args[1]);
|
||||||
|
Reference in New Issue
Block a user