From c739003169ecee8f1be78ab21477a8aeed4d0d4b Mon Sep 17 00:00:00 2001 From: "18523270951@163.com" <18523270951@163.com> Date: Wed, 1 Jan 2025 07:45:22 +0000 Subject: [PATCH] [CP] fix DBMS_SESSION charset caseup failed under gb18030 --- src/pl/sys_package/ob_dbms_session.cpp | 41 ++++++++++++++++---------- src/pl/sys_package/ob_dbms_session.h | 8 +++-- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/pl/sys_package/ob_dbms_session.cpp b/src/pl/sys_package/ob_dbms_session.cpp index ee74bdde5..8476bc47b 100644 --- a/src/pl/sys_package/ob_dbms_session.cpp +++ b/src/pl/sys_package/ob_dbms_session.cpp @@ -50,7 +50,7 @@ int ObDBMSSession::clear_all_context(sql::ObExecContext &ctx, ret = OB_ERR_WRONG_FUNC_ARGUMENTS_TYPE; LOG_USER_ERROR(OB_ERR_WRONG_FUNC_ARGUMENTS_TYPE, func_name.length(), func_name.ptr()); } else if (OB_FAIL(check_argument(params.at(0), false, true, 0, - OB_MAX_CONTEXT_STRING_LENGTH, context_name))) { + OB_MAX_CONTEXT_STRING_LENGTH, context_name, ctx.get_allocator()))) { LOG_WARN("failed to check param 0", K(ret)); } else if (OB_ISNULL(schema_guard)) { ret = OB_ERR_UNEXPECTED; @@ -106,7 +106,7 @@ int ObDBMSSession::clear_context(sql::ObExecContext &ctx, ret = OB_ERR_WRONG_FUNC_ARGUMENTS_TYPE; LOG_USER_ERROR(OB_ERR_WRONG_FUNC_ARGUMENTS_TYPE, func_name.length(), func_name.ptr()); } else if (OB_FAIL(check_argument(params.at(0), false, true, 0, - OB_MAX_CONTEXT_STRING_LENGTH, context_name))) { + OB_MAX_CONTEXT_STRING_LENGTH, context_name, ctx.get_allocator()))) { LOG_WARN("failed to check param 0", K(ret)); } else if (OB_ISNULL(schema_guard)) { ret = OB_ERR_UNEXPECTED; @@ -122,10 +122,10 @@ int ObDBMSSession::clear_context(sql::ObExecContext &ctx, ctx_schema->get_schema_name()))) { LOG_WARN("failed to check privileges", K(ret)); } else if (OB_FAIL(check_client_id(params.at(1), - OB_MAX_CONTEXT_CLIENT_IDENTIFIER_LENGTH_IN_SESSION, client_id))) { + OB_MAX_CONTEXT_CLIENT_IDENTIFIER_LENGTH_IN_SESSION, client_id, ctx.get_allocator()))) { LOG_WARN("failed to check param 1", K(ret)); } else if (OB_FAIL(check_argument(params.at(2), true, true, 2, - OB_MAX_CONTEXT_STRING_LENGTH, attribute))) { + OB_MAX_CONTEXT_STRING_LENGTH, attribute, ctx.get_allocator()))) { LOG_WARN("failed to check param 2", K(ret)); } else { if (ACCESSED_GLOBALLY == ctx_schema->get_context_type()) { @@ -203,7 +203,7 @@ int ObDBMSSession::set_context(sql::ObExecContext &ctx, ret = OB_ERR_WRONG_FUNC_ARGUMENTS_TYPE; LOG_USER_ERROR(OB_ERR_WRONG_FUNC_ARGUMENTS_TYPE, func_name.length(), func_name.ptr()); } else if (OB_FAIL(check_argument(params.at(0), false, true, 0, - OB_MAX_CONTEXT_STRING_LENGTH, context_name))) { + OB_MAX_CONTEXT_STRING_LENGTH, context_name, ctx.get_allocator()))) { LOG_WARN("failed to check param 0", K(ret)); } else if (OB_ISNULL(schema_guard)) { ret = OB_ERR_UNEXPECTED; @@ -219,18 +219,18 @@ int ObDBMSSession::set_context(sql::ObExecContext &ctx, ctx_schema->get_schema_name()))) { LOG_WARN("failed to check privileges", K(ret)); } else if (OB_FAIL(check_argument(params.at(1), false, true, 1, - OB_MAX_CONTEXT_STRING_LENGTH, attribute))) { + OB_MAX_CONTEXT_STRING_LENGTH, attribute, ctx.get_allocator()))) { LOG_WARN("failed to check param 1", K(ret)); } else if (OB_FAIL(check_argument(params.at(2), true, false, 2, - OB_MAX_CONTEXT_VALUE_LENGTH, value))) { + OB_MAX_CONTEXT_VALUE_LENGTH, value, ctx.get_allocator()))) { LOG_WARN("failed to check param 2", K(ret)); } else { if (ACCESSED_GLOBALLY == ctx_schema->get_context_type()) { if (OB_FAIL(check_argument(params.at(3), true, true, 3, - OB_MAX_CONTEXT_STRING_LENGTH, username))) { + OB_MAX_CONTEXT_STRING_LENGTH, username, ctx.get_allocator()))) { LOG_WARN("failed to check param 3", K(ret)); } else if (OB_FAIL(check_client_id(params.at(4), - OB_MAX_CONTEXT_CLIENT_IDENTIFIER_LENGTH_IN_SESSION, client_id))) { + OB_MAX_CONTEXT_CLIENT_IDENTIFIER_LENGTH_IN_SESSION, client_id, ctx.get_allocator()))) { LOG_WARN("failed to check param 4", K(ret)); } else { if (client_id.empty()) { @@ -328,7 +328,8 @@ int ObDBMSSession::reset_package(sql::ObExecContext &ctx, int ObDBMSSession::check_argument(const ObObj &input_param, bool allow_null, bool need_case_up, int32_t param_idx, - int64_t max_len, ObString &output_param) + int64_t max_len, ObString &output_param, + ObIAllocator &alloc) { int ret = OB_SUCCESS; if (input_param.is_null()) { @@ -347,14 +348,17 @@ int ObDBMSSession::check_argument(const ObObj &input_param, bool allow_null, ret = OB_ERR_INVALID_INPUT_ARGUMENT; LOG_USER_ERROR(OB_ERR_INVALID_INPUT_ARGUMENT, param_idx + 1); } else if (need_case_up) { - try_caseup(input_param.get_collation_type(), output_param); + if (OB_FAIL(try_caseup(input_param.get_collation_type(), output_param, alloc))) { + LOG_WARN("failed to case up", K(ret)); + } } return ret; } int ObDBMSSession::check_client_id(const ObObj &input_param, int64_t max_len, - ObString &output_param) + ObString &output_param, + ObIAllocator &alloc) { int ret = OB_SUCCESS; if (input_param.is_null()) { @@ -367,21 +371,26 @@ int ObDBMSSession::check_client_id(const ObObj &input_param, } else if (output_param.length() > max_len) { ret = OB_ERR_CLIENT_IDENTIFIER_TOO_LONG; LOG_USER_ERROR(OB_ERR_CLIENT_IDENTIFIER_TOO_LONG); - } else { - try_caseup(input_param.get_collation_type(), output_param); + } else if (OB_FAIL(try_caseup(input_param.get_collation_type(), output_param, alloc))) { + LOG_WARN("failed to case up", K(ret)); } return ret; } -void ObDBMSSession::try_caseup(ObCollationType cs_type, ObString &str_val) +int ObDBMSSession::try_caseup(ObCollationType cs_type, ObString &str_val, ObIAllocator &alloc) { + int ret = OB_SUCCESS; + ObString dest; if (!str_val.empty()) { if (str_val.ptr()[0] == '\"' && str_val.ptr()[str_val.length() - 1] == '\"') { str_val.assign(str_val.ptr() + 1, str_val.length() - 2); + } else if (OB_FAIL(ObCharset::caseup(cs_type, str_val, dest, alloc))) { + LOG_WARN("failed to case up", K(ret)); } else { - ObCharset::caseup(cs_type, str_val); + str_val = dest; } } + return ret; } int ObDBMSSession::check_privileges(pl::ObPLContext *pl_ctx, diff --git a/src/pl/sys_package/ob_dbms_session.h b/src/pl/sys_package/ob_dbms_session.h index 5f66a51a1..f411760e0 100644 --- a/src/pl/sys_package/ob_dbms_session.h +++ b/src/pl/sys_package/ob_dbms_session.h @@ -39,11 +39,13 @@ public: private: static int check_argument(const ObObj &input_param, bool allow_null, bool need_case_up, int32_t param_idx, - int64_t max_len, ObString &output_param); + int64_t max_len, ObString &output_param, + ObIAllocator &alloc); static int check_client_id(const ObObj &input_param, int64_t max_len, - ObString &output_param); - static void try_caseup(ObCollationType cs_type, ObString &str_val); + ObString &output_param, + ObIAllocator &alloc); + static int try_caseup(ObCollationType cs_type, ObString &str_val, ObIAllocator &alloc); static int check_privileges(ObPLContext *pl_ctx, const ObString &package_name,