summaryrefslogtreecommitdiff
path: root/sql/sql_show.h
diff options
context:
space:
mode:
authorVenkatesh Duggirala <venkatesh.duggirala@oracle.com>2015-12-01 15:38:11 +0530
committerVenkatesh Duggirala <venkatesh.duggirala@oracle.com>2015-12-01 15:38:11 +0530
commit2735f0b92020c8ac4bd07d7ea843a0946b19e8ad (patch)
treef698248dc83ac973eec6eb91e6b3994b019b3fea /sql/sql_show.h
parent08e929388b2cea170f6a44e9c8669f9c0f636808 (diff)
downloadmariadb-git-2735f0b92020c8ac4bd07d7ea843a0946b19e8ad.tar.gz
Bug#21205695 DROP TABLE MAY CAUSE SLAVES TO BREAK
Problem: ======== 1) Drop table queries are re-generated by server before writing the events(queries) into binlog for various reasons. If table name/db name contains a non regular characters (like latin characters), the generated query is wrong. Hence it breaks the replication. 2) In the edge case, when table name/db name contains 64 characters, server is throwing an assert assert(M_TBLLEN < 128) 3) In the edge case, when db name contains 64 latin characters, binlog content is interpreted badly which is leading replication failure. Analysis & Fix : ================ 1) Parser reads the table name from the query and converts it to standard charset(utf8) and stores it in table_name variable. When drop table query is regenerated with the same table_name variable, it should be converted back to the original charset from standard charset(utf8). 2) Latin character takes two bytes for each character. Limit of the identifier is 64. SYSTEM_CHARSET_MBMAXLEN is set to '3'. So there is a possiblity that tablename/dbname contains 3 * 64. Hence assert is changed to (M_TBLLEN <= NAME_CHAR_LEN*SYSTEM_CHARSET_MBMAXLEN) 3) db_len in the binlog event header is taking 1 byte. db_len is ranged from 0 to 192 bytes (3 * 64). While reading the db_len from the event, server is casting to uint instead of uchar which is leading to bad db_len. This problem is fixed by changing the cast type to uchar.
Diffstat (limited to 'sql/sql_show.h')
-rw-r--r--sql/sql_show.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/sql/sql_show.h b/sql/sql_show.h
index 16bfc5cdb69..ad6494fd7d4 100644
--- a/sql/sql_show.h
+++ b/sql/sql_show.h
@@ -92,8 +92,14 @@ int view_store_create_info(THD *thd, TABLE_LIST *table, String *buff);
int copy_event_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table);
int get_quote_char_for_identifier(THD *thd, const char *name, uint length);
-void append_identifier(THD *thd, String *packet, const char *name,
- uint length);
+void append_identifier(THD *thd, String *packet, const char *name, uint length,
+ CHARSET_INFO *from_cs, CHARSET_INFO *to_cs);
+inline void append_identifier(THD *thd, String *packet, const char *name,
+ uint length)
+{
+ append_identifier(thd, packet, name, length, NULL, NULL);
+}
+
void mysqld_list_fields(THD *thd,TABLE_LIST *table, const char *wild);
int mysqld_dump_create_info(THD *thd, TABLE_LIST *table_list, int fd);
bool mysqld_show_create(THD *thd, TABLE_LIST *table_list);