* test * fix multi comment with ';' * fix multi comment with ';' Author: akaError <lzg020616@163.com>
This commit is contained in:
@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user