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

@ -2981,9 +2981,10 @@ int ObCharset::charset_convert(ObIAllocator &alloc,
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid collation type", K(ret), K(src_cs_type), K(dst_cs_type));
} else {
if (0 == in.length()
|| charset_type_by_coll(src_cs_type) == charset_type_by_coll(dst_cs_type)
|| charset_type_by_coll(dst_cs_type) == CHARSET_BINARY) {
if ((0 == in.length()
|| charset_type_by_coll(src_cs_type) == charset_type_by_coll(dst_cs_type)
|| charset_type_by_coll(dst_cs_type) == CHARSET_BINARY)
&& !(convert_flag & REPLACE_UNKNOWN_CHARACTER_ON_SAME_CHARSET)) {
if (!(convert_flag & COPY_STRING_ON_SAME_CHARSET)) {
out = in;
} else {
@ -3029,9 +3030,14 @@ int ObCharset::charset_convert(ObIAllocator &alloc,
LOG_WARN("convert charset failed",
K(ret), K(in), K(src_cs_type), K(dst_cs_type),
KPHEX(in.ptr(), in.length()));
if (!!(convert_flag & REPLACE_UNKNOWN_CHARACTER)) {
if (!!(convert_flag & REPLACE_UNKNOWN_CHARACTER)
|| !!(convert_flag & REPLACE_UNKNOWN_CHARACTER_ON_SAME_CHARSET)) {
if (OB_NOT_NULL(action_flag)) {
*action_flag |= REPLACE_UNKNOWN_CHARACTER;
if (!!(convert_flag & REPLACE_UNKNOWN_CHARACTER)) {
*action_flag |= REPLACE_UNKNOWN_CHARACTER;
} else {
*action_flag |= REPLACE_UNKNOWN_CHARACTER_ON_SAME_CHARSET;
}
}
int32_t in_offset = 0;
int64_t res_buf_offset = 0;

View File

@ -520,6 +520,7 @@ public:
enum CONVERT_FLAG : int64_t {
COPY_STRING_ON_SAME_CHARSET = 1<<0,
REPLACE_UNKNOWN_CHARACTER = 1<<1,
REPLACE_UNKNOWN_CHARACTER_ON_SAME_CHARSET = 1<<2,
};
static int charset_convert(ObIAllocator &alloc,
const ObString &in,

View File

@ -268,7 +268,7 @@ int ObMPConnect::init_connect_process(ObString &init_sql,
int ret = OB_SUCCESS;
ObSEArray<ObString, 4> queries;
ObArenaAllocator allocator(ObModIds::OB_SQL_PARSER);
ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection());
ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser());
ObMPParseStat parse_stat;
if (OB_SUCC(parser.split_multiple_stmt(init_sql, queries, parse_stat))) {
if (OB_UNLIKELY(0 == queries.count())) {

View File

@ -219,7 +219,7 @@ int ObMPQuery::process()
bool force_sync_resp = false;
need_response_error = false;
ObParser parser(THIS_WORKER.get_sql_arena_allocator(),
session.get_sql_mode(), session.get_local_collation_connection());
session.get_sql_mode(), session.get_charsets4parser());
//为了性能优化考虑,减少数组长度,降低无用元素的构造和析构开销
ObSEArray<ObString, 1> queries;
ObSEArray<ObString, 1> ins_queries;

View File

@ -98,7 +98,7 @@ int ObMPStmtPrepare::multiple_query_check(ObSQLSessionInfo &session,
if (OB_UNLIKELY(1 == session.get_capability().cap_flags_.OB_CLIENT_MULTI_STATEMENTS)) {
ObSEArray<ObString, 1> queries;
ObParser parser(THIS_WORKER.get_allocator(),
session.get_sql_mode(), session.get_local_collation_connection());
session.get_sql_mode(), session.get_charsets4parser());
bool parse_fail = false;
ObMPParseStat parse_stat;
force_sync_resp = true;

View File

@ -355,7 +355,7 @@ int ObMySQLProcTable::extract_create_node_from_routine_info(ObIAllocator &alloc,
ParseResult parse_result;
ObString routine_stmt;
pl::ObPLParser parser(alloc, CS_TYPE_UTF8MB4_BIN, exec_env.get_sql_mode());
pl::ObPLParser parser(alloc, ObCharsets4Parser(), exec_env.get_sql_mode());
const ObString &routine_body = routine_info.get_routine_body();
const char prefix[] = "CREATE\n";
int64_t prefix_len = STRLEN(prefix);

View File

@ -902,7 +902,7 @@ int ObTableColumns::resolve_view_definition(
} else {
ParseResult parse_result;
ObParser parser(*allocator, session->get_sql_mode(),
session->get_local_collation_connection());
session->get_charsets4parser());
if (OB_FAIL(parser.parse(select_sql.string(), parse_result))) {
LOG_WARN("parse view definition failed", K(select_sql), K(ret));
} else {

View File

@ -1642,7 +1642,7 @@ int ObPL::parameter_anonymous_block(ObExecContext &ctx,
ObString pc_key;
ParseResult parse_result;
ObPLParser pl_parser(allocator,
ctx.get_my_session()->get_dtc_params().connection_collation_,
ctx.get_my_session()->get_charsets4parser(),
ctx.get_my_session()->get_sql_mode());
OZ (pl_parser.fast_parse(sql, parse_result));
if (OB_SUCC(ret)) {
@ -2353,7 +2353,7 @@ int ObPL::generate_pl_function(ObExecContext &ctx,
if (OB_SUCC(ret)) {
ObParser parser(ctx.get_allocator(),
ctx.get_my_session()->get_sql_mode(),
ctx.get_my_session()->get_local_collation_connection());
ctx.get_my_session()->get_charsets4parser());
ParseResult parse_result;
ParseMode parse_mode = ctx.get_sql_ctx()->is_dynamic_sql_ ? DYNAMIC_SQL_MODE
: (ctx.get_my_session()->is_for_trigger_package() ? TRIGGER_MODE : STD_MODE);

View File

@ -418,7 +418,7 @@ int ObPLCompiler::compile(const uint64_t id, ObPLFunction &func)
if (OB_SUCC(ret)) {
ObString body = proc->get_routine_body(); //获取body字符串
ObDataTypeCastParams dtc_params = session_info_.get_dtc_params();
ObPLParser parser(allocator_, dtc_params.connection_collation_, session_info_.get_sql_mode());
ObPLParser parser(allocator_, session_info_.get_charsets4parser(), session_info_.get_sql_mode());
if (OB_FAIL(ObSQLUtils::convert_sql_text_from_schema_for_resolve(
allocator_, dtc_params, body))) {
LOG_WARN("fail to do charset convert", K(ret), K(body));
@ -652,7 +652,7 @@ int ObPLCompiler::analyze_package(const ObString &source,
CK (!source.empty());
CK (package_ast.is_inited());
if (OB_SUCC(ret)) {
ObPLParser parser(allocator_, session_info_.get_local_collation_connection(), session_info_.get_sql_mode());
ObPLParser parser(allocator_, session_info_.get_charsets4parser(), session_info_.get_sql_mode());
ObStmtNodeTree *parse_tree = NULL;
CHECK_COMPATIBILITY_MODE(&session_info_);
ObPLResolver resolver(allocator_,

View File

@ -172,7 +172,7 @@ int ObPLResolver::init_default_expr(ObPLFunctionAST &func_ast,
resolve_ctx_.allocator_, resolve_ctx_.session_info_.get_dtc_params(), default_value));
OZ (ObRawExprUtils::parse_default_expr_from_str(
default_value,
resolve_ctx_.session_info_.get_local_collation_connection(),
resolve_ctx_.session_info_.get_charsets4parser(),
resolve_ctx_.allocator_,
default_node));
CK (OB_NOT_NULL(default_node));
@ -2463,7 +2463,7 @@ int ObPLResolver::build_record_type_by_view_schema(const ObPLResolveCtx &ctx,
ObSqlString select_sql;
ParseResult parse_result;
ObParser parser(alloc, ctx.session_info_.get_sql_mode(),
ctx.session_info_.get_local_collation_connection());
ctx.session_info_.get_charsets4parser());
ObSchemaChecker schema_checker;
ObResolverParams resolver_ctx;
ParseNode *select_stmt_node = NULL;
@ -8745,7 +8745,7 @@ int ObPLResolver::resolve_condition_compile(
ObString old_sql;
ObString new_sql;
ObPLParser pl_parser(
resolve_ctx_.allocator_, resolve_ctx_.session_info_.get_local_collation_connection(),
resolve_ctx_.allocator_, resolve_ctx_.session_info_.get_charsets4parser(),
resolve_ctx_.session_info_.get_sql_mode());
ParseResult parse_result;
@ -12360,7 +12360,7 @@ int ObPLResolver::resolve_package_accessible_by(
{
int ret = OB_SUCCESS;
ObArenaAllocator allocator;
ObPLParser parser(allocator, CS_TYPE_UTF8MB4_BIN, resolve_ctx_.session_info_.get_sql_mode());
ObPLParser parser(allocator, ObCharsets4Parser(), resolve_ctx_.session_info_.get_sql_mode());
ObStmtNodeTree *parse_tree = NULL;
const ObStmtNodeTree *package_node = NULL;
const ObStmtNodeTree *clause_node = NULL;
@ -12406,7 +12406,7 @@ int ObPLResolver::resolve_routine_accessible_by(
{
int ret = OB_SUCCESS;
ObArenaAllocator allocator;
ObPLParser parser(allocator, CS_TYPE_UTF8MB4_BIN, resolve_ctx_.session_info_.get_sql_mode());
ObPLParser parser(allocator, ObCharsets4Parser(), resolve_ctx_.session_info_.get_sql_mode());
ObStmtNodeTree *parse_tree = NULL;
const ObStmtNodeTree *routine_node = NULL;
const ObStmtNodeTree *clause_node = NULL;

View File

@ -205,7 +205,7 @@ int ObPLRouter::simple_resolve(ObPLFunctionAST &func_ast)
ObStmtNodeTree *parse_tree = NULL;
if (OB_SUCC(ret)) {
ObString body = routine_info_.get_routine_body(); //获取body字符串
ObPLParser parser(inner_allocator_, session_info_.get_local_collation_connection(), session_info_.get_sql_mode());
ObPLParser parser(inner_allocator_, session_info_.get_charsets4parser(), session_info_.get_sql_mode());
CHECK_COMPATIBILITY_MODE(&session_info_);
if (OB_FAIL(ObSQLUtils::convert_sql_text_from_schema_for_resolve(

View File

@ -68,10 +68,12 @@ int ObPLParser::fast_parse(const ObString &query,
parse_ctx.is_for_trigger_ = 0;
parse_ctx.is_dynamic_ = 0;
parse_ctx.is_inner_parse_ = 1;
parse_ctx.charset_info_ = ObCharset::get_charset(connection_collation_);
parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(connection_collation_) ?
(ObCharset::charset_type_by_coll(connection_collation_) != CHARSET_UTF8MB4) : false;
parse_ctx.connection_collation_ = connection_collation_;
parse_ctx.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_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(charsets4parser_.string_collation_) ?
(ObCharset::charset_type_by_coll(charsets4parser_.string_collation_) != CHARSET_UTF8MB4) : false;
parse_ctx.connection_collation_ = charsets4parser_.string_collation_;
parse_ctx.mysql_compatible_comment_ = false;
int64_t new_length = stmt_block.length() + 1;
char *buf = (char *)parse_malloc(new_length, parse_ctx.mem_pool_);
@ -170,10 +172,10 @@ int ObPLParser::parse_procedure(const ObString &stmt_block,
parse_ctx.is_for_trigger_ = is_for_trigger ? 1 : 0;
parse_ctx.is_dynamic_ = is_dynamic ? 1 : 0;
parse_ctx.is_inner_parse_ = is_inner_parse ? 1 : 0;
parse_ctx.charset_info_ = ObCharset::get_charset(connection_collation_);
parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(connection_collation_) ?
(ObCharset::charset_type_by_coll(connection_collation_) != CHARSET_UTF8MB4) : false;
parse_ctx.connection_collation_ = connection_collation_;
parse_ctx.charset_info_ = ObCharset::get_charset(charsets4parser_.string_collation_);
parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(charsets4parser_.string_collation_) ?
(ObCharset::charset_type_by_coll(charsets4parser_.string_collation_) != CHARSET_UTF8MB4) : false;
parse_ctx.connection_collation_ = charsets4parser_.string_collation_;
parse_ctx.scanner_ctx_.sql_mode_ = sql_mode_;
ret = parse_stmt_block(parse_ctx, multi_stmt);
@ -237,10 +239,12 @@ int ObPLParser::parse_routine_body(const ObString &routine_body, ObStmtNodeTree
parse_ctx.is_inner_parse_ = 1;
parse_ctx.is_for_trigger_ = is_for_trigger ? 1 : 0;
parse_ctx.comp_mode_ = lib::is_oracle_mode();
parse_ctx.charset_info_ = ObCharset::get_charset(connection_collation_);
parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(connection_collation_) ?
(ObCharset::charset_type_by_coll(connection_collation_) != CHARSET_UTF8MB4) : false;
parse_ctx.connection_collation_ = connection_collation_;
parse_ctx.charset_info_ = ObCharset::get_charset(charsets4parser_.string_collation_);
parse_ctx.charset_info_oracle_db_ = ObCharset::is_valid_collation(charsets4parser_.nls_collation_) ?
ObCharset::get_charset(charsets4parser_.nls_collation_) : NULL;
parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(charsets4parser_.string_collation_) ?
(ObCharset::charset_type_by_coll(charsets4parser_.string_collation_) != CHARSET_UTF8MB4) : false;
parse_ctx.connection_collation_ = charsets4parser_.string_collation_;
parse_ctx.scanner_ctx_.sql_mode_ = sql_mode_;
if (OB_FAIL(parse_stmt_block(parse_ctx, routine_stmt))) {
@ -270,10 +274,12 @@ int ObPLParser::parse_package(const ObString &package,
parse_ctx.comp_mode_ = lib::is_oracle_mode();
parse_ctx.is_inner_parse_ = 1;
parse_ctx.is_for_trigger_ = is_for_trigger ? 1 : 0;
parse_ctx.charset_info_ = ObCharset::get_charset(connection_collation_);
parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(connection_collation_) ?
(ObCharset::charset_type_by_coll(connection_collation_) != CHARSET_UTF8MB4) : false;
parse_ctx.connection_collation_ = connection_collation_;
parse_ctx.charset_info_ = ObCharset::get_charset(charsets4parser_.string_collation_);
parse_ctx.charset_info_oracle_db_ = ObCharset::is_valid_collation(charsets4parser_.nls_collation_) ?
ObCharset::get_charset(charsets4parser_.nls_collation_) : NULL;
parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(charsets4parser_.string_collation_) ?
(ObCharset::charset_type_by_coll(charsets4parser_.string_collation_) != CHARSET_UTF8MB4) : false;
parse_ctx.connection_collation_ = charsets4parser_.string_collation_;
parse_ctx.scanner_ctx_.sql_mode_ = sql_mode_;
if (OB_FAIL(parse_stmt_block(parse_ctx, package_stmt))) {
@ -368,10 +374,12 @@ int ObPLParser::reconstruct_trigger_package(ObStmtNodeTree *&package_stmt,
trg_parse_ctx.comp_mode_ = 1;
trg_parse_ctx.is_inner_parse_ = 1;
trg_parse_ctx.is_for_trigger_ = 1;
trg_parse_ctx.charset_info_ = ObCharset::get_charset(connection_collation_);
trg_parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(connection_collation_) ?
(ObCharset::charset_type_by_coll(connection_collation_) != CHARSET_UTF8MB4) : false;
trg_parse_ctx.connection_collation_ = connection_collation_;
trg_parse_ctx.charset_info_ = ObCharset::get_charset(charsets4parser_.string_collation_);
trg_parse_ctx.charset_info_oracle_db_ = ObCharset::is_valid_collation(charsets4parser_.nls_collation_) ?
ObCharset::get_charset(charsets4parser_.nls_collation_) : NULL;
trg_parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(charsets4parser_.string_collation_) ?
(ObCharset::charset_type_by_coll(charsets4parser_.string_collation_) != CHARSET_UTF8MB4) : false;
trg_parse_ctx.connection_collation_ = charsets4parser_.string_collation_;
if (OB_FAIL(parse_stmt_block(trg_parse_ctx, trg_tree))) {
LOG_WARN("failed to parse trigger", K(ret));
} else if (OB_ISNULL(trg_tree)) {

View File

@ -16,6 +16,7 @@
#include "pl/parser/parse_stmt_node.h"
#include "share/ob_define.h"
#include "share/schema/ob_trigger_info.h"
#include "sql/parser/ob_parser_utils.h"
namespace oceanbase
{
@ -34,9 +35,9 @@ namespace pl
class ObPLParser
{
public:
ObPLParser(common::ObIAllocator &allocator, common::ObCollationType conn_collation, ObSQLMode sql_mode = 0)
ObPLParser(common::ObIAllocator &allocator, sql::ObCharsets4Parser charsets4parser, ObSQLMode sql_mode = 0)
: allocator_(allocator),
connection_collation_(conn_collation),
charsets4parser_(charsets4parser),
sql_mode_(sql_mode)
{}
int fast_parse(const ObString &stmt_block,
@ -71,7 +72,7 @@ private:
share::schema::ObSchemaGetterGuard *schema_guard);
private:
common::ObIAllocator &allocator_;
common::ObCollationType connection_collation_;
sql::ObCharsets4Parser charsets4parser_;
ObSQLMode sql_mode_;
};
} // namespace pl

View File

@ -66,6 +66,7 @@ typedef struct _ObParseCtx
int comp_mode_;
bool is_not_utf8_connection_;
const struct ObCharsetInfo *charset_info_;
const struct ObCharsetInfo *charset_info_oracle_db_;
int64_t last_escape_check_pos_; //解析quoted string时的一个临时变量,处理连接gbk字符集时遇到的转义字符问题
int connection_collation_;
bool mysql_compatible_comment_; //whether the parser is parsing "/*! xxxx */"

View File

@ -124,6 +124,7 @@ int obpl_mysql_wrap_node_into_subquery(ObParseCtx *_parse_ctx, ParseNode *node)
parse_result.is_for_trigger_ = (1 == _parse_ctx->is_for_trigger_);
parse_result.question_mark_ctx_ = _parse_ctx->question_mark_ctx_;
parse_result.charset_info_ = _parse_ctx->charset_info_;
parse_result.charset_info_oracle_db_ = _parse_ctx->charset_info_oracle_db_;
parse_result.is_not_utf8_connection_ = _parse_ctx->is_not_utf8_connection_;
parse_result.connection_collation_ = _parse_ctx->connection_collation_;
parse_result.sql_mode_ = _parse_ctx->scanner_ctx_.sql_mode_;
@ -2598,6 +2599,7 @@ ParseNode *obpl_mysql_read_sql_construct(ObParseCtx *parse_ctx, const char *pref
//将pl_parser的question_mark_size赋值给sql_parser,使得parser sql的question mark能够接着pl_parser的index
parse_result.question_mark_ctx_ = parse_ctx->question_mark_ctx_;
parse_result.charset_info_ = parse_ctx->charset_info_;
parse_result.charset_info_oracle_db_ = parse_ctx->charset_info_oracle_db_;
parse_result.is_not_utf8_connection_ = parse_ctx->is_not_utf8_connection_;
parse_result.connection_collation_ = parse_ctx->connection_collation_;
parse_result.sql_mode_ = parse_ctx->scanner_ctx_.sql_mode_;

View File

@ -580,7 +580,7 @@ int ObDbmsCursorInfo::parse(const ObString &sql_stmt, ObSQLSessionInfo &session)
OX (set_spi_cursor(NULL));
if (OB_SUCC(ret)) {
ObIAllocator &alloc = get_dbms_entity()->get_arena_allocator();
ObParser parser(alloc, session.get_sql_mode(), session.get_local_collation_connection());
ObParser parser(alloc, session.get_sql_mode(), session.get_charsets4parser());
ParseResult parse_result;
int64_t param_count = 0;
char **param_names = NULL;

View File

@ -4183,7 +4183,7 @@ int ObDbmsStats::parse_method_opt(sql::ObExecContext &ctx,
} else {
ObParser parser(*allocator,
ctx.get_my_session()->get_sql_mode(),
ctx.get_my_session()->get_local_collation_connection());
ctx.get_my_session()->get_charsets4parser());
ParseMode parse_mode = DYNAMIC_SQL_MODE;
ParseResult parse_result;
const ParseNode *for_stmt = NULL;

View File

@ -185,7 +185,7 @@ int ObCreateRuleProcessor::generate_exec_arg()
} else {
ObUDRAnalyzer analyzer(ctx_.get_allocator(),
session->get_sql_mode(),
session->get_local_collation_connection());
session->get_charsets4parser());
if (OB_FAIL(analyzer.parse_and_check(arg_.pattern_, arg_.replacement_))) {
LOG_WARN("failed to parse and check", K(ret));
} else if (OB_FAIL(analyzer.parse_pattern_to_gen_param_infos_str(

View File

@ -3755,7 +3755,7 @@ int ObSchemaPrinter::print_object_definition(const ObUDTObjectType *object,
{
int ret = OB_SUCCESS;
ObArenaAllocator allocator;
pl::ObPLParser parser(allocator, CS_TYPE_UTF8MB4_BIN);
pl::ObPLParser parser(allocator, ObCharsets4Parser());
ObStmtNodeTree *object_stmt = NULL;
const ParseNode *src_node = NULL;
ObString object_src;
@ -4089,7 +4089,7 @@ int ObSchemaPrinter::print_routine_definition(
|| routine_info->get_routine_body().prefix_match_ci("function")) {
use_v1 = false;
pl::ObPLParser parser(allocator, CS_TYPE_UTF8MB4_BIN, exec_env.get_sql_mode());
pl::ObPLParser parser(allocator, ObCharsets4Parser(), exec_env.get_sql_mode());
if (lib::is_mysql_mode()) {
const char prefix[] = "CREATE\n";
@ -4151,7 +4151,7 @@ int ObSchemaPrinter::print_routine_definition(
ObStmtNodeTree *parse_tree = NULL;
const ObStmtNodeTree *routine_tree = NULL;
ObArenaAllocator allocator;
pl::ObPLParser parser(allocator, CS_TYPE_UTF8MB4_BIN);
pl::ObPLParser parser(allocator, ObCharsets4Parser());
ObStmtNodeTree *param_list = NULL;
ObStmtNodeTree *return_type = NULL;
ObStmtNodeTree *clause_list = NULL;

View File

@ -938,7 +938,7 @@ int ObMethodOptPrefs::check_pref_value_validity(ObTableStatParam *param/*default
} else {
ObParser parser(*allocator_,
session_info_->get_sql_mode(),
session_info_->get_local_collation_connection());
session_info_->get_charsets4parser());
ParseMode parse_mode = DYNAMIC_SQL_MODE;
ParseResult parse_result;
if (OB_FAIL(parser.parse(pvalue_, parse_result, parse_mode))) {

View File

@ -13,6 +13,7 @@
#define USING_LOG_PREFIX SQL_ENG
#include <string.h>
#include "lib/utility/ob_print_utils.h"
#include "share/object/ob_obj_cast.h"
#include "objit/common/ob_item_type.h"
#include "sql/engine/expr/ob_expr_func_dump.h"
@ -229,7 +230,7 @@ int ObExprFuncDump::calc_number(const common::ObObj &input,
input.get_type(), nmb.get_deep_copy_size()))) {
LOG_WARN("failed to databuff_printf", K(ret), K(nmb));
} else if (ReturnFormat::RF_OB_SEPC == fmt_enum) {
if (OB_FAIL(databuff_print_obj(tmp_buf, buff_size, pos, nmb))) {
if (OB_FAIL(common::databuff_print_obj(tmp_buf, buff_size, pos, nmb))) {
LOG_WARN("failed to databuff_printf", K(ret), K(pos));
}
} else {
@ -461,7 +462,7 @@ static int dump_ob_spec(char *buf, int64_t buf_len, int64_t &buf_pos, bool &dump
case ObNumberType:
case ObNumberFloatType: {
number::ObNumber nmb(datum.get_number());
OZ(databuff_print_obj(buf, buf_len, buf_pos, nmb));
OZ(common::databuff_print_obj(buf, buf_len, buf_pos, nmb));
break;
}
case ObDateTimeType: {

View File

@ -50,7 +50,9 @@ int calc_digest_text(ObIAllocator &allocator,
sql_ctx.schema_guard_ = schema_guard;
ObPlanCacheCtx pc_ctx(sql_str, PC_TEXT_MODE, allocator, sql_ctx, exec_ctx,
session->get_effective_tenant_id());
ObParser parser(allocator, session->get_sql_mode(), cs_type);
ObCharsets4Parser charsets4parser = session->get_charsets4parser();
charsets4parser.string_collation_ = cs_type;
ObParser parser(allocator, session->get_sql_mode(), charsets4parser);
ObSEArray<ObString, 1> queries;
ObMPParseStat parse_stat;
if (OB_FAIL(parser.split_multiple_stmt(sql_str, queries, parse_stat))) {
@ -90,7 +92,7 @@ int calc_digest_text(ObIAllocator &allocator,
pc_ctx,
parse_result.result_tree_,
tmp_params,
cs_type))) {
charsets4parser))) {
LOG_WARN("fail to parameterize syntax tree", K(sql_str), K(ret));
} else {
digest_str = pc_ctx.sql_ctx_.spm_ctx_.bl_key_.constructed_sql_;

View File

@ -28,7 +28,7 @@ int ObPrepareExecutor::multiple_query_check(
{
int ret = OB_SUCCESS;
ObSEArray<ObString, 1> queries;
ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection());
ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser());
ObMPParseStat parse_stat;
if (OB_FAIL(parser.split_multiple_stmt(sql, queries, parse_stat, false, true))) {
LOG_WARN("failed to split multiple stmt", K(ret), K(sql));

View File

@ -236,7 +236,7 @@ int ObSPIResultSet::is_set_global_var(ObSQLSessionInfo &session, const ObString
ObArenaAllocator allocator;
ParseResult parse_result;
ParseMode parse_mode = STD_MODE;
ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection());
ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser());
if (sql.empty()) {
} else if (OB_FAIL(parser.parse(sql,
parse_result,
@ -2095,7 +2095,7 @@ int ObSPIService::spi_parse_prepare(common::ObIAllocator &allocator,
ret = OB_INVALID_ARGUMENT;
LOG_WARN("Argument passed in is NULL", K(sql), K(secondary_namespace), K(ret));
} else {
ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection());
ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser());
ParseResult parse_result;
if (OB_FAIL(parser.prepare_parse(sql, static_cast<void*>(secondary_namespace), parse_result))) {
LOG_WARN("Generate syntax tree failed", K(sql), K(ret));

View File

@ -1008,7 +1008,7 @@ int ObSql::do_real_prepare(const ObString &sql,
ObIAllocator &allocator = result.get_mem_pool();
ObSQLSessionInfo &session = result.get_session();
ObExecContext &ectx = result.get_exec_context();
ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection());
ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser());
ParseMode parse_mode = context.is_dbms_sql_ ? DBMS_SQL_MODE :
(context.is_dynamic_sql_ || !is_inner_sql) ? DYNAMIC_SQL_MODE :
session.is_for_trigger_package() ? TRIGGER_MODE : STD_MODE;
@ -1093,7 +1093,7 @@ int ObSql::do_real_prepare(const ObString &sql,
pc_ctx,
parse_result.result_tree_,
param_store,
session.get_local_collation_connection()))) {
session.get_charsets4parser()))) {
LOG_INFO("parameterize syntax tree failed", K(ret));
pc_ctx.ps_need_parameterized_ = false;
ret = OB_SUCCESS;
@ -1265,7 +1265,7 @@ int ObSql::handle_pl_prepare(const ObString &sql,
CK (OB_NOT_NULL(pl_prepare_result.result_set_));
if (OB_SUCC(ret)) {
ObIAllocator &allocator = *pl_prepare_result.get_allocator();
ObParser parser(allocator, sess.get_sql_mode(), sess.get_local_collation_connection());
ObParser parser(allocator, sess.get_sql_mode(), sess.get_charsets4parser());
ParseMode parse_mode = pl_prepare_ctx.is_dbms_sql_ ? DBMS_SQL_MODE :
pl_prepare_ctx.is_dynamic_sql_ ? DYNAMIC_SQL_MODE :
sess.is_for_trigger_package() ? TRIGGER_MODE : STD_MODE;
@ -2203,7 +2203,7 @@ int ObSql::handle_ps_execute(const ObPsStmtId client_stmt_id,
context.is_execute_call_stmt_ = true;
}
ObParser parser(allocator, session.get_sql_mode(),
session.get_local_collation_connection());
session.get_charsets4parser());
ParseResult parse_result;
ObSqlTraits sql_traits;
ParseMode parse_mode = context.is_dbms_sql_ ? DBMS_SQL_MODE :
@ -2296,7 +2296,7 @@ int ObSql::handle_remote_query(const ObRemoteSqlInfo &remote_sql_info,
//切割出来的query最后走batched multi stmt的逻辑去查询plan cache和生成计划
ObParser parser(allocator,
session->get_sql_mode(),
session->get_local_collation_connection(),
session->get_charsets4parser(),
pc_ctx->def_name_ctx_);
ObMPParseStat parse_stat;
if (OB_FAIL(parser.split_multiple_stmt(remote_sql_info.remote_sql_, queries, parse_stat))) {
@ -3280,7 +3280,7 @@ int ObSql::generate_stmt_with_reconstruct_sql(ObDMLStmt* &stmt,
ParseResult parse_result;
ObParser parser(pc_ctx->allocator_,
session->get_sql_mode(),
session->get_local_collation_connection(),
session->get_charsets4parser(),
pc_ctx->def_name_ctx_);
stmt->get_query_ctx()->global_dependency_tables_.reuse();
if (OB_FAIL(parser.parse(sql, parse_result))) {
@ -3946,7 +3946,7 @@ int ObSql::get_outline_data(ObSqlCtx &context,
}
if (OB_SUCC(ret) && !outline_content.empty()) {
ObParser parser(pc_ctx.allocator_, session->get_sql_mode(), session->get_local_collation_connection(), pc_ctx.def_name_ctx_);
ObParser parser(pc_ctx.allocator_, session->get_sql_mode(), session->get_charsets4parser(), pc_ctx.def_name_ctx_);
ObSqlString sql_helper;
ObString temp_outline_sql;
if (OB_FAIL(sql_helper.assign_fmt("select %.*s 1 from dual", outline_content.length(),
@ -4076,7 +4076,7 @@ int ObSql::parser_and_check(const ObString &outlined_stmt,
} else {
pctx->reset_datum_param_store();
pctx->get_param_store_for_update().reuse();
ObParser parser(allocator, session->get_sql_mode(), session->get_local_collation_connection(), pc_ctx.def_name_ctx_);
ObParser parser(allocator, session->get_sql_mode(), session->get_charsets4parser(), pc_ctx.def_name_ctx_);
if (OB_FAIL(parser.parse(outlined_stmt, parse_result,
pc_ctx.is_rewrite_sql_ ? UDR_SQL_MODE : STD_MODE,
pc_ctx.sql_ctx_.handle_batched_multi_stmt(),
@ -4233,7 +4233,7 @@ int ObSql::parser_and_check(const ObString &outlined_stmt,
pc_ctx,
parse_result.result_tree_,
pctx->get_param_store_for_update(),
session->get_local_collation_connection()))) {
session->get_charsets4parser()))) {
bool need_retry_param = true;
int tmp_ret = OB_SUCCESS;
tmp_ret = OB_E(EventTable::EN_SQL_PARAM_FP_NP_NOT_SAME_ERROR) OB_SUCCESS;
@ -4383,7 +4383,7 @@ void ObSql::check_template_sql_can_be_prepare(ObPlanCacheCtx &pc_ctx, ObPhysical
ParseResult parse_result;
ObParser parser(pc_ctx.allocator_,
session->get_sql_mode(),
session->get_local_collation_connection(),
session->get_charsets4parser(),
pc_ctx.def_name_ctx_);
if (OB_FAIL(parser.parse(temp_sql, parse_result))) {
LOG_DEBUG("generate syntax tree failed", K(temp_sql), K(ret));
@ -4629,7 +4629,7 @@ int ObSql::pc_add_udr_plan(const ObUDRItemMgr::UDRItemRefGuard &item_guard,
tmp_pc_ctx.rule_name_ = pc_ctx.rule_name_;
const ObUDRItem *rule_item = item_guard.get_ref_obj();
ObParser parser(allocator, session.get_sql_mode(),
session.get_local_collation_connection(),
session.get_charsets4parser(),
pc_ctx.def_name_ctx_);
if (OB_ISNULL(rule_item)) {
ret = OB_ERR_UNEXPECTED;
@ -4647,7 +4647,7 @@ int ObSql::pc_add_udr_plan(const ObUDRItemMgr::UDRItemRefGuard &item_guard,
tmp_pc_ctx,
parse_result.result_tree_,
param_store,
session.get_local_collation_connection()))) {
session.get_charsets4parser()))) {
LOG_WARN("parameterize syntax tree failed", K(ret));
} else if (OB_FAIL(pc_add_plan(tmp_pc_ctx, result, outline_state, plan_cache, plan_added))) {
LOG_WARN("failed to add plan", K(ret));

View File

@ -1888,7 +1888,7 @@ int ObSQLUtils::get_outline_key(ObIAllocator &allocator,
//快速参数化后带?的sql
ObString no_param_sql;
ParseResult parse_result;
ObParser parser(allocator, session->get_sql_mode(), session->get_local_collation_connection());
ObParser parser(allocator, session->get_sql_mode(), session->get_charsets4parser());
ObSEArray<ObPCParam *, OB_PC_SPECIAL_PARAM_COUNT> special_params;
ObString param_sql;
ParamStore params( (ObWrapperAllocator(allocator)) );
@ -1984,7 +1984,7 @@ int ObSQLUtils::filter_hint_in_query_sql(ObIAllocator &allocator,
ObString &param_sql)
{
int ret = OB_SUCCESS;
ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection());
ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser());
ParseResult parse_result;
if (OB_FAIL(parser.parse(sql, parse_result, FP_NO_PARAMERIZE_AND_FILTER_HINT_MODE))) {
SQL_PC_LOG(WARN, "fail to parse query while filter hint", K(ret));

View File

@ -113,8 +113,8 @@ ObFastParserBase::ObFastParserBase(
question_mark_ctx_.by_ordinal_ = false;
question_mark_ctx_.by_name_ = false;
question_mark_ctx_.name_ = nullptr;
charset_type_ = ObCharset::charset_type_by_coll(fp_ctx.conn_coll_);
charset_info_ = ObCharset::get_charset(fp_ctx.conn_coll_);
charset_type_ = ObCharset::charset_type_by_coll(fp_ctx.charsets4parser_.string_collation_);
charset_info_ = ObCharset::get_charset(fp_ctx.charsets4parser_.string_collation_);
}
int ObFastParserBase::parse(const ObString &stmt,

View File

@ -31,21 +31,20 @@ struct FPContext
public:
bool enable_batched_multi_stmt_;
bool is_udr_mode_;
common::ObCollationType conn_coll_;
ObCharsets4Parser charsets4parser_;
ObSQLMode sql_mode_;
QuestionMarkDefNameCtx *def_name_ctx_;
FPContext()
: enable_batched_multi_stmt_(false),
is_udr_mode_(false),
conn_coll_(CS_TYPE_INVALID),
sql_mode_(0),
def_name_ctx_(nullptr)
{}
FPContext(common::ObCollationType conn_coll)
FPContext(ObCharsets4Parser charsets4parser)
: enable_batched_multi_stmt_(false),
is_udr_mode_(false),
conn_coll_(conn_coll),
charsets4parser_(charsets4parser),
sql_mode_(0),
def_name_ctx_(nullptr)
{}

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.

View File

@ -50,7 +50,7 @@ class ObParser
{
public:
explicit ObParser(common::ObIAllocator &allocator, ObSQLMode mode,
common::ObCollationType conn_collation = common::CS_TYPE_UTF8MB4_GENERAL_CI,
ObCharsets4Parser charsets4parser = ObCharsets4Parser(),
QuestionMarkDefNameCtx *ctx = nullptr);
virtual ~ObParser();
/// @param queries Note that all three members of ObString is valid, size() is the length
@ -201,7 +201,8 @@ private:
// when sql_mode = "ANSI_QUOTES", Treat " as an identifier quote character
// we don't use it in parser now
ObSQLMode sql_mode_;
common::ObCollationType connection_collation_;
ObCharsets4Parser charsets4parser_;
QuestionMarkDefNameCtx *def_name_ctx_;
};

View File

@ -142,6 +142,16 @@ private:
const ParseNode &parse_tree_;
};
struct ObCharsets4Parser
{
explicit ObCharsets4Parser() :
string_collation_(common::CS_TYPE_UTF8MB4_GENERAL_CI),
nls_collation_(common::CS_TYPE_INVALID)
{}
common::ObCollationType string_collation_; //collation type for the string to parse
common::ObCollationType nls_collation_; //oracle database collation for validating identifiers
};
} // end namespace sql
} // end namespace oceanbase

View File

@ -193,6 +193,35 @@ char *parse_strdup(const char *str, void *malloc_pool, int64_t *out_len)
return out_str;
}
char *replace_invalid_character(const struct ObCharsetInfo* src_cs, const struct ObCharsetInfo* oracle_db_cs,
const char *str, int64_t *out_len, void *malloc_pool, int *extra_errno)
{
char *out_str = NULL;
if (OB_ISNULL(str) || OB_ISNULL(extra_errno) || OB_ISNULL(out_len)) {
} else if (NULL == oracle_db_cs) {
out_str = const_cast<char *>(str);
} else {
ob_wc_t replace_char = !!(oracle_db_cs->state & OB_CS_UNICODE) ? 0xFFFD : '?';
uint errors = 0;
size_t str_len = STRLEN(str);
char *temp_str = NULL;
size_t temp_len = str_len * 4;
if (OB_ISNULL(temp_str = static_cast<char *>(parse_malloc(temp_len + 1, malloc_pool)))) {
} else {
int64_t temp_res_len = static_cast<int64_t>(
ob_convert(temp_str, temp_len, oracle_db_cs, str, str_len, src_cs, false, replace_char, &errors));
size_t dst_len = temp_res_len * 4;
if (OB_ISNULL(out_str = static_cast<char *>(parse_malloc(dst_len + 1, malloc_pool)))) {
} else {
*out_len = static_cast<int64_t>(
ob_convert(out_str, dst_len, src_cs, temp_str, temp_res_len, oracle_db_cs, false, replace_char, &errors));
out_str[*out_len] = '\0';
}
}
}
return out_str;
}
char *parse_str_convert_utf8(const struct ObCharsetInfo* src_cs, const char *str, void *malloc_pool, int64_t *out_len, int *extra_errno)
{
char *out_str = NULL;

View File

@ -29,6 +29,9 @@ extern void parse_free(void *ptr);
extern char *parse_strndup(const char *str, size_t nbyte, void *malloc_pool);
extern char *parse_strdup(const char *str, void *malloc_pool, int64_t *out_len);
extern char *parse_str_convert_utf8(const struct ObCharsetInfo* src_cs, const char *str, void *malloc_pool, int64_t *out_len, int *extra_errno);
extern char *replace_invalid_character(const struct ObCharsetInfo* src_cs,
const struct ObCharsetInfo* oracle_db_cs,
const char *str, int64_t *out_len, void *malloc_pool, int *extra_errno);
extern char *parse_strndup_with_trim_space_for_new_line(const char *str, size_t nbyte, void *malloc_pool, int *connection_collation, int64_t *new_len);
extern char *strndup_with_prefix(const char *prefix, const char *str, size_t nbyte, void *malloc_pool);
extern char *strndup_with_prefix_and_postfix(const char *prefix, const char *postfix, const char *str, size_t nbyte, void *malloc_pool);

View File

@ -292,7 +292,8 @@ typedef struct
void *malloc_pool_; // ObIAllocator
ObQuestionMarkCtx question_mark_ctx_;
ObSQLMode sql_mode_;
const struct ObCharsetInfo *charset_info_;
const struct ObCharsetInfo *charset_info_; //client charset
const struct ObCharsetInfo *charset_info_oracle_db_; //oracle DB charset
ParamList *param_nodes_;
ParamList *tail_param_node_;
struct {

View File

@ -452,8 +452,8 @@ int ObPlanCache::get_normalized_pattern_digest(const ObPlanCacheCtx &pc_ctx, uin
if (pc_ctx.mode_ == PC_PS_MODE || pc_ctx.mode_ == PC_PL_MODE || pc_ctx.fp_result_.pc_key_.name_.empty()) {
ObFastParserResult fp_result;
ObSQLMode sql_mode = pc_ctx.sql_ctx_.session_info_->get_sql_mode();
ObCollationType conn_coll = pc_ctx.sql_ctx_.session_info_->get_local_collation_connection();
FPContext fp_ctx(conn_coll);
ObCharsets4Parser charsets4parser = pc_ctx.sql_ctx_.session_info_->get_charsets4parser();
FPContext fp_ctx(charsets4parser);
fp_ctx.enable_batched_multi_stmt_ = pc_ctx.sql_ctx_.handle_batched_multi_stmt();
fp_ctx.sql_mode_ = sql_mode;
if (OB_FAIL(ObSqlParameterization::fast_parser(pc_ctx.allocator_,
@ -688,7 +688,7 @@ int ObPlanCache::construct_fast_parser_result(common::ObIAllocator &allocator,
LOG_WARN("get unexpected null", K(ret));
} else {
ObSQLMode sql_mode = pc_ctx.sql_ctx_.session_info_->get_sql_mode();
ObCollationType conn_coll = pc_ctx.sql_ctx_.session_info_->get_local_collation_connection();
ObCharsets4Parser charsets4parser = pc_ctx.sql_ctx_.session_info_->get_charsets4parser();
// if exact mode is on, not needs to do fast parser
bool enable_exact_mode = pc_ctx.sql_ctx_.session_info_->get_enable_exact_mode();
fp_result.cache_params_ =
@ -701,7 +701,7 @@ int ObPlanCache::construct_fast_parser_result(common::ObIAllocator &allocator,
} else if (enable_exact_mode) {
(void)fp_result.pc_key_.name_.assign_ptr(raw_sql.ptr(), raw_sql.length());
} else {
FPContext fp_ctx(conn_coll);
FPContext fp_ctx(charsets4parser);
fp_ctx.enable_batched_multi_stmt_ = pc_ctx.sql_ctx_.handle_batched_multi_stmt();
fp_ctx.sql_mode_ = sql_mode;
bool can_do_batch_insert = false;
@ -972,8 +972,8 @@ int ObPlanCache::check_can_do_insert_opt(common::ObIAllocator &allocator,
int64_t upd_params_count = 0;
int64_t delta_length = 0;
ObSQLMode sql_mode = pc_ctx.sql_ctx_.session_info_->get_sql_mode();
ObCollationType conn_coll = pc_ctx.sql_ctx_.session_info_->get_local_collation_connection();
FPContext fp_ctx(conn_coll);
ObCharsets4Parser charsets4parser = pc_ctx.sql_ctx_.session_info_->get_charsets4parser();
FPContext fp_ctx(charsets4parser);
fp_ctx.enable_batched_multi_stmt_ = pc_ctx.sql_ctx_.handle_batched_multi_stmt();
fp_ctx.sql_mode_ = sql_mode;
ObFastParserMysql fp(allocator, fp_ctx);

View File

@ -999,7 +999,7 @@ int ObSqlParameterization::parameterize_syntax_tree(common::ObIAllocator &alloca
ObPlanCacheCtx &pc_ctx,
ParseNode *tree,
ParamStore &params,
ObCollationType cs_type)
ObCharsets4Parser charsets4parser)
{
int ret = OB_SUCCESS;
SqlInfo sql_info;
@ -1029,7 +1029,7 @@ int ObSqlParameterization::parameterize_syntax_tree(common::ObIAllocator &alloca
// if so, faster parser is needed
// otherwise, fast parser has been done before
pc_ctx.fp_result_.reset();
FPContext fp_ctx(cs_type);
FPContext fp_ctx(charsets4parser);
fp_ctx.enable_batched_multi_stmt_ = pc_ctx.sql_ctx_.handle_batched_multi_stmt();
fp_ctx.sql_mode_ = session->get_sql_mode();
fp_ctx.is_udr_mode_ = pc_ctx.is_rewrite_sql_;
@ -1510,7 +1510,7 @@ int ObSqlParameterization::fast_parser(ObIAllocator &allocator,
} else { /*do nothing*/}
}
} else {
ObParser parser(allocator, fp_ctx.sql_mode_, fp_ctx.conn_coll_);
ObParser parser(allocator, fp_ctx.sql_mode_, fp_ctx.charsets4parser_);
SMART_VAR(ParseResult, parse_result) {
if (OB_FAIL(parser.parse(sql, parse_result, FP_MODE, fp_ctx.enable_batched_multi_stmt_))) {
SQL_PC_LOG(WARN, "fail to fast parser", K(sql), K(ret));
@ -1556,7 +1556,7 @@ int ObSqlParameterization::raw_fast_parameterize_sql(ObIAllocator &allocator,
ParseMode parse_mode)
{
int ret = OB_SUCCESS;
ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection());
ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser());
ParseResult parse_result;
NG_TRACE(pc_fast_parse_start);

View File

@ -179,7 +179,7 @@ public:
ObPlanCacheCtx &pc_ctx,
ParseNode *tree,
ParamStore &params,
ObCollationType cs_type);
ObCharsets4Parser charsets4parser);
static int gen_special_param_info(SqlInfo &sql_info, ObPlanCacheCtx &pc_ctx);
static int gen_ps_not_param_var(const ObIArray<int64_t> &offsets,
ParamStore &params,

View File

@ -307,7 +307,7 @@ int ObAlterRoutineResolver::parse_routine(
{
int ret = OB_SUCCESS;
ObDataTypeCastParams dtc_params = session_info_->get_dtc_params();
pl::ObPLParser parser(*(params_.allocator_), dtc_params.connection_collation_, session_info_->get_sql_mode());
pl::ObPLParser parser(*(params_.allocator_), session_info_->get_charsets4parser(), session_info_->get_sql_mode());
ParseResult parse_result;
ObString body = source;
MEMSET(&parse_result, 0, SIZEOF(ParseResult));

View File

@ -94,7 +94,7 @@ int ObCreateTableStmt::get_first_stmt(ObString &first_stmt)
get_query_ctx()->get_sql_stmt_coll_type(),
ObCharset::get_system_collation(),
first_stmt,
ObCharset::REPLACE_UNKNOWN_CHARACTER))) {
ObCharset::REPLACE_UNKNOWN_CHARACTER_ON_SAME_CHARSET))) {
LOG_WARN("fail to convert charset", K(ret), K(first_stmt),
"stmt collation type", get_query_ctx()->get_sql_stmt_coll_type());
}

View File

@ -35,7 +35,7 @@ int ObDDLStmt::get_first_stmt(ObString &first_stmt)
get_query_ctx()->get_sql_stmt_coll_type(),
ObCharset::get_system_collation(),
first_stmt,
ObCharset::REPLACE_UNKNOWN_CHARACTER))) {
ObCharset::REPLACE_UNKNOWN_CHARACTER_ON_SAME_CHARSET))) {
LOG_WARN("fail to convert charset", K(ret), K(first_stmt),
"stmt collation type", get_query_ctx()->get_sql_stmt_coll_type());
}

View File

@ -473,7 +473,7 @@ int ObTriggerResolver::resolve_timing_point(int16_t before_or_after, int16_t stm
ObCreateTriggerArg &trigger_arg)
{
int ret = OB_SUCCESS;
pl::ObPLParser pl_parser(*allocator_, session_info_->get_local_collation_connection(), session_info_->get_sql_mode());
pl::ObPLParser pl_parser(*allocator_, session_info_->get_charsets4parser(), session_info_->get_sql_mode());
ParseResult parse_result;
const ObStmtNodeTree *parse_tree = NULL;
bool is_include_old_new_in_trigger = false;
@ -759,7 +759,7 @@ int ObTriggerResolver::resolve_trigger_body(const ParseNode &parse_node,
session_info_->get_dtc_params()));
if (OB_SUCC(ret) && lib::is_mysql_mode()) {
ObString procedure_source;
pl::ObPLParser parser(*allocator_, session_info_->get_local_collation_connection(), session_info_->get_sql_mode());
pl::ObPLParser parser(*allocator_, session_info_->get_charsets4parser(), session_info_->get_sql_mode());
ObStmtNodeTree *parse_tree = NULL;
CHECK_COMPATIBILITY_MODE(session_info_);
OZ (trigger_info.gen_procedure_source(trigger_arg.base_object_database_,
@ -1103,7 +1103,7 @@ int ObTriggerResolver::analyze_trigger(ObSchemaGetterGuard &schema_guard,
ObPLCompiler compiler(allocator, *session_info, schema_guard, package_guard, *sql_proxy);
const ObPackageInfo &package_spec_info = trigger_info.get_package_spec_info();
if (!trigger_info.get_update_columns().empty()) {
ObPLParser parser(allocator, session_info->get_local_collation_connection(), session_info->get_sql_mode());
ObPLParser parser(allocator, session_info->get_charsets4parser(), session_info->get_sql_mode());
ObStmtNodeTree *column_list = NULL;
ParseResult parse_result;
OZ (parser.parse(trigger_info.get_update_columns(), trigger_info.get_update_columns(), parse_result, true));

View File

@ -5144,7 +5144,7 @@ int ObDMLResolver::do_expand_view(TableItem &view_item, ObChildStmtResolver &vie
ObString view_def;
ObParser parser(*params_.allocator_, session_info_->get_sql_mode(),
session_info_->get_local_collation_connection());
session_info_->get_charsets4parser());
if (OB_FAIL(ObSQLUtils::generate_view_definition_for_resolve(
*params_.allocator_,
session_info_->get_local_collation_connection(),
@ -8461,7 +8461,7 @@ int ObDMLResolver::check_table_exist_or_not(uint64_t tenant_id,
if (OB_SUCC(ret)) {
if (!is_exist) {
ret = OB_TABLE_NOT_EXIST;
LOG_INFO("table not exist", K(tenant_id), K(database_id), K(table_name), K(ret));
LOG_INFO("table not exist", K(tenant_id), K(database_id), K(table_name), KPHEX(table_name.ptr(), table_name.length()), K(ret));
}
}
}

View File

@ -4541,7 +4541,7 @@ int ObSelectResolver::mock_to_named_windows(ObString &name,
win_str.ptr()))) {
LOG_WARN("fail to concat string", K(ret));
} else if (OB_FAIL(ObRawExprUtils::parse_expr_node_from_str(sql_str.string(),
params_.session_info_->get_local_collation_connection(),
params_.session_info_->get_charsets4parser(),
params_.expr_factory_->get_allocator(),
mock_node))) {
LOG_WARN("parse expr node from string failed", K(ret));

View File

@ -956,7 +956,7 @@ int ObRawExprUtils::resolve_udf_param_exprs(ObResolverParams &params,
static_cast<uint32_t>(udf_info.udf_param_num_ + udf_info.param_names_.count()));
SQL_LOG(WARN, "param count mismatch", K(ret), K(i), K(default_val));
} else if (OB_FAIL(ObRawExprUtils::parse_default_expr_from_str(
default_val, params.session_info_->get_local_collation_connection(),
default_val, params.session_info_->get_charsets4parser(),
*(params.allocator_), default_node))) {
SQL_LOG(WARN, "failed to parse expr node from str", K(ret), K(i), K(default_val), K(udf_info));
} else if (OB_ISNULL(default_node)
@ -1368,7 +1368,7 @@ int ObRawExprUtils::make_raw_expr_from_str(const ObString &expr_str,
}
int ObRawExprUtils::parse_default_expr_from_str(const ObString &expr_str,
ObCollationType expr_str_cs_type, ObIAllocator &allocator, const ParseNode *&node)
ObCharsets4Parser expr_str_cs_type, ObIAllocator &allocator, const ParseNode *&node)
{
int ret = OB_SUCCESS;
ObSqlString sql_str;
@ -1383,10 +1383,12 @@ int ObRawExprUtils::parse_default_expr_from_str(const ObString &expr_str,
parse_result.pl_parse_info_.is_pl_parse_ = true;
parse_result.pl_parse_info_.is_pl_parse_expr_ = true;
parse_result.sql_mode_ = sql_mode;
parse_result.charset_info_ = ObCharset::get_charset(expr_str_cs_type);
parse_result.is_not_utf8_connection_ = ObCharset::is_valid_collation(expr_str_cs_type) ?
(ObCharset::charset_type_by_coll(expr_str_cs_type) != CHARSET_UTF8MB4) : false;
parse_result.connection_collation_ = expr_str_cs_type;
parse_result.charset_info_ = ObCharset::get_charset(expr_str_cs_type.string_collation_);
parse_result.charset_info_oracle_db_ = ObCharset::is_valid_collation(expr_str_cs_type.nls_collation_) ?
ObCharset::get_charset(expr_str_cs_type.nls_collation_) : NULL;
parse_result.is_not_utf8_connection_ = ObCharset::is_valid_collation(expr_str_cs_type.string_collation_) ?
(ObCharset::charset_type_by_coll(expr_str_cs_type.string_collation_) != CHARSET_UTF8MB4) : false;
parse_result.connection_collation_ = expr_str_cs_type.string_collation_;
if (OB_FAIL(sql_str.append_fmt("DO %.*s", expr_str.length(), expr_str.ptr()))) {
LOG_WARN("failed to concat expr str", K(expr_str), K(ret));
@ -1426,7 +1428,7 @@ int ObRawExprUtils::parse_default_expr_from_str(const ObString &expr_str,
}
int ObRawExprUtils::parse_expr_list_node_from_str(const ObString &expr_str,
ObCollationType expr_str_cs_type,
ObCharsets4Parser expr_str_cs_type,
ObIAllocator &allocator,
const ParseNode *&node,
const ObSQLMode &sql_mode)
@ -1503,7 +1505,7 @@ int ObRawExprUtils::parse_expr_list_node_from_str(const ObString &expr_str,
}
int ObRawExprUtils::parse_expr_node_from_str(const ObString &expr_str,
ObCollationType expr_str_cs_type,
ObCharsets4Parser expr_str_cs_type,
ObIAllocator &allocator,
const ParseNode *&node,
const ObSQLMode &sql_mode)
@ -1626,7 +1628,7 @@ int ObRawExprUtils::build_generated_column_expr(const ObString &expr_str,
int ret = OB_SUCCESS;
const ParseNode *node = NULL;
if (OB_FAIL(parse_expr_node_from_str(expr_str,
session_info.get_local_collation_connection(),
session_info.get_charsets4parser(),
expr_factory.get_allocator(), node, session_info.get_sql_mode()))) {
LOG_WARN("parse expr node from string failed", K(ret), K(expr_str));
} else if (OB_ISNULL(node)) {
@ -1947,7 +1949,7 @@ int ObRawExprUtils::build_generated_column_expr(const obrpc::ObCreateIndexArg *a
ObSEArray<ObRawExpr *, 6> real_exprs;
const ObColumnSchemaV2 *col_schema = NULL;
if (OB_FAIL(parse_expr_node_from_str(expr_str,
session_info.get_local_collation_connection(),
session_info.get_charsets4parser(),
expr_factory.get_allocator(), node))) {
LOG_WARN("parse expr node from string failed", K(ret));
} else if (OB_ISNULL(node)) {

View File

@ -215,16 +215,16 @@ public:
common::ObIArray<ObWinFunRawExpr*> &win_exprs,
common::ObIArray<ObUDFInfo> &udf_info);
static int parse_default_expr_from_str(const common::ObString &expr_str,
common::ObCollationType expr_str_cs_type,
ObCharsets4Parser expr_str_cs_type,
common::ObIAllocator &allocator,
const ParseNode *&node);
static int parse_expr_list_node_from_str(const common::ObString &expr_str,
common::ObCollationType expr_str_cs_type,
ObCharsets4Parser expr_str_cs_type,
common::ObIAllocator &allocator,
const ParseNode *&node,
const ObSQLMode &sql_mode);
static int parse_expr_node_from_str(const common::ObString &expr_str,
common::ObCollationType expr_str_cs_type,
ObCharsets4Parser expr_str_cs_type,
common::ObIAllocator &allocator,
const ParseNode *&node,
const ObSQLMode &sql_mode = 0);

View File

@ -4298,7 +4298,7 @@ int ObResolverUtils::resolve_generated_column_expr(ObResolverParams &params,
ret = OB_INVALID_ARGUMENT;
LOG_WARN("allocator is null", K(ret));
} else if (OB_FAIL(ObRawExprUtils::parse_expr_node_from_str(
expr_str, params.session_info_->get_local_collation_connection(),
expr_str, params.session_info_->get_charsets4parser(),
*params.allocator_, expr_node))) {
LOG_WARN("parse expr node from str failed", K(ret), K(expr_str));
} else if (OB_FAIL(resolve_generated_column_expr(params, expr_node, tbl_schema,
@ -4338,7 +4338,7 @@ int ObResolverUtils::resolve_generated_column_expr(ObResolverParams &params,
LOG_WARN("allocator or session is null", K(ret),
KP(params.allocator_), KP(params.session_info_));
} else if (OB_FAIL(ObRawExprUtils::parse_expr_node_from_str(
expr_str, params.session_info_->get_local_collation_connection(),
expr_str, params.session_info_->get_charsets4parser(),
*params.allocator_, expr_node))) {
LOG_WARN("parse expr node from str failed", K(ret), K(expr_str));
} else if (OB_FAIL(resolve_generated_column_expr(params,
@ -4757,7 +4757,7 @@ int ObResolverUtils::resolve_generated_column_info(const ObString &expr_str,
int ret = OB_SUCCESS;
const ParseNode *node = NULL;
if (OB_FAIL(ObRawExprUtils::parse_expr_node_from_str(
expr_str, CS_TYPE_UTF8MB4_BIN,
expr_str, ObCharsets4Parser(),
allocator, node))) {
LOG_WARN("parse expr node from string failed", K(ret), K(expr_str));
} else if (OB_ISNULL(node)) {
@ -4863,7 +4863,7 @@ int ObResolverUtils::resolve_default_expr_v2_column_expr(ObResolverParams &param
ret = OB_INVALID_ARGUMENT;
LOG_WARN("allocator or session is null", K(ret));
} else if (OB_FAIL(ObRawExprUtils::parse_expr_node_from_str(
expr_str, params.session_info_->get_local_collation_connection(),
expr_str, params.session_info_->get_charsets4parser(),
*params.allocator_, expr_node))) {
LOG_WARN("parse expr node from str failed", K(ret), K(expr_str));
} else if (OB_FAIL(resolve_default_expr_v2_column_expr(params, expr_node, default_expr_v2_column, expr, allow_sequence))) {

View File

@ -45,6 +45,7 @@
#include "common/sql_mode/ob_sql_mode_utils.h"
#include "sql/monitor/flt/ob_flt_extra_info.h"
#include "sql/monitor/flt/ob_flt_utils.h"
#include "sql/parser/ob_parser_utils.h"
namespace oceanbase
{
@ -979,6 +980,13 @@ public:
get_local_collation_connection());
}
inline ObCharsets4Parser get_charsets4parser() const {
ObCharsets4Parser charsets4parser;
charsets4parser.string_collation_ = get_local_collation_connection();
charsets4parser.nls_collation_ = get_nls_collation();
return charsets4parser;
}
inline ObSessionNLSParams get_session_nls_params() const
{
ObSessionNLSParams session_nls_params;

View File

@ -34,7 +34,7 @@ int ObUDRAnalyzer::parse_and_resolve_stmt_type(const common::ObString &sql,
{
int ret = OB_SUCCESS;
stmt_type = stmt::T_NONE;
ObParser parser(allocator_, sql_mode_, connection_collation_);
ObParser parser(allocator_, sql_mode_, charsets4parser_);
if (OB_FAIL(multiple_query_check(sql))) {
LOG_WARN("failed to check multiple query check", K(ret));
} else if (OB_FAIL(parser.parse(sql, parse_result))) {
@ -149,7 +149,7 @@ int ObUDRAnalyzer::multiple_query_check(const ObString &sql)
{
int ret = OB_SUCCESS;
ObSEArray<ObString, 1> queries;
ObParser parser(allocator_, sql_mode_, connection_collation_);
ObParser parser(allocator_, sql_mode_, charsets4parser_);
ObMPParseStat parse_stat;
if (OB_FAIL(parser.split_multiple_stmt(sql, queries, parse_stat))) {
LOG_WARN("failed to split multiple stmt", K(ret), K(sql));
@ -315,7 +315,7 @@ int ObUDRAnalyzer::parse_sql_to_gen_match_param_infos(
{
int ret = OB_SUCCESS;
ObFastParserResult fp_result;
FPContext fp_ctx(connection_collation_);
FPContext fp_ctx(charsets4parser_);
fp_ctx.sql_mode_ = sql_mode_;
fp_ctx.is_udr_mode_ = true;
if (pattern.empty()) {
@ -340,7 +340,7 @@ int ObUDRAnalyzer::parse_pattern_to_gen_param_infos(
{
int ret = OB_SUCCESS;
ObFastParserResult fp_result;
FPContext fp_ctx(connection_collation_);
FPContext fp_ctx(charsets4parser_);
fp_ctx.sql_mode_ = sql_mode_;
fp_ctx.is_udr_mode_ = true;
if (pattern.empty()) {

View File

@ -20,10 +20,10 @@ class ObUDRAnalyzer
public:
ObUDRAnalyzer(common::ObIAllocator &allocator,
ObSQLMode mode,
common::ObCollationType conn_collation)
ObCharsets4Parser charsets4parser)
: allocator_(allocator),
sql_mode_(mode),
connection_collation_(conn_collation)
charsets4parser_(charsets4parser)
{}
static bool check_is_allow_stmt_type(stmt::StmtType stmt_type);
int parse_and_check(const common::ObString &pattern,
@ -64,7 +64,7 @@ private:
private:
common::ObIAllocator &allocator_;
ObSQLMode sql_mode_;
common::ObCollationType connection_collation_;
ObCharsets4Parser charsets4parser_;
private:
DISALLOW_COPY_AND_ASSIGN(ObUDRAnalyzer);
};

View File

@ -36,7 +36,7 @@ int ObUDRUtils::match_udr_item(const ObString &pattern,
sql::ObUDRMgr *rule_mgr = MTL(sql::ObUDRMgr*);
ObUDRAnalyzer analyzer(allocator,
session_info.get_sql_mode(),
session_info.get_local_collation_connection());
session_info.get_charsets4parser());
if (OB_FAIL(analyzer.parse_sql_to_gen_match_param_infos(pattern,
rule_ctx.normalized_pattern_,
rule_ctx.raw_param_list_))) {
@ -146,8 +146,8 @@ int ObUDRUtils::cons_udr_param_store(const DynamicParamInfoArray& dynamic_param_
LOG_WARN("invalid argument", K(ret), K(pc_ctx.sql_ctx_.session_info_));
} else if (PC_PS_MODE == pc_ctx.mode_) {
ObSQLMode sql_mode = pc_ctx.sql_ctx_.session_info_->get_sql_mode();
ObCollationType conn_coll = pc_ctx.sql_ctx_.session_info_->get_local_collation_connection();
FPContext fp_ctx(conn_coll);
ObCharsets4Parser charsets4parser = pc_ctx.sql_ctx_.session_info_->get_charsets4parser();
FPContext fp_ctx(charsets4parser);
fp_ctx.enable_batched_multi_stmt_ = pc_ctx.sql_ctx_.handle_batched_multi_stmt();
fp_ctx.sql_mode_ = sql_mode;
if (OB_FAIL(ObSqlParameterization::fast_parser(allocator,

View File

@ -276,20 +276,26 @@ begin
end /
-- create_tenant_by_memory_limit: 根据memory_limit创建租户
drop procedure if exists create_tenant_by_memory_resource;/
create procedure create_tenant_by_memory_resource(tenant_name varchar(64), compat_mode varchar(10))
drop procedure if exists create_tenant_by_memory_resource_with_arg;/
create procedure create_tenant_by_memory_resource_with_arg(tenant_name varchar(64), compat_mode varchar(10), arg_list varchar(64))
begin
declare mem bigint;
select memory_limit from GV$OB_SERVERS limit 1 into mem;
if (mem < 8589934592) then
call oceanbase.create_tenant_with_arg(tenant_name, compat_mode, '1c1g', '');
call oceanbase.create_tenant_with_arg(tenant_name, compat_mode, '1c1g', arg_list);
elseif (mem < 17179869184) then
call oceanbase.create_tenant_with_arg(tenant_name, compat_mode, '2c2g', '');
call oceanbase.create_tenant_with_arg(tenant_name, compat_mode, '2c2g', arg_list);
else
call oceanbase.create_tenant_with_arg(tenant_name, compat_mode, '2c4g', '');
call oceanbase.create_tenant_with_arg(tenant_name, compat_mode, '2c4g', arg_list);
end if;
end /
drop procedure if exists create_tenant_by_memory_resource;/
create procedure create_tenant_by_memory_resource(tenant_name varchar(64), compat_mode varchar(10))
begin
call create_tenant_by_memory_resource_with_arg(tenant_name, compat_mode, '');
end /
-- adjust_sys_resource: 根据memory_limit调整sys租户规格
drop procedure if exists adjust_sys_resource;/
create procedure adjust_sys_resource()

View File

@ -189,7 +189,7 @@ int TestFastParser::parse(const ObString &sql)
{
ObSQLMode mode = SMO_DEFAULT;
ParseResult parse_result;
ObCollationType connection_collation = CS_TYPE_UTF8MB4_GENERAL_CI;
ObCharsets4Parser charsets4parser;
if (lib::is_oracle_mode()) {
parse_result.sql_mode_ = (DEFAULT_ORACLE_MODE | SMO_ORACLE);
mode = (DEFAULT_ORACLE_MODE | SMO_ORACLE);
@ -197,14 +197,14 @@ int TestFastParser::parse(const ObString &sql)
parse_result.sql_mode_ = DEFAULT_MYSQL_MODE;
mode = DEFAULT_MYSQL_MODE;
}
ObParser parser(allocator_, mode, connection_collation);
ObParser parser(allocator_, mode, charsets4parser);
MEMSET(&parse_result, 0, sizeof(parse_result));
int ret1 = parser.parse(sql, parse_result, FP_MODE);
int64_t param_num = 0;
char *no_param_sql_ptr = NULL;
int64_t no_param_sql_len = 0;
ParamList *p_list = NULL;
FPContext fp_ctx(connection_collation);
FPContext fp_ctx(charsets4parser);
fp_ctx.enable_batched_multi_stmt_ = false;
fp_ctx.is_udr_mode_ = false;
int ret2 = ObFastParser::parse(sql, fp_ctx, allocator_,

View File

@ -57,7 +57,7 @@ void TestPLParser::TearDown()
TEST_F(TestPLParser, basic_test)
{
ObPLParser parser(allocator_, CS_TYPE_UTF8MB4_BIN);
ObPLParser parser(allocator_, ObCharsets4Parser());
ParseResult parse_result;
// const char *query_str = "CREATE PROCEDURE sp (a varchar(10), b int(10)) BEGIN DECLARE c int default 1; DECLARE d, e varchar(11); IF 1=1 THEN select * from t1; ELSE IF 2=1 THEN select * from t1; ELSE select 1; END IF; END";
// const char *query_str = "create procedure sp() begin declare i bigint; if(i=1) then select 1 from dual; end if; end";

View File

@ -61,7 +61,7 @@ TEST_F(TestSqlParameterization, parameterize_sql)
ObString stmt = ObString::make_string("select * from t1 where c1 = 3 group by 2 order by 1");
ObSEArray<const ObPCParam *, OB_PC_NOT_PARAM_COUNT> not_params;
ObFastParserResult fp_result;
FPContext fp_ctx(ObCharset::get_system_collation());
FPContext fp_ctx(ObCharsets4Parser());
fp_ctx.sql_mode_ = SMO_DEFAULT;
if (OB_FAIL(ObSqlParameterization::fast_parser(allocator,
fp_ctx,