1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-12465: Server crashes in my_scan_weight_utf8_bin upon collecting stats for RocksDB table

Apply patch by Oleksandr Byelkin:
Do not use "only index read" in analyzing indices if there is a field which present in the index only partially.
This commit is contained in:
Sergei Petrunia
2018-05-19 00:26:35 +03:00
parent 06aaaef51a
commit dd51082eca
3 changed files with 64 additions and 2 deletions

View File

@ -1801,6 +1801,7 @@ private:
public:
bool is_single_comp_pk;
bool is_partial_fields_present;
Index_prefix_calc(THD *thd, TABLE *table, KEY *key_info)
: index_table(table), index_info(key_info)
@ -1812,7 +1813,7 @@ public:
prefixes= 0;
LINT_INIT_STRUCT(calc_state);
is_single_comp_pk= FALSE;
is_partial_fields_present= is_single_comp_pk= FALSE;
uint pk= table->s->primary_key;
if ((uint) (table->key_info - key_info) == pk &&
table->key_info[pk].user_defined_key_parts == 1)
@ -1834,7 +1835,10 @@ public:
calculating the values of 'avg_frequency' for prefixes.
*/
if (!key_info->key_part[i].field->part_of_key.is_set(keyno))
{
is_partial_fields_present= TRUE;
break;
}
if (!(state->last_prefix=
new (thd->mem_root) Cached_item_field(thd,
@ -2633,7 +2637,13 @@ int collect_statistics_for_index(THD *thd, TABLE *table, uint index)
DBUG_RETURN(rc);
}
table->file->ha_start_keyread(index);
/*
Request "only index read" in case of absence of fields which are
partially in the index to avoid problems with partitioning (for example)
which want to get whole field value.
*/
if (!index_prefix_calc.is_partial_fields_present)
table->file->ha_start_keyread(index);
table->file->ha_index_init(index, TRUE);
rc= table->file->ha_index_first(table->record[0]);
while (rc != HA_ERR_END_OF_FILE)

View File

@ -27,3 +27,29 @@ ANALYZE TABLE t1;
Table Op Msg_type Msg_text
test.t1 analyze status OK
DROP TABLE t1;
#
# MDEV-12465: Server crashes in my_scan_weight_utf8_bin upon
# collecting stats for RocksDB table
#
CREATE TABLE t1 (
pk INT,
f1 CHAR(255),
f2 TEXT,
f3 VARCHAR(255),
f4 TEXT,
PRIMARY KEY (pk),
KEY (f4(255))
) ENGINE=RocksDB
CHARSET utf8
COLLATE utf8_bin
PARTITION BY KEY (pk) PARTITIONS 2;
INSERT INTO t1 VALUES
(1,'foo','bar','foo','bar'), (2,'bar','foo','bar','foo');
ANALYZE TABLE t1 PERSISTENT FOR ALL;
Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze Warning Engine-independent statistics are not collected for column 'f2'
test.t1 analyze Warning Engine-independent statistics are not collected for column 'f4'
test.t1 analyze status OK
drop table t1;
# End of 10.2 tests

View File

@ -1,4 +1,5 @@
--source include/have_rocksdb.inc
--source include/have_partition.inc
#
# ANALYZE TABLE statements
@ -29,3 +30,28 @@ INSERT INTO t1 VALUES (5,8),(6,10),(7,11),(8,12);
ANALYZE TABLE t1;
DROP TABLE t1;
--echo #
--echo # MDEV-12465: Server crashes in my_scan_weight_utf8_bin upon
--echo # collecting stats for RocksDB table
--echo #
CREATE TABLE t1 (
pk INT,
f1 CHAR(255),
f2 TEXT,
f3 VARCHAR(255),
f4 TEXT,
PRIMARY KEY (pk),
KEY (f4(255))
) ENGINE=RocksDB
CHARSET utf8
COLLATE utf8_bin
PARTITION BY KEY (pk) PARTITIONS 2;
INSERT INTO t1 VALUES
(1,'foo','bar','foo','bar'), (2,'bar','foo','bar','foo');
ANALYZE TABLE t1 PERSISTENT FOR ALL;
drop table t1;
--echo # End of 10.2 tests