fix handling invalid character in identifier

This commit is contained in:
wjhh2008
2023-09-22 03:10:14 +00:00
committed by ob-robot
parent e4e09ecfb6
commit c13243ff23
54 changed files with 229 additions and 146 deletions

View File

@ -26,11 +26,11 @@ using namespace oceanbase::common;
ObParser::ObParser(common::ObIAllocator &allocator,
ObSQLMode mode,
ObCollationType conn_collation,
ObCharsets4Parser charsets4parser,
QuestionMarkDefNameCtx *ctx)
:allocator_(&allocator),
sql_mode_(mode),
connection_collation_(conn_collation),
charsets4parser_(charsets4parser),
def_name_ctx_(ctx)
{}
@ -1026,8 +1026,8 @@ int ObParser::parse(const ObString &query,
parse_result.is_dbms_sql_ = (DBMS_SQL_MODE == parse_mode);
parse_result.is_for_udr_ = (UDR_SQL_MODE == parse_mode);
parse_result.is_batched_multi_enabled_split_ = is_batched_multi_stmt_split_on;
parse_result.is_not_utf8_connection_ = ObCharset::is_valid_collation(connection_collation_) ?
(ObCharset::charset_type_by_coll(connection_collation_) != CHARSET_UTF8MB4) : false;
parse_result.is_not_utf8_connection_ = ObCharset::is_valid_collation(charsets4parser_.string_collation_) ?
(ObCharset::charset_type_by_coll(charsets4parser_.string_collation_) != CHARSET_UTF8MB4) : false;
parse_result.malloc_pool_ = allocator_;
if (lib::is_oracle_mode()) {
parse_result.sql_mode_ = sql_mode_ | SMO_ORACLE;
@ -1038,8 +1038,10 @@ int ObParser::parse(const ObString &query,
|| FP_PARAMERIZE_AND_FILTER_HINT_MODE == parse_mode);
parse_result.minus_ctx_.pos_ = -1;
parse_result.minus_ctx_.raw_sql_offset_ = -1;
parse_result.charset_info_ = ObCharset::get_charset(connection_collation_);
parse_result.connection_collation_ = connection_collation_;
parse_result.charset_info_ = ObCharset::get_charset(charsets4parser_.string_collation_);
parse_result.charset_info_oracle_db_ = ObCharset::is_valid_collation(charsets4parser_.nls_collation_) ?
ObCharset::get_charset(charsets4parser_.nls_collation_) : NULL;
parse_result.connection_collation_ = charsets4parser_.string_collation_;
parse_result.mysql_compatible_comment_ = false;
parse_result.enable_compatible_comment_ = true;
if (nullptr != def_name_ctx_) {
@ -1086,10 +1088,10 @@ int ObParser::parse(const ObString &query,
if (OB_SUCC(ret) && OB_ISNULL(parse_result.charset_info_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("charset info is null", K(ret),
"connection charset", ObCharset::charset_name(connection_collation_));
"connection charset", ObCharset::charset_name(charsets4parser_.string_collation_));
} else {
LOG_DEBUG("check parse_result param",
"connection charset", ObCharset::charset_name(connection_collation_));
"connection charset", ObCharset::charset_name(charsets4parser_.string_collation_));
}
if (OB_SUCC(ret)) {
bool is_create_func = false;
@ -1122,7 +1124,7 @@ int ObParser::parse(const ObString &query,
}
}
} else {
ObPLParser pl_parser(*(ObIAllocator*)(parse_result.malloc_pool_), connection_collation_, sql_mode_);
ObPLParser pl_parser(*(ObIAllocator*)(parse_result.malloc_pool_), charsets4parser_, sql_mode_);
if (OB_FAIL(pl_parser.parse(stmt, stmt, parse_result, is_pl_inner_parse))) {
LOG_WARN("failed to parse stmt as pl", K(stmt), K(ret));
// may create ddl func, try it.