fix bug:连续多行的单行注释报错 bug #783 (#789)

* test

* fix multi comment with ';'

* fix multi comment with ';'

Author:    akaError <lzg020616@163.com>
This commit is contained in:
akaError
2022-03-02 14:52:25 +08:00
committed by GitHub
parent ea63e7942b
commit 9324f96e5f

View File

@ -76,13 +76,11 @@ int ObParser::split_multiple_stmt(
int64_t remain = stmt.length(); int64_t remain = stmt.length();
parse_stat.reset(); parse_stat.reset();
while (remain > 0 && ISSPACE(stmt[remain - 1])) { while (remain > 0 && (ISSPACE(stmt[remain - 1]) || '\0' == stmt[remain - 1])) {
--remain; --remain;
} }
if (remain > 0 && '\0' == stmt[remain - 1]) { // case like: "select * from t1;;;;;;"->"select * from t1;"
--remain; while (remain > 1 && ';' == stmt[remain - 1] && ';' == stmt[remain - 2]) {
}
while (remain > 0 && ISSPACE(stmt[remain - 1])) {
--remain; --remain;
} }
@ -100,7 +98,21 @@ int ObParser::split_multiple_stmt(
allocator_ = &allocator; allocator_ = &allocator;
int64_t str_len = 0; int64_t str_len = 0;
// for save memory allocate in parser, we need try find the single stmt length in advance // for save memory allocate in parser, we need try find the single stmt length in advance
while (stmt[str_len + offset] != ';' && str_len < remain) { while (str_len < remain) {
if (';' == stmt[str_len + offset]) {
break;
} else if ('#' == stmt[str_len + offset]) {
while (str_len + 1 < remain && '\n' != stmt[str_len + offset + 1]) {
++str_len;
}
} else if ('-' == stmt[str_len + offset]) {
if (str_len + 1 < remain && '-' == stmt[str_len + offset + 1]) {
++str_len;
while (str_len + 1 < remain && '\n' != stmt[str_len + offset + 1]) {
++str_len;
}
}
}
++str_len; ++str_len;
} }
str_len = str_len == remain ? str_len : str_len + 1; str_len = str_len == remain ? str_len : str_len + 1;
@ -108,8 +120,6 @@ int ObParser::split_multiple_stmt(
ObString remain_part(remain, stmt.ptr() + offset); ObString remain_part(remain, stmt.ptr() + offset);
// first try parse part str, because it's have less length and need less memory // first try parse part str, because it's have less length and need less memory
if (OB_FAIL(tmp_ret = parse(part, parse_result, parse_mode, false, true))) { if (OB_FAIL(tmp_ret = parse(part, parse_result, parse_mode, false, true))) {
//if parser part str failed, then try parse all remain part, avoid parse many times:
//bug: https://work.aone.alibaba-inc.com/issue/34642901
tmp_ret = OB_SUCCESS; tmp_ret = OB_SUCCESS;
tmp_ret = parse(remain_part, parse_result, parse_mode); tmp_ret = parse(remain_part, parse_result, parse_mode);
} }
@ -126,8 +136,7 @@ int ObParser::split_multiple_stmt(
remain -= parse_result.end_col_; remain -= parse_result.end_col_;
offset += parse_result.end_col_; offset += parse_result.end_col_;
if (remain < 0 || offset > stmt.length()) { if (remain < 0 || offset > stmt.length()) {
LOG_ERROR("split_multiple_stmt data error", LOG_ERROR("split_multiple_stmt data error", K(remain), K(offset), K(stmt.length()), K(ret));
K(remain), K(offset), K(stmt.length()), K(ret));
} }
} else { } else {
ObString query(static_cast<int32_t>(remain), stmt.ptr() + offset); ObString query(static_cast<int32_t>(remain), stmt.ptr() + offset);
@ -207,9 +216,8 @@ int ObParser::parse_sql(const ObString& stmt, ParseResult& parse_result, const b
return ret; return ret;
} }
int ObParser::parse( int ObParser::parse(const ObString &query, ParseResult &parse_result, ParseMode parse_mode,
const ObString& query, ParseResult& parse_result, ParseMode parse_mode, const bool is_batched_multi_stmt_split_on, const bool is_batched_multi_stmt_split_on, const bool no_throw_parser_error)
const bool no_throw_parser_error)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;