mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-12575: Server crash in AGGR_OP::put_record or in JOIN_CACHE::free or Invalid write in JOIN::make_aggr_tables_info
During the optimize state of a query, we come know that the result set would atmost contain one row, then for such a query we don't need to compute GROUP BY, ORDER BY and DISTINCT.
This commit is contained in:
@ -1049,4 +1049,24 @@ b1+'0' b2+'0' b3+'0' b4+'0' b5+'0' b6 +'0'
|
|||||||
1 0 0 1 0 1
|
1 0 0 1 0 1
|
||||||
0 1 0 0 1 0
|
0 1 0 0 1 0
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# MDEV-12575: Server crash in AGGR_OP::put_record or in JOIN_CACHE::free
|
||||||
|
# or Invalid write in JOIN::make_aggr_tables_info
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (pk INT PRIMARY KEY);
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
explain
|
||||||
|
( SELECT DISTINCT 1 FROM t1 ORDER BY BENCHMARK(1, MIN(pk)) )
|
||||||
|
UNION
|
||||||
|
( SELECT DISTINCT 1 FROM t1 ORDER BY BENCHMARK(1, MIN(pk)) );
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 index NULL PRIMARY 4 NULL 2 Using index; Using temporary
|
||||||
|
2 UNION t1 index NULL PRIMARY 4 NULL 2 Using index; Using temporary
|
||||||
|
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL
|
||||||
|
( SELECT DISTINCT 1 FROM t1 ORDER BY BENCHMARK(1, MIN(pk)) )
|
||||||
|
UNION
|
||||||
|
( SELECT DISTINCT 1 FROM t1 ORDER BY BENCHMARK(1, MIN(pk)) );
|
||||||
|
1
|
||||||
|
1
|
||||||
|
drop table t1;
|
||||||
End of 5.5 tests
|
End of 5.5 tests
|
||||||
|
@ -2832,3 +2832,13 @@ select distinct 1 from t1 group by a,b with rollup limit 1;
|
|||||||
1
|
1
|
||||||
1
|
1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
CREATE TABLE t1 ( pk int, i1 int, v1 varchar(1));
|
||||||
|
explain
|
||||||
|
SELECT 1 FROM t1
|
||||||
|
GROUP BY REPEAT((BINARY pk), v1), AES_DECRYPT((@A := i1), 20852) WITH ROLLUP HAVING LOAD_FILE('a') ;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible HAVING
|
||||||
|
SELECT 1 FROM t1
|
||||||
|
GROUP BY REPEAT((BINARY pk), v1), AES_DECRYPT((@A := i1), 20852) WITH ROLLUP HAVING LOAD_FILE('a') ;
|
||||||
|
1
|
||||||
|
drop table t1;
|
||||||
|
@ -3361,3 +3361,65 @@ Esben Tuning 31 68.7500
|
|||||||
Kaolin Tuning 88 68.7500
|
Kaolin Tuning 88 68.7500
|
||||||
Tatiana Tuning 83 68.7500
|
Tatiana Tuning 83 68.7500
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
|
# MDEV-12575: Server crash in AGGR_OP::put_record or in JOIN_CACHE::free
|
||||||
|
# or Invalid write in JOIN::make_aggr_tables_info
|
||||||
|
#
|
||||||
|
SELECT DISTINCT BIT_OR(100) OVER () FROM dual
|
||||||
|
GROUP BY LEFT('2018-08-24', 100) order by 1+2;
|
||||||
|
BIT_OR(100) OVER ()
|
||||||
|
100
|
||||||
|
CREATE TABLE t1 (i INT);
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
SELECT * FROM (
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() OVER(), i, sum(i)
|
||||||
|
FROM t1
|
||||||
|
WHERE 1=0
|
||||||
|
limit 0
|
||||||
|
) AS sq;
|
||||||
|
ROW_NUMBER() OVER() i sum(i)
|
||||||
|
SELECT * FROM (
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() OVER(), i, sum(i)
|
||||||
|
FROM t1
|
||||||
|
WHERE 1=0
|
||||||
|
GROUP BY i
|
||||||
|
) AS sq;
|
||||||
|
ROW_NUMBER() OVER() i sum(i)
|
||||||
|
drop table t1;
|
||||||
|
create table t1 (a int);
|
||||||
|
explain
|
||||||
|
select distinct 1, row_number() over (order by 1) from t1 where a=0 group by a with rollup;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
select distinct 1, row_number() over (order by 1) from t1 where a=0 group by a with rollup;
|
||||||
|
1 row_number() over (order by 1)
|
||||||
|
drop table t1;
|
||||||
|
explain
|
||||||
|
SELECT DISTINCT BIT_OR(100) OVER () FROM dual
|
||||||
|
GROUP BY LEFT('2018-08-24', 100) WITH ROLLUP
|
||||||
|
HAVING @A := 'qwerty';
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible HAVING
|
||||||
|
SELECT DISTINCT BIT_OR(100) OVER () FROM dual
|
||||||
|
GROUP BY LEFT('2018-08-24', 100) WITH ROLLUP
|
||||||
|
HAVING @A := 'qwerty';
|
||||||
|
BIT_OR(100) OVER ()
|
||||||
|
explain
|
||||||
|
SELECT DISTINCT BIT_OR(100) OVER () FROM dual
|
||||||
|
GROUP BY LEFT('2018-08-24', 100)
|
||||||
|
HAVING @A := 'qwerty';
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible HAVING
|
||||||
|
SELECT DISTINCT BIT_OR(100) OVER () FROM dual
|
||||||
|
GROUP BY LEFT('2018-08-24', 100)
|
||||||
|
HAVING @A := 'qwerty';
|
||||||
|
BIT_OR(100) OVER ()
|
||||||
|
create table t1 (a int);
|
||||||
|
explain
|
||||||
|
SELECT DISTINCT BIT_OR(100) OVER () FROM t1
|
||||||
|
GROUP BY LEFT('2018-08-24', 100) having 1=1 limit 0;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Zero limit
|
||||||
|
drop table t1;
|
||||||
|
@ -798,4 +798,22 @@ CREATE TABLE t1 (b1 BIT, b2 BIT, b3 BIT, b4 BIT , b5 BIT, b6 BIT);
|
|||||||
INSERT INTO t1 VALUES (1,0,0,1,0,1),(0,1,0,0,1,0);
|
INSERT INTO t1 VALUES (1,0,0,1,0,1),(0,1,0,0,1,0);
|
||||||
SELECT DISTINCT b1+'0', b2+'0', b3+'0', b4+'0', b5+'0', b6 +'0' FROM t1;
|
SELECT DISTINCT b1+'0', b2+'0', b3+'0', b4+'0', b5+'0', b6 +'0' FROM t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-12575: Server crash in AGGR_OP::put_record or in JOIN_CACHE::free
|
||||||
|
--echo # or Invalid write in JOIN::make_aggr_tables_info
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (pk INT PRIMARY KEY);
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
explain
|
||||||
|
( SELECT DISTINCT 1 FROM t1 ORDER BY BENCHMARK(1, MIN(pk)) )
|
||||||
|
UNION
|
||||||
|
( SELECT DISTINCT 1 FROM t1 ORDER BY BENCHMARK(1, MIN(pk)) );
|
||||||
|
|
||||||
|
( SELECT DISTINCT 1 FROM t1 ORDER BY BENCHMARK(1, MIN(pk)) )
|
||||||
|
UNION
|
||||||
|
( SELECT DISTINCT 1 FROM t1 ORDER BY BENCHMARK(1, MIN(pk)) );
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
--echo End of 5.5 tests
|
--echo End of 5.5 tests
|
||||||
|
@ -1948,3 +1948,15 @@ insert into t1 values(-126,7),(1,1),(0,0),(-1,1),(351,65534);
|
|||||||
select distinct 1 from t1 group by a,b with rollup limit 1;
|
select distinct 1 from t1 group by a,b with rollup limit 1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# MDEV-12575: Server crash in AGGR_OP::put_record or in JOIN_CACHE::free
|
||||||
|
# or Invalid write in JOIN::make_aggr_tables_info
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 ( pk int, i1 int, v1 varchar(1));
|
||||||
|
explain
|
||||||
|
SELECT 1 FROM t1
|
||||||
|
GROUP BY REPEAT((BINARY pk), v1), AES_DECRYPT((@A := i1), 20852) WITH ROLLUP HAVING LOAD_FILE('a') ;
|
||||||
|
SELECT 1 FROM t1
|
||||||
|
GROUP BY REPEAT((BINARY pk), v1), AES_DECRYPT((@A := i1), 20852) WITH ROLLUP HAVING LOAD_FILE('a') ;
|
||||||
|
drop table t1;
|
||||||
|
@ -2119,3 +2119,59 @@ SELECT name, test, score,
|
|||||||
FROM t1
|
FROM t1
|
||||||
ORDER BY test, name;
|
ORDER BY test, name;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-12575: Server crash in AGGR_OP::put_record or in JOIN_CACHE::free
|
||||||
|
--echo # or Invalid write in JOIN::make_aggr_tables_info
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SELECT DISTINCT BIT_OR(100) OVER () FROM dual
|
||||||
|
GROUP BY LEFT('2018-08-24', 100) order by 1+2;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INT);
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
|
||||||
|
SELECT * FROM (
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() OVER(), i, sum(i)
|
||||||
|
FROM t1
|
||||||
|
WHERE 1=0
|
||||||
|
limit 0
|
||||||
|
) AS sq;
|
||||||
|
|
||||||
|
SELECT * FROM (
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() OVER(), i, sum(i)
|
||||||
|
FROM t1
|
||||||
|
WHERE 1=0
|
||||||
|
GROUP BY i
|
||||||
|
) AS sq;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1 (a int);
|
||||||
|
explain
|
||||||
|
select distinct 1, row_number() over (order by 1) from t1 where a=0 group by a with rollup;
|
||||||
|
select distinct 1, row_number() over (order by 1) from t1 where a=0 group by a with rollup;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
explain
|
||||||
|
SELECT DISTINCT BIT_OR(100) OVER () FROM dual
|
||||||
|
GROUP BY LEFT('2018-08-24', 100) WITH ROLLUP
|
||||||
|
HAVING @A := 'qwerty';
|
||||||
|
SELECT DISTINCT BIT_OR(100) OVER () FROM dual
|
||||||
|
GROUP BY LEFT('2018-08-24', 100) WITH ROLLUP
|
||||||
|
HAVING @A := 'qwerty';
|
||||||
|
|
||||||
|
explain
|
||||||
|
SELECT DISTINCT BIT_OR(100) OVER () FROM dual
|
||||||
|
GROUP BY LEFT('2018-08-24', 100)
|
||||||
|
HAVING @A := 'qwerty';
|
||||||
|
SELECT DISTINCT BIT_OR(100) OVER () FROM dual
|
||||||
|
GROUP BY LEFT('2018-08-24', 100)
|
||||||
|
HAVING @A := 'qwerty';
|
||||||
|
|
||||||
|
create table t1 (a int);
|
||||||
|
explain
|
||||||
|
SELECT DISTINCT BIT_OR(100) OVER () FROM t1
|
||||||
|
GROUP BY LEFT('2018-08-24', 100) having 1=1 limit 0;
|
||||||
|
drop table t1;
|
||||||
|
@ -2245,6 +2245,18 @@ setup_subq_exit:
|
|||||||
if (!tables_list || !table_count)
|
if (!tables_list || !table_count)
|
||||||
{
|
{
|
||||||
choose_tableless_subquery_plan();
|
choose_tableless_subquery_plan();
|
||||||
|
|
||||||
|
/* The output has atmost one row */
|
||||||
|
if (group_list)
|
||||||
|
{
|
||||||
|
group_list= NULL;
|
||||||
|
group_optimized_away= 1;
|
||||||
|
rollup.state= ROLLUP::STATE_NONE;
|
||||||
|
}
|
||||||
|
order= NULL;
|
||||||
|
simple_order= TRUE;
|
||||||
|
select_distinct= FALSE;
|
||||||
|
|
||||||
if (select_lex->have_window_funcs())
|
if (select_lex->have_window_funcs())
|
||||||
{
|
{
|
||||||
if (!(join_tab= (JOIN_TAB*) thd->alloc(sizeof(JOIN_TAB))))
|
if (!(join_tab= (JOIN_TAB*) thd->alloc(sizeof(JOIN_TAB))))
|
||||||
|
Reference in New Issue
Block a user