Bug#32430: 'show innodb status' causes errors
Invalid (old?) table or database name in logs Post push patch. Bug was that a non partitioned table file was not converted to system_charset, (due to table_name_len was not set). Also missing DBUG_RETURN. And Innodb adds quotes after calling the function, so I added one more mode where explain_filename does not add quotes. But it still appends the [sub]partition name as a comment. Also caught a minor quoting bug, the character '`' was not quoted in the identifier. (so 'a`b' was quoted as `a`b` and not `a``b`, this is mulitbyte characters aware.) sql/mysql_priv.h: Bug#32430: 'show innodb status' causes errors Invalid (old?) table or database name in logs Added an unquoted mode sql/share/errmsg.txt: Bug#32430: 'show innodb status' causes errors Invalid (old?) table or database name in logs Removed the quoting of identifier, only leaving the translated word. sql/sql_table.cc: Bug#32430: 'show innodb status' causes errors Invalid (old?) table or database name in logs Fixed quoting of '`' Added DBUG_RETURN. Corrected table_name_len. Added unquoted mode.
This commit is contained in:
parent
466847a0b8
commit
f42fab1b76
@ -2261,7 +2261,8 @@ enum enum_explain_filename_mode
|
|||||||
{
|
{
|
||||||
EXPLAIN_ALL_VERBOSE= 0,
|
EXPLAIN_ALL_VERBOSE= 0,
|
||||||
EXPLAIN_PARTITIONS_VERBOSE,
|
EXPLAIN_PARTITIONS_VERBOSE,
|
||||||
EXPLAIN_PARTITIONS_AS_COMMENT
|
EXPLAIN_PARTITIONS_AS_COMMENT,
|
||||||
|
EXPLAIN_PARTITIONS_AS_COMMENT_NO_QUOTING
|
||||||
};
|
};
|
||||||
uint explain_filename(const char *from, char *to, uint to_length,
|
uint explain_filename(const char *from, char *to, uint to_length,
|
||||||
enum_explain_filename_mode explain_mode);
|
enum_explain_filename_mode explain_mode);
|
||||||
|
@ -6184,17 +6184,17 @@ ER_FUNC_INEXISTENT_NAME_COLLISION 42000
|
|||||||
# When updating these, please update EXPLAIN_FILENAME_MAX_EXTRA_LENGTH in
|
# When updating these, please update EXPLAIN_FILENAME_MAX_EXTRA_LENGTH in
|
||||||
# mysql_priv.h with the new maximal additional length for explain_filename.
|
# mysql_priv.h with the new maximal additional length for explain_filename.
|
||||||
ER_DATABASE_NAME
|
ER_DATABASE_NAME
|
||||||
eng "Database `%s`"
|
eng "Database"
|
||||||
swe "Databas `%s`"
|
swe "Databas"
|
||||||
ER_TABLE_NAME
|
ER_TABLE_NAME
|
||||||
eng "Table `%s`"
|
eng "Table"
|
||||||
swe "Tabell `%s`"
|
swe "Tabell"
|
||||||
ER_PARTITION_NAME
|
ER_PARTITION_NAME
|
||||||
eng "Partition `%s`"
|
eng "Partition"
|
||||||
swe "Partition `%s`"
|
swe "Partition"
|
||||||
ER_SUBPARTITION_NAME
|
ER_SUBPARTITION_NAME
|
||||||
eng "Subpartition `%s`"
|
eng "Subpartition"
|
||||||
swe "Subpartition `%s`"
|
swe "Subpartition"
|
||||||
ER_TEMPORARY_NAME
|
ER_TEMPORARY_NAME
|
||||||
eng "Temporary"
|
eng "Temporary"
|
||||||
swe "Temporär"
|
swe "Temporär"
|
||||||
|
@ -72,7 +72,7 @@ static void wait_for_kill_signal(THD *thd)
|
|||||||
@brief Helper function for explain_filename
|
@brief Helper function for explain_filename
|
||||||
*/
|
*/
|
||||||
static char* add_identifier(char *to_p, const char * end_p,
|
static char* add_identifier(char *to_p, const char * end_p,
|
||||||
const char* name, uint name_len, int errcode)
|
const char* name, uint name_len, bool add_quotes)
|
||||||
{
|
{
|
||||||
uint res;
|
uint res;
|
||||||
uint errors;
|
uint errors;
|
||||||
@ -92,18 +92,44 @@ static char* add_identifier(char *to_p, const char * end_p,
|
|||||||
res= strconvert(&my_charset_filename, conv_name, system_charset_info,
|
res= strconvert(&my_charset_filename, conv_name, system_charset_info,
|
||||||
conv_string, FN_REFLEN, &errors);
|
conv_string, FN_REFLEN, &errors);
|
||||||
if (!res || errors)
|
if (!res || errors)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("error", ("strconvert of '%s' failed with %u (errors: %u)", conv_name, res, errors));
|
||||||
conv_name= name;
|
conv_name= name;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("conv '%s' -> '%s'", conv_name, conv_string));
|
DBUG_PRINT("info", ("conv '%s' -> '%s'", conv_name, conv_string));
|
||||||
conv_name= conv_string;
|
conv_name= conv_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (errcode)
|
if (add_quotes && (end_p - to_p > 2))
|
||||||
to_p+= my_snprintf(to_p, end_p - to_p, ER(errcode), conv_name);
|
{
|
||||||
|
*(to_p++)= '`';
|
||||||
|
while (*conv_name && (end_p - to_p - 1) > 0)
|
||||||
|
{
|
||||||
|
uint length= my_mbcharlen(system_charset_info, *conv_name);
|
||||||
|
if (!length)
|
||||||
|
length= 1;
|
||||||
|
if (length == 1 && *conv_name == '`')
|
||||||
|
{
|
||||||
|
if ((end_p - to_p) < 3)
|
||||||
|
break;
|
||||||
|
*(to_p++)= '`';
|
||||||
|
*(to_p++)= *(conv_name++);
|
||||||
|
}
|
||||||
|
else if (length < (end_p - to_p))
|
||||||
|
{
|
||||||
|
to_p= strnmov(to_p, conv_name, length);
|
||||||
|
conv_name+= length;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break; /* string already filled */
|
||||||
|
}
|
||||||
|
to_p= strnmov(to_p, "`", end_p - to_p);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
to_p+= my_snprintf(to_p, end_p - to_p, "`%s`", conv_name);
|
to_p= strnmov(to_p, conv_name, end_p - to_p);
|
||||||
return to_p;
|
DBUG_RETURN(to_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -135,6 +161,8 @@ static char* add_identifier(char *to_p, const char * end_p,
|
|||||||
[,[ Temporary| Renamed] Partition `p`
|
[,[ Temporary| Renamed] Partition `p`
|
||||||
[, Subpartition `sp`]] *|
|
[, Subpartition `sp`]] *|
|
||||||
(| is really a /, and it is all in one line)
|
(| is really a /, and it is all in one line)
|
||||||
|
EXPLAIN_PARTITIONS_AS_COMMENT_NO_QUOTING ->
|
||||||
|
same as above but no quotes are added.
|
||||||
|
|
||||||
@retval Length of returned string
|
@retval Length of returned string
|
||||||
*/
|
*/
|
||||||
@ -245,28 +273,39 @@ uint explain_filename(const char *from,
|
|||||||
part_name_len-= 5;
|
part_name_len-= 5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table_name_len= strlen(table_name);
|
||||||
if (db_name)
|
if (db_name)
|
||||||
{
|
{
|
||||||
if (explain_mode == EXPLAIN_ALL_VERBOSE)
|
if (explain_mode == EXPLAIN_ALL_VERBOSE)
|
||||||
{
|
{
|
||||||
to_p= add_identifier(to_p, end_p, db_name, db_name_len,
|
to_p= strnmov(to_p, ER(ER_DATABASE_NAME), end_p - to_p);
|
||||||
ER_DATABASE_NAME);
|
*(to_p++)= ' ';
|
||||||
|
to_p= add_identifier(to_p, end_p, db_name, db_name_len, 1);
|
||||||
to_p= strnmov(to_p, ", ", end_p - to_p);
|
to_p= strnmov(to_p, ", ", end_p - to_p);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
to_p= add_identifier(to_p, end_p, db_name, db_name_len, 0);
|
to_p= add_identifier(to_p, end_p, db_name, db_name_len,
|
||||||
|
(explain_mode !=
|
||||||
|
EXPLAIN_PARTITIONS_AS_COMMENT_NO_QUOTING));
|
||||||
to_p= strnmov(to_p, ".", end_p - to_p);
|
to_p= strnmov(to_p, ".", end_p - to_p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (explain_mode == EXPLAIN_ALL_VERBOSE)
|
if (explain_mode == EXPLAIN_ALL_VERBOSE)
|
||||||
to_p= add_identifier(to_p, end_p, table_name, table_name_len,
|
{
|
||||||
ER_TABLE_NAME);
|
to_p= strnmov(to_p, ER(ER_TABLE_NAME), end_p - to_p);
|
||||||
|
*(to_p++)= ' ';
|
||||||
|
to_p= add_identifier(to_p, end_p, table_name, table_name_len, 1);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
to_p= add_identifier(to_p, end_p, table_name, table_name_len, 0);
|
to_p= add_identifier(to_p, end_p, table_name, table_name_len,
|
||||||
|
(explain_mode !=
|
||||||
|
EXPLAIN_PARTITIONS_AS_COMMENT_NO_QUOTING));
|
||||||
if (part_name)
|
if (part_name)
|
||||||
{
|
{
|
||||||
if (explain_mode == EXPLAIN_PARTITIONS_AS_COMMENT)
|
if (explain_mode == EXPLAIN_PARTITIONS_AS_COMMENT ||
|
||||||
|
explain_mode == EXPLAIN_PARTITIONS_AS_COMMENT_NO_QUOTING)
|
||||||
to_p= strnmov(to_p, " /* ", end_p - to_p);
|
to_p= strnmov(to_p, " /* ", end_p - to_p);
|
||||||
else if (explain_mode == EXPLAIN_PARTITIONS_VERBOSE)
|
else if (explain_mode == EXPLAIN_PARTITIONS_VERBOSE)
|
||||||
to_p= strnmov(to_p, " ", end_p - to_p);
|
to_p= strnmov(to_p, " ", end_p - to_p);
|
||||||
@ -280,15 +319,22 @@ uint explain_filename(const char *from,
|
|||||||
to_p= strnmov(to_p, ER(ER_RENAMED_NAME), end_p - to_p);
|
to_p= strnmov(to_p, ER(ER_RENAMED_NAME), end_p - to_p);
|
||||||
to_p= strnmov(to_p, " ", end_p - to_p);
|
to_p= strnmov(to_p, " ", end_p - to_p);
|
||||||
}
|
}
|
||||||
|
to_p= strnmov(to_p, ER(ER_PARTITION_NAME), end_p - to_p);
|
||||||
|
*(to_p++)= ' ';
|
||||||
to_p= add_identifier(to_p, end_p, part_name, part_name_len,
|
to_p= add_identifier(to_p, end_p, part_name, part_name_len,
|
||||||
ER_PARTITION_NAME);
|
(explain_mode !=
|
||||||
|
EXPLAIN_PARTITIONS_AS_COMMENT_NO_QUOTING));
|
||||||
if (subpart_name)
|
if (subpart_name)
|
||||||
{
|
{
|
||||||
to_p= strnmov(to_p, ", ", end_p - to_p);
|
to_p= strnmov(to_p, ", ", end_p - to_p);
|
||||||
|
to_p= strnmov(to_p, ER(ER_SUBPARTITION_NAME), end_p - to_p);
|
||||||
|
*(to_p++)= ' ';
|
||||||
to_p= add_identifier(to_p, end_p, subpart_name, subpart_name_len,
|
to_p= add_identifier(to_p, end_p, subpart_name, subpart_name_len,
|
||||||
ER_SUBPARTITION_NAME);
|
(explain_mode !=
|
||||||
|
EXPLAIN_PARTITIONS_AS_COMMENT_NO_QUOTING));
|
||||||
}
|
}
|
||||||
if (explain_mode == EXPLAIN_PARTITIONS_AS_COMMENT)
|
if (explain_mode == EXPLAIN_PARTITIONS_AS_COMMENT ||
|
||||||
|
explain_mode == EXPLAIN_PARTITIONS_AS_COMMENT_NO_QUOTING)
|
||||||
to_p= strnmov(to_p, " */", end_p - to_p);
|
to_p= strnmov(to_p, " */", end_p - to_p);
|
||||||
}
|
}
|
||||||
DBUG_PRINT("exit", ("to '%s'", to));
|
DBUG_PRINT("exit", ("to '%s'", to));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user