Commit e12f77a7 authored by Sergei Petrunia's avatar Sergei Petrunia

MDEV-14389: MyRocks and NOPAD collations

Disallow use of NOPAD collations in indexed columns.
parent 13b9ec65
...@@ -7749,3 +7749,7 @@ ER_NET_OK_PACKET_TOO_LARGE ...@@ -7749,3 +7749,7 @@ ER_NET_OK_PACKET_TOO_LARGE
ER_GEOJSON_EMPTY_COORDINATES ER_GEOJSON_EMPTY_COORDINATES
eng "Incorrect GeoJSON format - empty 'coordinates' array." eng "Incorrect GeoJSON format - empty 'coordinates' array."
ER_MYROCKS_CANT_NOPAD_COLLATION
eng "MyRocks doesn't currently support collations with \"No pad\" attribute."
...@@ -5964,6 +5964,19 @@ rdb_is_index_collation_supported(const my_core::Field *const field) { ...@@ -5964,6 +5964,19 @@ rdb_is_index_collation_supported(const my_core::Field *const field) {
return true; 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 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. table is created. The structures will be shared by all TABLE* objects.
...@@ -6072,8 +6085,7 @@ int ha_rocksdb::create_cfs( ...@@ -6072,8 +6085,7 @@ int ha_rocksdb::create_cfs(
for (uint i = 0; i < tbl_def_arg->m_key_count; i++) { for (uint i = 0; i < tbl_def_arg->m_key_count; i++) {
rocksdb::ColumnFamilyHandle *cf_handle; rocksdb::ColumnFamilyHandle *cf_handle;
if (rocksdb_strict_collation_check && if (!is_hidden_pk(i, table_arg, tbl_def_arg) &&
!is_hidden_pk(i, table_arg, tbl_def_arg) &&
tbl_def_arg->base_tablename().find(tmp_file_prefix) != 0) { tbl_def_arg->base_tablename().find(tmp_file_prefix) != 0) {
if (!tsys_set) if (!tsys_set)
{ {
...@@ -6085,7 +6097,16 @@ int ha_rocksdb::create_cfs( ...@@ -6085,7 +6097,16 @@ int ha_rocksdb::create_cfs(
for (uint part = 0; part < table_arg->key_info[i].ext_key_parts; for (uint part = 0; part < table_arg->key_info[i].ext_key_parts;
part++) 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) && table_arg->key_info[i].key_part[part].field) &&
!rdb_collation_exceptions->matches(tablename_sys)) { !rdb_collation_exceptions->matches(tablename_sys)) {
std::string collation_err; std::string collation_err;
......
...@@ -55,3 +55,12 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -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 1 SIMPLE t2 range a a 32 NULL # Using where
drop table t1,t2; drop table t1,t2;
set global rocksdb_strict_collation_check=@tmp_rscc; 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;
...@@ -54,3 +54,16 @@ explain select a from t2 where a <'zzz'; ...@@ -54,3 +54,16 @@ explain select a from t2 where a <'zzz';
drop table t1,t2; drop table t1,t2;
set global rocksdb_strict_collation_check=@tmp_rscc; 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;
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