Commit dd51082e authored by Sergei Petrunia's avatar Sergei Petrunia

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.
parent 06aaaef5
......@@ -1801,6 +1801,7 @@ class Index_prefix_calc: public Sql_alloc
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 @@ class Index_prefix_calc: public Sql_alloc
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 @@ class Index_prefix_calc: public Sql_alloc
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)
......
......@@ -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
--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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment