Skip to content

Commit

Permalink
MDEV-12465: Server crashes in my_scan_weight_utf8_bin upon collecting…
Browse files Browse the repository at this point in the history
… 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.
  • Loading branch information
spetrunia committed May 18, 2018
1 parent 06aaaef commit dd51082
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 2 deletions.
14 changes: 12 additions & 2 deletions sql/sql_statistics.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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,
Expand Down Expand Up @@ -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)
Expand Down
26 changes: 26 additions & 0 deletions storage/rocksdb/mysql-test/rocksdb/r/analyze_table.result
Original file line number Diff line number Diff line change
Expand Up @@ -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
26 changes: 26 additions & 0 deletions storage/rocksdb/mysql-test/rocksdb/t/analyze_table.test
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
--source include/have_rocksdb.inc
--source include/have_partition.inc

#
# ANALYZE TABLE statements
Expand Down Expand Up @@ -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

0 comments on commit dd51082

Please sign in to comment.