[Commits] a4107da32be: MDEV-12465: Server crashes in my_scan_weight_utf8_bin upon collecting stats for RocksDB table
revision-id: a4107da32bea2c2e442e0bcfe46e1cd9d1e42287 (mariadb-10.2.14-116-ga4107da32be) parent(s): 50275321c3ba381d76532067289b3e07e1a3fe26 author: Oleksandr Byelkin committer: Oleksandr Byelkin timestamp: 2018-05-17 19:17:28 +0200 message: MDEV-12465: Server crashes in my_scan_weight_utf8_bin upon collecting stats for RocksDB table Do not use "only index read" in analyzing indices if there is a field which present in the index only partially. --- sql/sql_statistics.cc | 14 ++++++++++-- .../mysql-test/rocksdb/r/analyze_table.result | 26 ++++++++++++++++++++++ .../mysql-test/rocksdb/t/analyze_table.test | 26 ++++++++++++++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index 01947462cce..903ebb91d01 100644 --- a/sql/sql_statistics.cc +++ b/sql/sql_statistics.cc @@ -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) diff --git a/storage/rocksdb/mysql-test/rocksdb/r/analyze_table.result b/storage/rocksdb/mysql-test/rocksdb/r/analyze_table.result index ff2973230db..b666a17c81c 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/analyze_table.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/analyze_table.result @@ -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 diff --git a/storage/rocksdb/mysql-test/rocksdb/t/analyze_table.test b/storage/rocksdb/mysql-test/rocksdb/t/analyze_table.test index 10722194121..b24398b1fe2 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/analyze_table.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/analyze_table.test @@ -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
participants (1)
-
Oleksandr Byelkin