MDEV-14389: MyRocks and NOPAD collations

Disallow use of NOPAD collations in indexed columns.
This commit is contained in:
Sergei Petrunia 2017-12-12 01:33:03 +03:00
parent 13b9ec651a
commit e12f77a7e3
4 changed files with 50 additions and 3 deletions

View File

@ -7749,3 +7749,7 @@ ER_NET_OK_PACKET_TOO_LARGE
ER_GEOJSON_EMPTY_COORDINATES
eng "Incorrect GeoJSON format - empty 'coordinates' array."
ER_MYROCKS_CANT_NOPAD_COLLATION
eng "MyRocks doesn't currently support collations with \"No pad\" attribute."

View File

@ -5964,6 +5964,19 @@ rdb_is_index_collation_supported(const my_core::Field *const field) {
return true;
}
static bool
rdb_field_uses_nopad_collation(const my_core::Field *const field) {
const my_core::enum_field_types type = field->real_type();
/* Handle [VAR](CHAR|BINARY) or TEXT|BLOB */
if (type == MYSQL_TYPE_VARCHAR || type == MYSQL_TYPE_STRING ||
type == MYSQL_TYPE_BLOB) {
return (field->charset()->state & MY_CS_NOPAD);
}
return false;
}
/*
Create structures needed for storing data in rocksdb. This is called when the
table is created. The structures will be shared by all TABLE* objects.
@ -6072,8 +6085,7 @@ int ha_rocksdb::create_cfs(
for (uint i = 0; i < tbl_def_arg->m_key_count; i++) {
rocksdb::ColumnFamilyHandle *cf_handle;
if (rocksdb_strict_collation_check &&
!is_hidden_pk(i, table_arg, tbl_def_arg) &&
if (!is_hidden_pk(i, table_arg, tbl_def_arg) &&
tbl_def_arg->base_tablename().find(tmp_file_prefix) != 0) {
if (!tsys_set)
{
@ -6085,7 +6097,16 @@ int ha_rocksdb::create_cfs(
for (uint part = 0; part < table_arg->key_info[i].ext_key_parts;
part++)
{
if (!rdb_is_index_collation_supported(
/* MariaDB: disallow NOPAD collations */
if (rdb_field_uses_nopad_collation(
table_arg->key_info[i].key_part[part].field))
{
my_error(ER_MYROCKS_CANT_NOPAD_COLLATION, MYF(0));
DBUG_RETURN(HA_EXIT_FAILURE);
}
if (rocksdb_strict_collation_check &&
!rdb_is_index_collation_supported(
table_arg->key_info[i].key_part[part].field) &&
!rdb_collation_exceptions->matches(tablename_sys)) {
std::string collation_err;

View File

@ -55,3 +55,12 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 range a a 32 NULL # Using where
drop table t1,t2;
set global rocksdb_strict_collation_check=@tmp_rscc;
#
# MDEV-14389: MyRocks and NOPAD collations
#
create table t1 (pk varchar(10) collate latin1_nopad_bin, primary key(pk)) engine=rocksdb;
ERROR HY000: MyRocks doesn't currently support collations with "No pad" attribute.
set global rocksdb_strict_collation_check=off;
create table t1 (pk varchar(10) collate latin1_nopad_bin, primary key(pk)) engine=rocksdb;
ERROR HY000: MyRocks doesn't currently support collations with "No pad" attribute.
set global rocksdb_strict_collation_check=@tmp_rscc;

View File

@ -54,3 +54,16 @@ explain select a from t2 where a <'zzz';
drop table t1,t2;
set global rocksdb_strict_collation_check=@tmp_rscc;
--echo #
--echo # MDEV-14389: MyRocks and NOPAD collations
--echo #
--error ER_MYROCKS_CANT_NOPAD_COLLATION
create table t1 (pk varchar(10) collate latin1_nopad_bin, primary key(pk)) engine=rocksdb;
set global rocksdb_strict_collation_check=off;
--error ER_MYROCKS_CANT_NOPAD_COLLATION
create table t1 (pk varchar(10) collate latin1_nopad_bin, primary key(pk)) engine=rocksdb;
set global rocksdb_strict_collation_check=@tmp_rscc;