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
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."
......@@ -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;
......
......@@ -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;
......@@ -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;
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