mirror of
https://github.com/MariaDB/server.git
synced 2026-04-22 08:15:31 +02:00
MDEV-10324: Server crash in get_sel_arg_for_keypart or Assertion
The crash was caused by this problem: get_best_group_min_max() tries to construct query plans for keys that are not processed by the range optimizer. This wasn't a problem as long as SEL_TREE::keys was an array of MAX_KEY elements. However, now it is a Mem_root_array and only has elements for the used keys, and get_best_group_min_max attempts to address beyond the end of the array. The obvious way to fix the crash was to port (and improve) a part of 96fcfcbd7b5120e8f64fd45985001eca8d36fbfb from mysql-5.7. This makes get_best_group_min_max not to consider indexes that Mem_root_arrays have no element for. After that, I got non-sensical query plans (see MDEV-10325 for details). Fixed that by making get_best_group_min_max to check if the index is in table->keys_in_use_for_group_by bitmap.
This commit is contained in:
parent
d1b2589074
commit
95c286cedf
6 changed files with 145 additions and 56 deletions
|
|
@ -2692,3 +2692,37 @@ select distinct a from t1 group by 'a';
|
|||
a
|
||||
2001-02-02
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-10324: Server crash in get_sel_arg_for_keypart or Assertion `n < size()' failed in Mem_root_array
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
job_id int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
job_cmd varbinary(60) NOT NULL DEFAULT '',
|
||||
job_namespace int(11) NOT NULL,
|
||||
job_title varbinary(255) NOT NULL,
|
||||
job_params blob NOT NULL,
|
||||
job_timestamp varbinary(14) DEFAULT NULL,
|
||||
job_random int(10) unsigned NOT NULL DEFAULT '0',
|
||||
job_token varbinary(32) NOT NULL DEFAULT '',
|
||||
job_token_timestamp varbinary(14) DEFAULT NULL,
|
||||
job_sha1 varbinary(32) NOT NULL DEFAULT '',
|
||||
job_attempts int(10) unsigned NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (job_id),
|
||||
KEY job_cmd (job_cmd,job_namespace,job_title,job_params(128)),
|
||||
KEY job_timestamp (job_timestamp),
|
||||
KEY job_sha1 (job_sha1),
|
||||
KEY job_cmd_token (job_cmd,job_token,job_random),
|
||||
KEY job_cmd_token_id (job_cmd,job_token,job_id)
|
||||
);
|
||||
INSERT INTO t1 VALUES
|
||||
(NULL, 'foo', 1, 'foo', 'foo', 'foo', 1, 'foo', 'foo', 'foo', 1),
|
||||
(NULL, 'bar', 2, 'bar', 'bar', 'bar', 2, 'bar', 'bar', 'bar', 2);
|
||||
SELECT DISTINCT job_cmd FROM t1 WHERE job_cmd IN ('foobar','null');
|
||||
job_cmd
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (f1 INT NOT NULL, f2 VARCHAR(3) NOT NULL, KEY(f1), KEY(f2, f1));
|
||||
INSERT INTO t1 VALUES (0,'foo'),(1,'bar');
|
||||
SELECT 1 IN ( SELECT COUNT( DISTINCT f2 ) FROM t1 WHERE f1 <= 4 );
|
||||
1 IN ( SELECT COUNT( DISTINCT f2 ) FROM t1 WHERE f1 <= 4 )
|
||||
0
|
||||
drop table t1;
|
||||
|
|
|
|||
|
|
@ -123,4 +123,39 @@ id xtext optionen
|
|||
2 number 22,25
|
||||
1 select Kabel mit Stecker 5-polig,Kabel ohne Stecker
|
||||
DROP TABLE t1, t2;
|
||||
# Port of testcase:
|
||||
#
|
||||
# Bug#20819199 ASSERTION FAILED IN TEST_IF_SKIP_SORT_ORDER
|
||||
#
|
||||
CREATE TABLE t0 ( a INT );
|
||||
INSERT INTO t0 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
|
||||
CREATE TABLE t1 (
|
||||
pk INT NOT NULL AUTO_INCREMENT,
|
||||
a INT,
|
||||
b INT,
|
||||
PRIMARY KEY (pk),
|
||||
KEY idx1 (a),
|
||||
KEY idx2 (b, a),
|
||||
KEY idx3 (a, b)
|
||||
) ENGINE = InnoDB;
|
||||
INSERT INTO t1 (a, b) SELECT t01.a, t02.a FROM t0 t01, t0 t02;
|
||||
ANALYZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status OK
|
||||
EXPLAIN SELECT DISTINCT a, MAX(b) FROM t1 WHERE a >= 0 GROUP BY a,a;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range idx1,idx3 idx3 5 NULL 100 Using where; Using index
|
||||
SELECT DISTINCT a, MAX(b) FROM t1 WHERE a >= 0 GROUP BY a,a;
|
||||
a MAX(b)
|
||||
1 10
|
||||
2 10
|
||||
3 10
|
||||
4 10
|
||||
5 10
|
||||
6 10
|
||||
7 10
|
||||
8 10
|
||||
9 10
|
||||
10 10
|
||||
DROP TABLE t0, t1;
|
||||
# End of tests
|
||||
|
|
|
|||
|
|
@ -1163,7 +1163,7 @@ INSERT INTO t1 SELECT a +32, b +32 FROM t1;
|
|||
INSERT INTO t1 SELECT a +64, b +64 FROM t1;
|
||||
EXPLAIN SELECT a FROM t1 IGNORE INDEX FOR GROUP BY (a, ab) GROUP BY a;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range NULL ab 4 NULL 10 Using index for group-by
|
||||
1 SIMPLE t1 index NULL PRIMARY 4 NULL 128 Using index
|
||||
SELECT a FROM t1 IGNORE INDEX FOR GROUP BY (a, ab) GROUP BY a;
|
||||
a
|
||||
1
|
||||
|
|
|
|||
|
|
@ -1803,3 +1803,39 @@ select distinct a from t1 group by 'a';
|
|||
insert into t1 values("2001-02-02"),("2001-02-03");
|
||||
select distinct a from t1 group by 'a';
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-10324: Server crash in get_sel_arg_for_keypart or Assertion `n < size()' failed in Mem_root_array
|
||||
--echo #
|
||||
CREATE TABLE t1 (
|
||||
job_id int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
job_cmd varbinary(60) NOT NULL DEFAULT '',
|
||||
job_namespace int(11) NOT NULL,
|
||||
job_title varbinary(255) NOT NULL,
|
||||
job_params blob NOT NULL,
|
||||
job_timestamp varbinary(14) DEFAULT NULL,
|
||||
job_random int(10) unsigned NOT NULL DEFAULT '0',
|
||||
job_token varbinary(32) NOT NULL DEFAULT '',
|
||||
job_token_timestamp varbinary(14) DEFAULT NULL,
|
||||
job_sha1 varbinary(32) NOT NULL DEFAULT '',
|
||||
job_attempts int(10) unsigned NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (job_id),
|
||||
KEY job_cmd (job_cmd,job_namespace,job_title,job_params(128)),
|
||||
KEY job_timestamp (job_timestamp),
|
||||
KEY job_sha1 (job_sha1),
|
||||
KEY job_cmd_token (job_cmd,job_token,job_random),
|
||||
KEY job_cmd_token_id (job_cmd,job_token,job_id)
|
||||
);
|
||||
|
||||
INSERT INTO t1 VALUES
|
||||
(NULL, 'foo', 1, 'foo', 'foo', 'foo', 1, 'foo', 'foo', 'foo', 1),
|
||||
(NULL, 'bar', 2, 'bar', 'bar', 'bar', 2, 'bar', 'bar', 'bar', 2);
|
||||
|
||||
SELECT DISTINCT job_cmd FROM t1 WHERE job_cmd IN ('foobar','null');
|
||||
drop table t1;
|
||||
|
||||
CREATE TABLE t1 (f1 INT NOT NULL, f2 VARCHAR(3) NOT NULL, KEY(f1), KEY(f2, f1));
|
||||
INSERT INTO t1 VALUES (0,'foo'),(1,'bar');
|
||||
SELECT 1 IN ( SELECT COUNT( DISTINCT f2 ) FROM t1 WHERE f1 <= 4 );
|
||||
drop table t1;
|
||||
|
||||
|
|
|
|||
|
|
@ -125,4 +125,34 @@ ORDER BY id DESC;
|
|||
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo # Port of testcase:
|
||||
--echo #
|
||||
--echo # Bug#20819199 ASSERTION FAILED IN TEST_IF_SKIP_SORT_ORDER
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t0 ( a INT );
|
||||
INSERT INTO t0 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
|
||||
|
||||
CREATE TABLE t1 (
|
||||
pk INT NOT NULL AUTO_INCREMENT,
|
||||
a INT,
|
||||
b INT,
|
||||
PRIMARY KEY (pk),
|
||||
KEY idx1 (a),
|
||||
KEY idx2 (b, a),
|
||||
KEY idx3 (a, b)
|
||||
) ENGINE = InnoDB;
|
||||
|
||||
INSERT INTO t1 (a, b) SELECT t01.a, t02.a FROM t0 t01, t0 t02;
|
||||
|
||||
ANALYZE TABLE t1;
|
||||
|
||||
let $query=
|
||||
SELECT DISTINCT a, MAX(b) FROM t1 WHERE a >= 0 GROUP BY a,a;
|
||||
|
||||
eval EXPLAIN $query;
|
||||
eval $query;
|
||||
|
||||
DROP TABLE t0, t1;
|
||||
|
||||
--echo # End of tests
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue