MDEV-19239 ERROR 1300 (HY000): Invalid utf8 character string in 10.3.13-MariaDB
A sequence of <digits>e<mbhead><mbtail>, e.g.: SELECT 123eXYzzz FROM t1; was not scanned correctly (where XY is a multi-byte character). The multi-byte head byte X was appended to 123e separately from the multi-byte tail byte Y, so a pointer to "Yzzz" was passed into scan_ident_start(), which failed on a bad multi-byte sequence. After this change, scan_ident_start() gets a pointer to "XYzzz", so it correctly sees the whole multi-byte character.
This commit is contained in:
parent
f4019f5b35
commit
765ae6e821
@ -11300,5 +11300,73 @@ t1 CREATE TABLE `t1` (
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET sql_mode=DEFAULT;
|
SET sql_mode=DEFAULT;
|
||||||
#
|
#
|
||||||
|
# MDEV-19239 ERROR 1300 (HY000): Invalid utf8 character string in 10.3.13-MariaDB
|
||||||
|
#
|
||||||
|
SET NAMES utf8;
|
||||||
|
SELECT
|
||||||
|
x.消息ID,
|
||||||
|
x.消息TITLE,
|
||||||
|
x.消息类型,
|
||||||
|
x.发送时间,
|
||||||
|
x.阅读时间,x.老师ID,
|
||||||
|
IF(x.四天内最近一次登录时间='2100-01-01 00:00:00','',x.四天内最近一次登录时间) 四天内最近一次登录时间
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
msg.*,
|
||||||
|
CASE
|
||||||
|
WHEN login.login_time BETWEEN msg.发送时间 AND DATE_ADD(msg.发送时间,INTERVAL 4 DAY)
|
||||||
|
THEN login.login_time
|
||||||
|
WHEN (login.login_time NOT BETWEEN msg.发送时间 AND DATE_ADD(msg.发送时间,INTERVAL 4 DAY)) AND login.login_time>0
|
||||||
|
THEN '2100-01-01 00:00:00' ELSE ''
|
||||||
|
END 四天内最近一次登录时间
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
me.id 消息ID,
|
||||||
|
me.title 消息TITLE,
|
||||||
|
CASE
|
||||||
|
WHEN me.type=1
|
||||||
|
THEN 'Interview Message'
|
||||||
|
WHEN me.type=2
|
||||||
|
THEN 'Orientation Message'
|
||||||
|
WHEN me.type=3
|
||||||
|
THEN 'Warning Message'
|
||||||
|
WHEN me.type=4
|
||||||
|
THEN 'Fail Message'
|
||||||
|
WHEN me.type=5
|
||||||
|
THEN 'FM Message'
|
||||||
|
WHEN me.type=6
|
||||||
|
THEN 'Training Message'
|
||||||
|
WHEN me.type=7
|
||||||
|
THEN 'TUrgent Message'
|
||||||
|
END 消息类型,
|
||||||
|
FROM_UNIXTIME(me.sending_time) 发送时间,
|
||||||
|
IF(tar.is_read=1,FROM_UNIXTIME(tar.read_time),'') 阅读时间,
|
||||||
|
tar.tid 老师ID
|
||||||
|
FROM ebk_message me
|
||||||
|
LEFT JOIN ebk_message_target tar
|
||||||
|
ON me.id=tar.msg_id
|
||||||
|
WHERE
|
||||||
|
FROM_UNIXTIME(me.sending_time,'%Y-%m-%d') BETWEEN 'start' AND 'end' AND me.status=1 AND tar.tid>0
|
||||||
|
GROUP BY
|
||||||
|
tar.tid,
|
||||||
|
me.sending_time,me.id) msg
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT tid,FROM_UNIXTIME(login_time) login_time
|
||||||
|
FROM ebk_teacher_login_log
|
||||||
|
WHERE FROM_UNIXTIME(login_time,'%Y-%m-%d') BETWEEN 'start' AND DATE_ADD('end',INTERVAL 4 DAY)
|
||||||
|
ORDER BY tid,FROM_UNIXTIME(login_time)) login
|
||||||
|
ON
|
||||||
|
msg.老师ID=login.tid
|
||||||
|
ORDER BY msg.消息ID,msg.发送时间,msg.老师ID,login_time) x
|
||||||
|
GROUP BY x.消息ID,x.发送时间,x.老师ID;
|
||||||
|
ERROR 42S02: Table 'test.ebk_message' doesn't exist
|
||||||
|
SET NAMES utf8;
|
||||||
|
CREATE TABLE t1 (x INT);
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
SELECT x AS 5天内最近一次登录时间 FROM t1;
|
||||||
|
5天内最近一次登录时间
|
||||||
|
1
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
# End of 10.3 tests
|
# End of 10.3 tests
|
||||||
#
|
#
|
||||||
|
@ -2180,6 +2180,81 @@ DROP TABLE t1;
|
|||||||
SET sql_mode=DEFAULT;
|
SET sql_mode=DEFAULT;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-19239 ERROR 1300 (HY000): Invalid utf8 character string in 10.3.13-MariaDB
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test that the following query does not fail on "Invalid utf8 character string"
|
||||||
|
#
|
||||||
|
|
||||||
|
SET NAMES utf8;
|
||||||
|
--error ER_NO_SUCH_TABLE
|
||||||
|
SELECT
|
||||||
|
x.消息ID,
|
||||||
|
x.消息TITLE,
|
||||||
|
x.消息类型,
|
||||||
|
x.发送时间,
|
||||||
|
x.阅读时间,x.老师ID,
|
||||||
|
IF(x.四天内最近一次登录时间='2100-01-01 00:00:00','',x.四天内最近一次登录时间) 四天内最近一次登录时间
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
msg.*,
|
||||||
|
CASE
|
||||||
|
WHEN login.login_time BETWEEN msg.发送时间 AND DATE_ADD(msg.发送时间,INTERVAL 4 DAY)
|
||||||
|
THEN login.login_time
|
||||||
|
WHEN (login.login_time NOT BETWEEN msg.发送时间 AND DATE_ADD(msg.发送时间,INTERVAL 4 DAY)) AND login.login_time>0
|
||||||
|
THEN '2100-01-01 00:00:00' ELSE ''
|
||||||
|
END 四天内最近一次登录时间
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
me.id 消息ID,
|
||||||
|
me.title 消息TITLE,
|
||||||
|
CASE
|
||||||
|
WHEN me.type=1
|
||||||
|
THEN 'Interview Message'
|
||||||
|
WHEN me.type=2
|
||||||
|
THEN 'Orientation Message'
|
||||||
|
WHEN me.type=3
|
||||||
|
THEN 'Warning Message'
|
||||||
|
WHEN me.type=4
|
||||||
|
THEN 'Fail Message'
|
||||||
|
WHEN me.type=5
|
||||||
|
THEN 'FM Message'
|
||||||
|
WHEN me.type=6
|
||||||
|
THEN 'Training Message'
|
||||||
|
WHEN me.type=7
|
||||||
|
THEN 'TUrgent Message'
|
||||||
|
END 消息类型,
|
||||||
|
FROM_UNIXTIME(me.sending_time) 发送时间,
|
||||||
|
IF(tar.is_read=1,FROM_UNIXTIME(tar.read_time),'') 阅读时间,
|
||||||
|
tar.tid 老师ID
|
||||||
|
FROM ebk_message me
|
||||||
|
LEFT JOIN ebk_message_target tar
|
||||||
|
ON me.id=tar.msg_id
|
||||||
|
WHERE
|
||||||
|
FROM_UNIXTIME(me.sending_time,'%Y-%m-%d') BETWEEN 'start' AND 'end' AND me.status=1 AND tar.tid>0
|
||||||
|
GROUP BY
|
||||||
|
tar.tid,
|
||||||
|
me.sending_time,me.id) msg
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT tid,FROM_UNIXTIME(login_time) login_time
|
||||||
|
FROM ebk_teacher_login_log
|
||||||
|
WHERE FROM_UNIXTIME(login_time,'%Y-%m-%d') BETWEEN 'start' AND DATE_ADD('end',INTERVAL 4 DAY)
|
||||||
|
ORDER BY tid,FROM_UNIXTIME(login_time)) login
|
||||||
|
ON
|
||||||
|
msg.老师ID=login.tid
|
||||||
|
ORDER BY msg.消息ID,msg.发送时间,msg.老师ID,login_time) x
|
||||||
|
GROUP BY x.消息ID,x.发送时间,x.老师ID;
|
||||||
|
|
||||||
|
|
||||||
|
SET NAMES utf8;
|
||||||
|
CREATE TABLE t1 (x INT);
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
SELECT x AS 5天内最近一次登录时间 FROM t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.3 tests
|
--echo # End of 10.3 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -1587,9 +1587,27 @@ int Lex_input_stream::lex_one_token(YYSTYPE *yylval, THD *thd)
|
|||||||
return(FLOAT_NUM);
|
return(FLOAT_NUM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
We've found:
|
||||||
|
- A sequence of digits
|
||||||
|
- Followed by 'e' or 'E'
|
||||||
|
- Followed by some byte XX which is not a known mantissa start,
|
||||||
|
and it's known to be a valid identifier part.
|
||||||
|
XX can be either a 8bit identifier character, or a multi-byte head.
|
||||||
|
*/
|
||||||
yyUnget();
|
yyUnget();
|
||||||
|
return scan_ident_start(thd, &yylval->ident_cli);
|
||||||
}
|
}
|
||||||
// fall through
|
/*
|
||||||
|
We've found:
|
||||||
|
- A sequence of digits
|
||||||
|
- Followed by some character XX, which is neither 'e' nor 'E',
|
||||||
|
and it's known to be a valid identifier part.
|
||||||
|
XX can be a 8bit identifier character, or a multi-byte head.
|
||||||
|
*/
|
||||||
|
yyUnget();
|
||||||
|
return scan_ident_start(thd, &yylval->ident_cli);
|
||||||
|
|
||||||
case MY_LEX_IDENT_START: // We come here after '.'
|
case MY_LEX_IDENT_START: // We come here after '.'
|
||||||
return scan_ident_start(thd, &yylval->ident_cli);
|
return scan_ident_start(thd, &yylval->ident_cli);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user