Browse Source

MDEV-35865 atomic.alter_table times out often

The problem was that get_collation_number_internal() loops over all
collations for finding a collation based on name. For looking up
utf8mb4_0900_ aliases it used 22633 character strings comparisons at
startup.

Fixed by adding the MariaDB internal collation number in the "0900" alias
lookup array. This is fine as collation numbers never changes.

Discussed-with: serg@mariadb.com
bb-11.4-georg
Monty 9 months ago
parent
commit
653f68784a
  1. 4
      include/my_sys.h
  2. 14
      mysys/charset.c
  3. 125
      strings/ctype-uca.c

4
include/my_sys.h

@ -1121,8 +1121,8 @@ extern my_bool init_compiled_charsets(myf flags);
extern void add_compiled_collation(struct charset_info_st *cs);
extern void add_compiled_extra_collation(struct charset_info_st *cs);
extern my_bool add_alias_for_collation(LEX_CSTRING *collation_name,
LEX_CSTRING *alias,
uint alias_id);
uint collation_id,
LEX_CSTRING *alias, uint alias_id);
extern size_t escape_string_for_mysql(CHARSET_INFO *charset_info,
char *to, size_t to_length,
const char *from, size_t length,

14
mysys/charset.c

@ -646,8 +646,8 @@ void add_compiled_extra_collation(struct charset_info_st *cs)
corresponding utf8mb4_1400 collation
*/
my_bool add_alias_for_collation(LEX_CSTRING *collation_name, LEX_CSTRING *alias,
uint alias_id)
my_bool add_alias_for_collation(LEX_CSTRING *collation_name, uint org_id,
LEX_CSTRING *alias, uint alias_id)
{
char *coll_name, *comment;
struct charset_info_st *new_ci;
@ -655,12 +655,18 @@ my_bool add_alias_for_collation(LEX_CSTRING *collation_name, LEX_CSTRING *alias,
MY_CHARSET_LOADER loader;
char comment_buff[64+15];
size_t comment_length;
uint org_id= get_collation_number_internal(collation_name->str);
DBUG_ASSERT(org_id);
DBUG_ASSERT(all_charsets[org_id]);
if (!(org= all_charsets[org_id]))
return 1;
DBUG_ASSERT(!my_strcasecmp(&my_charset_latin1, org->coll_name.str,
collation_name->str));
#ifdef DEBUG_PRINT_ALIAS
fprintf(stderr, "alias: %s collation: %s org_id: %u\n",
alias->str, collation_name->str, org_id);
#endif
/*
We have to init the character set to ensure it is not changed after we copy
it.

125
strings/ctype-uca.c

@ -39567,6 +39567,8 @@ LEX_CSTRING my_ci_get_collation_name_uca(CHARSET_INFO *cs,
/*
Add support for MySQL 8.0 utf8mb4_0900_.. collations
The collation id's where collected from fprintf() in add_alias_for_collation()
*/
#define mysql_0900_collation_start 255
@ -39574,74 +39576,78 @@ LEX_CSTRING my_ci_get_collation_name_uca(CHARSET_INFO *cs,
struct mysql_0900_to_mariadb_1400_mapping
{
const char *mysql_col_name, *mariadb_col_name, *case_sensitivity;
uint collation_id;
};
struct mysql_0900_to_mariadb_1400_mapping mysql_0900_mapping[]=
{
/* 255 Ascent insensitive, Case insensitive 'ai_ci' */
{"", "", "ai_ci"},
{"de_pb", "german2", "ai_ci"},
{"is", "icelandic", "ai_ci"},
{"lv", "latvian", "ai_ci"},
{"ro", "romanian", "ai_ci"},
{"sl", "slovenian", "ai_ci"},
{"pl", "polish", "ai_ci"},
{"et", "estonian", "ai_ci"},
{"es", "spanish", "ai_ci"},
{"sv", "swedish", "ai_ci"},
{"tr", "turkish", "ai_ci"},
{"cs", "czech", "ai_ci"},
{"da", "danish", "ai_ci"},
{"lt", "lithuanian", "ai_ci"},
{"sk", "slovak", "ai_ci"},
{"es_trad", "spanish2", "ai_ci"},
{"la", "roman", "ai_ci"},
{"fa", NullS, "ai_ci"}, // Disabled in MySQL
{"eo", "esperanto", "ai_ci"},
{"hu", "hungarian", "ai_ci"},
{"hr", "croatian", "ai_ci"},
{"si", NullS, "ai_ci"}, // Disabled in MySQL
{"vi", "vietnamese", "ai_ci"},
{"", "", "ai_ci", 2308},
{"de_pb", "german2", "ai_ci", 2468},
{"is", "icelandic", "ai_ci", 2316},
{"lv", "latvian", "ai_ci", 2324},
{"ro", "romanian", "ai_ci", 2332},
{"sl", "slovenian", "ai_ci", 2340},
{"pl", "polish", "ai_ci", 2348},
{"et", "estonian", "ai_ci", 2356},
{"es", "spanish", "ai_ci", 2364},
{"sv", "swedish", "ai_ci", 2372},
{"tr", "turkish", "ai_ci", 2380},
{"cs", "czech", "ai_ci", 2388},
{"da", "danish", "ai_ci", 2396},
{"lt", "lithuanian", "ai_ci", 2404},
{"sk", "slovak", "ai_ci", 2412},
{"es_trad", "spanish2", "ai_ci", 2420},
{"la", "roman", "ai_ci", 2428},
{"fa", NullS, "ai_ci", 0}, // Disabled in MySQL
{"eo", "esperanto", "ai_ci", 2444},
{"hu", "hungarian", "ai_ci", 2452},
{"hr", "croatian", "ai_ci", 2500},
{"si", NullS, "ai_ci", 0}, // Disabled in MySQL
{"vi", "vietnamese", "ai_ci", 2492},
/* 278 Ascent sensitive, Case sensitive 'as_cs' */
{"","", "as_cs"},
{"de_pb", "german2", "as_cs"},
{"is", "icelandic", "as_cs"},
{"lv", "latvian", "as_cs"},
{"ro", "romanian", "as_cs"},
{"sl", "slovenian", "as_cs"},
{"pl", "polish", "as_cs"},
{"et", "estonian", "as_cs"},
{"es", "spanish", "as_cs"},
{"sv", "swedish", "as_cs"},
{"tr", "turkish", "as_cs"},
{"cs", "czech", "as_cs"},
{"da", "danish", "as_cs"},
{"lt", "lithuanian", "as_cs"},
{"sk", "slovak", "as_cs"},
{"es_trad", "spanish2", "as_cs"},
{"la", "roman", "as_cs"},
{"fa", NullS, "as_cs"}, // Disabled in MySQL
{"eo", "esperanto", "as_cs"},
{"hu", "hungarian", "as_cs"},
{"hr", "croatian", "as_cs"},
{"si", NullS, "as_cs"}, // Disabled in MySQL
{"vi", "vietnamese", "as_cs"},
{"", NullS, "as_cs"}, // Missing
{"", NullS, "as_cs"}, // Missing
{"_ja_0900_as_cs", NullS, "as_cs"}, // Not supported
{"_ja_0900_as_cs_ks", NullS, "as_cs"}, // Not supported
{"","", "as_cs", 2311},
{"de_pb", "german2", "as_cs", 2471},
{"is", "icelandic", "as_cs", 2319},
{"lv", "latvian", "as_cs", 2327},
{"ro", "romanian", "as_cs", 2335},
{"sl", "slovenian", "as_cs", 2343},
{"pl", "polish", "as_cs", 2351},
{"et", "estonian", "as_cs", 2359},
{"es", "spanish", "as_cs", 2367},
{"sv", "swedish", "as_cs", 2375},
{"tr", "turkish", "as_cs", 2383},
{"cs", "czech", "as_cs", 2391},
{"da", "danish", "as_cs", 2399},
{"lt", "lithuanian", "as_cs", 2407},
{"sk", "slovak", "as_cs", 2415},
{"es_trad", "spanish2", "as_cs", 2423},
{"la", "roman", "as_cs", 2431},
{"fa", NullS, "as_cs", 0}, // Disabled in MySQL
{"eo", "esperanto", "as_cs", 2447},
{"hu", "hungarian", "as_cs", 2455},
{"hr", "croatian", "as_cs", 2503},
{"si", NullS, "as_cs", 0}, // Disabled in MySQL
{"vi", "vietnamese", "as_cs", 2495},
{"", NullS, "as_cs", 0}, // Missing
{"", NullS, "as_cs", 0}, // Missing
{"_ja_0900_as_cs", NullS, "as_cs", 0}, // Not supported
{"_ja_0900_as_cs_ks", NullS, "as_cs", 0}, // Not supported
/* 305 Ascent-sensitive, Case insensitive 'as_ci' */
{"","", "as_ci"},
{"ru", NullS, "ai_ci"}, // Not supported
{"ru", NullS, "as_cs"}, // Not supported
{"zh", NullS, "as_cs"}, // Not supported
{NullS, NullS, ""}
{"","", "as_ci", 2310},
{"ru", NullS, "ai_ci", 0}, // Not supported
{"ru", NullS, "as_cs", 0}, // Not supported
{"zh", NullS, "as_cs", 0}, // Not supported
{NullS, NullS, "", 0}
};
static LEX_CSTRING mysql_utf8_bin= { STRING_WITH_LEN("utf8mb4_0900_bin") };
static LEX_CSTRING mariadb_utf8_bin= { STRING_WITH_LEN("utf8mb4_bin") };
/*
Map mysql character sets to MariaDB using the same definition but with
with the MySQL collation name and id.
@ -39651,8 +39657,6 @@ my_bool mysql_utf8mb4_0900_collation_definitions_add()
{
uint id= mysql_0900_collation_start;
struct mysql_0900_to_mariadb_1400_mapping *map;
LEX_CSTRING mysql_utf8_bin= { STRING_WITH_LEN("utf8mb4_0900_bin") };
LEX_CSTRING mariadb_utf8_bin= { STRING_WITH_LEN("utf8mb4_bin") };
for (map= mysql_0900_mapping; map->mysql_col_name ; map++, id++)
{
@ -39680,12 +39684,13 @@ my_bool mysql_utf8mb4_0900_collation_definitions_add()
alias_name.str= alias;
alias_name.length= ali_length;
if (add_alias_for_collation(&org_name, &alias_name, id))
if (add_alias_for_collation(&org_name, map->collation_id, &alias_name,
id))
return 1;
}
}
if (add_alias_for_collation(&mariadb_utf8_bin, &mysql_utf8_bin, 309))
if (add_alias_for_collation(&mariadb_utf8_bin, 46, &mysql_utf8_bin, 309))
return 1;
return 0;
}

Loading…
Cancel
Save