From 0ea78d4b60ed785ebc346f7fed18bcfc51e82419 Mon Sep 17 00:00:00 2001 From: wjhh2008 Date: Tue, 9 Apr 2024 12:33:07 +0000 Subject: [PATCH] fix mysql system view cast collation problem --- src/sql/resolver/dml/ob_dml_resolver.cpp | 1 + src/sql/resolver/expr/ob_raw_expr.h | 4 +++- src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 8c2f85c91..7af8fe216 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -1692,6 +1692,7 @@ int ObDMLResolver::resolve_sql_expr(const ParseNode &node, ObRawExpr *&expr, ctx.view_ref_id_ = view_ref_id_; ctx.is_variable_allowed_ = !(is_mysql_mode() && params_.is_from_create_view_); ctx.is_expanding_view_ = params_.is_expanding_view_; + ctx.is_in_system_view_ = params_.is_in_sys_view_; ObRawExprResolverImpl expr_resolver(ctx); ObIArray &user_var_exprs = get_stmt()->get_user_vars(); bool is_multi_stmt = session_info_->get_cur_exec_ctx() != NULL && diff --git a/src/sql/resolver/expr/ob_raw_expr.h b/src/sql/resolver/expr/ob_raw_expr.h index 26dff2486..bf7d4d851 100644 --- a/src/sql/resolver/expr/ob_raw_expr.h +++ b/src/sql/resolver/expr/ob_raw_expr.h @@ -1613,7 +1613,8 @@ struct ObResolveContext tg_timing_event_(TG_TIMING_EVENT_INVALID), view_ref_id_(OB_INVALID_ID), is_variable_allowed_(true), - is_expanding_view_(false) + is_expanding_view_(false), + is_in_system_view_(false) { } @@ -1660,6 +1661,7 @@ struct ObResolveContext uint64_t view_ref_id_; bool is_variable_allowed_; bool is_expanding_view_; + bool is_in_system_view_; }; typedef ObResolveContext ObExprResolveContext; diff --git a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp index 3ad447608..d6b585376 100644 --- a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp @@ -443,6 +443,9 @@ int ObRawExprResolverImpl::do_recursive_resolve(const ParseNode *node, ObRawExpr } else { coll_type = ObCharset::get_default_collation(charset_type); } + } else if (ctx_.is_in_system_view_) { + //for mysql system view, cast char type always has default collation + coll_type = ObCharset::get_system_collation(); } else { // use connection_collation. for cast('a' as char) if (OB_ISNULL(ctx_.session_info_)) {