| Bug #60199 | unnecessary string length computing for my_ismbchar() | ||
|---|---|---|---|
| Submitted: | 22 Feb 2011 8:50 | Modified: | 18 Jan 2018 13:17 |
| Reporter: | Guoliang Jin | Email Updates: | |
| Status: | Won't fix | Impact on me: | |
| Category: | MySQL Server: Charsets | Severity: | S5 (Performance) |
| Version: | 5.1.55, 5.1.62 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
[22 Feb 2011 8:50]
Guoliang Jin
[24 Feb 2011 2:28]
Guoliang Jin
I noticed support for 5.0 is stopped, so I update corresponding code in 5.1.55:
1. mysql-5.1.55/sql/item_func.cc:2690:
register uint32 n=0, l=my_ismbchar(res->charset(),str,str+res->length());
calling length()
2. mysql-5.1.55/sql/item_strfunc.cc:824:
if ((l= my_ismbchar(res->charset(),ptr,end)))
end calculated by calling length()
other uses of "end" can also be eliminated
3. mysql-5.1.55/sql/item_strfunc.cc:946:
if ((l=my_ismbchar(res->charset(), ptr,strend))) ptr+=l;
end calculated by calling length()
the other use of "strend" can also be eliminated since the use of "end" can also be eliminated
4. mysql-5.1.55/sql/table.cc:2741:
int len=my_ismbchar(system_charset_info, name, end);
"strend" is calculated by "char *strend=name+(uint) strlen(name);" and not used
elsewhere
5. mysql-5.1.55/client/mysql.cc:2096:
(length= my_ismbchar(charset_info, pos, end_of_line)))
"end_of_line" is calculated by "char *end_of_line=line+(uint) strlen(line);" and not used elsewhere
6. mysql-5.1.55/libmysql/libmysql.c:1649:
if (use_mb_flag && (l = my_ismbchar( mysql->charset, name , end ) ) )
"end" is calculated by "for (end=name; *end ; end++) ;" and not used elsewhere
[14 Mar 2011 4:37]
Guoliang Jin
The problem here is that my_ismbchar() does not require the actual length, so calling length() will waste time and it should use mbmaxlen instead.
[25 Mar 2012 12:03]
Valeriy Kravchuk
Thank you for the problem report. Verified by code review. Same code is still used in 5.1.62.
[18 Jan 2018 13:17]
Erlend Dahl
[11 Jan 2018 18:37] Xing Z Zhang Bytes passed in might be truncated. It is not safe to use just cs->mbmaxlen instead of actual string lenth.
