upstream link:
<a href="http://bazaar.launchpad.net/~mysql/mysql-server/5.5/revision/3840">http://bazaar.launchpad.net/~mysql/mysql-server/5.5/revision/3840</a>
test case:
select space(date_add(101, interval (cast(char(‘1′ using utf16) as char(1)))hour_second))
隻影響5.5
根據crash的backtrace
program received signal sigsegv, segmentation fault.
[switching to thread 0x7ffff4643700 (lwp 5874)]
0x0000000000706602 in get_interval_value (args=0x7fff84004e98, int_type=interval_hour_second, str_value=<value optimized out>, interval=0x7ffff4640c40)
at /u01/project/ps5518/trunk/percona-server-5.5.18/sql/item_timefunc.cc:1460
1460 while (str != end && my_isspace(cs,*str))
在my_isspace(cs,*str)這裡crash,my_isspace是一個宏:
#define my_isspace(s, c) (((s)->ctype+1)[(uchar) (c)] & _my_spc)
而對于utf16(my_charset_utf16_general_ci)或者utf32(my_charset_utf32_general_ci)類型的字元集,ctype為null(ctype-ucs2.c)
是以這裡直接導緻段錯誤。
<a href="http://bazaar.launchpad.net/~mysql/mysql-server/5.5/revision/3840">官方patch</a>
solution: convert input to ascii before parsing,
and use the character set of the returned ascii string.
.