Commit d7f5523e authored by Gleb Shchepa's avatar Gleb Shchepa

Bug #15948123: SERVER WORKS INCORRECT WITH LONG TABLE ALIASES

Code in MDL subsystem assumes that identifiers of objects can't
be longer than NAME_LEN characters. This assumption was broken
when one tried to construct MDL_key based on table alias, which
can have arbitrary length. Since MDL_key's (and MDL locks) are
not really used for table aliases this patch changes code to
not initialize MDL_key object for table list element representing
aliases.
parent 918d2354
...@@ -246,6 +246,8 @@ public: ...@@ -246,6 +246,8 @@ public:
} }
void mdl_key_init(const MDL_key *rhs) void mdl_key_init(const MDL_key *rhs)
{ {
DBUG_ASSERT(rhs->m_length <= NAME_LEN);
DBUG_ASSERT(rhs->m_db_name_length <= NAME_LEN);
memcpy(m_ptr, rhs->m_ptr, rhs->m_length); memcpy(m_ptr, rhs->m_ptr, rhs->m_length);
m_length= rhs->m_length; m_length= rhs->m_length;
m_db_name_length= rhs->m_db_name_length; m_db_name_length= rhs->m_db_name_length;
......
...@@ -6000,8 +6000,13 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd, ...@@ -6000,8 +6000,13 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
ptr->next_name_resolution_table= NULL; ptr->next_name_resolution_table= NULL;
/* Link table in global list (all used tables) */ /* Link table in global list (all used tables) */
lex->add_to_query_tables(ptr); lex->add_to_query_tables(ptr);
ptr->mdl_request.init(MDL_key::TABLE, ptr->db, ptr->table_name, mdl_type,
MDL_TRANSACTION); // Pure table aliases do not need to be locked:
if (!test(table_options & TL_OPTION_ALIAS))
{
ptr->mdl_request.init(MDL_key::TABLE, ptr->db, ptr->table_name, mdl_type,
MDL_TRANSACTION);
}
DBUG_RETURN(ptr); DBUG_RETURN(ptr);
} }
......
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