From e4415822c8d37571a2c044bc74a623db50794ecf Mon Sep 17 00:00:00 2001 From: akaError Date: Wed, 13 Sep 2023 07:10:33 +0000 Subject: [PATCH] fix bug: update set should report error when charset convert error --- src/sql/engine/expr/ob_expr_column_conv.cpp | 13 ++----------- src/sql/resolver/dml/ob_dml_resolver.cpp | 2 +- src/sql/resolver/expr/ob_raw_expr_util.cpp | 13 ++++++++++--- src/sql/resolver/expr/ob_raw_expr_util.h | 6 ++++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/sql/engine/expr/ob_expr_column_conv.cpp b/src/sql/engine/expr/ob_expr_column_conv.cpp index 6a8f77b834..e8360744d1 100644 --- a/src/sql/engine/expr/ob_expr_column_conv.cpp +++ b/src/sql/engine/expr/ob_expr_column_conv.cpp @@ -284,18 +284,9 @@ int ObExprColumnConv::calc_result_typeN(ObExprResType &type, ret = OB_ERR_INVALID_TYPE_FOR_OP; LOG_WARN("inconsistent datatypes", "expected", type_tc, "got", value_tc); } else { - bool is_ddl = const_cast(type_ctx.get_session())->get_ddl_info().is_ddl(); type_ctx.set_cast_mode(type_ctx.get_cast_mode() | - type_ctx.get_raw_expr()->get_extra() | - CM_COLUMN_CONVERT); - if (!is_ddl) { - bool is_strict = is_strict_mode(type_ctx.get_session()->get_sql_mode()); - if (lib::is_mysql_mode() && is_strict) { - //do nothing - } else { - type_ctx.set_cast_mode(type_ctx.get_cast_mode() | CM_CHARSET_CONVERT_IGNORE_ERR); - } - } + type_ctx.get_raw_expr()->get_extra() | + CM_COLUMN_CONVERT); types[4].set_calc_meta(type); } } diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 23a759e354..a23fc80369 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -7524,7 +7524,7 @@ int ObDMLResolver::resolve_generated_column_expr(const ObString &expr_str, LOG_WARN("formailize column reference expr failed", K(ret)); } else if (ObRawExprUtils::need_column_conv(column.get_result_type(), *ref_expr)) { if (OB_FAIL(ObRawExprUtils::build_column_conv_expr(*expr_factory, *allocator_, - column, ref_expr, session_info))) { + column, ref_expr, session_info, used_for_generated_column))) { LOG_WARN("build column convert expr failed", K(ret)); } } diff --git a/src/sql/resolver/expr/ob_raw_expr_util.cpp b/src/sql/resolver/expr/ob_raw_expr_util.cpp index b92424802a..f2d8fdc758 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_util.cpp @@ -4547,7 +4547,8 @@ int ObRawExprUtils::build_column_conv_expr(ObRawExprFactory &expr_factory, common::ObIAllocator &allocator, const ObColumnRefRawExpr &col_ref, ObRawExpr *&expr, - const ObSQLSessionInfo *session_info) + const ObSQLSessionInfo *session_info, + bool is_generated_column) { int ret = OB_SUCCESS; ObString column_conv_info; @@ -4584,7 +4585,7 @@ int ObRawExprUtils::build_column_conv_expr(ObRawExprFactory &expr_factory, !col_ref.is_not_null_for_write(), &column_conv_info, &col_ref.get_enum_set_values(), - expr))) { + expr, false, is_generated_column))) { LOG_WARN("fail to build column convert expr", K(ret)); } } @@ -4600,7 +4601,8 @@ int ObRawExprUtils::build_column_conv_expr(const ObSQLSessionInfo *session_info, const common::ObString *column_conv_info, const ObIArray *type_infos, ObRawExpr *&expr, - bool is_in_pl) + bool is_in_pl, + bool is_generated_column) { int ret = OB_SUCCESS; ObObjType dest_type = type; @@ -4681,12 +4683,17 @@ int ObRawExprUtils::build_column_conv_expr(const ObSQLSessionInfo *session_info, stmt::StmtType stmt_type_bak = stmt::T_NONE; if (OB_SUCC(ret)) { stmt_type_bak = session_info->get_stmt_type(); + bool is_ddl = const_cast(session_info)->get_ddl_info().is_ddl(); + bool is_strict = lib::is_mysql_mode() && is_strict_mode(session_info->get_sql_mode()); + bool ignore_charset_error = is_generated_column && stmt_type_bak==stmt::T_SELECT; (const_cast(session_info))->set_stmt_type(stmt::T_NONE); if (OB_FAIL(ObSQLUtils::get_default_cast_mode(false,/* explicit_cast */ 0, /* result_flag */ session_info, def_cast_mode))) { LOG_WARN("fail to get_default_cast_mode", K(ret)); + } else if ((!is_ddl && !is_strict) || ignore_charset_error ) { + def_cast_mode |= CM_CHARSET_CONVERT_IGNORE_ERR; } } if (OB_SUCC(ret)) { diff --git a/src/sql/resolver/expr/ob_raw_expr_util.h b/src/sql/resolver/expr/ob_raw_expr_util.h index 2e10f25e3e..d20ed95964 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.h +++ b/src/sql/resolver/expr/ob_raw_expr_util.h @@ -558,7 +558,8 @@ public: common::ObIAllocator &allocator, const ObColumnRefRawExpr &col_expr, ObRawExpr *&expr, - const ObSQLSessionInfo *session_info); + const ObSQLSessionInfo *session_info, + bool is_generated_column = false); static int build_column_conv_expr(const ObSQLSessionInfo *session_info, ObRawExprFactory &expr_factory, const common::ObObjType &type, @@ -568,7 +569,8 @@ public: const common::ObString *column_conv_info, const common::ObIArray *type_infos, ObRawExpr *&expr, - bool is_in_pl = false); + bool is_in_pl = false, + bool is_generated_column = false); static int build_var_int_expr(ObRawExprFactory &expr_factory, ObConstRawExpr *&expr); static int build_default_expr(ObRawExprFactory &expr_factory,