From 68cc172f555363c059591bc94c4eff162d584e60 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 21 Jun 2022 11:01:10 +0800 Subject: [PATCH] [CP] fix spj bug when select exprs contain enum type --- src/sql/resolver/expr/ob_raw_expr_wrap_enum_set.cpp | 2 ++ src/sql/rewrite/ob_transformer_impl.cpp | 10 +++++++++- src/sql/rewrite/ob_transformer_impl.h | 6 ++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/sql/resolver/expr/ob_raw_expr_wrap_enum_set.cpp b/src/sql/resolver/expr/ob_raw_expr_wrap_enum_set.cpp index f34c33d40..af9270fc3 100644 --- a/src/sql/resolver/expr/ob_raw_expr_wrap_enum_set.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_wrap_enum_set.cpp @@ -865,6 +865,8 @@ int ObRawExprWrapEnumSet::visit_query_ref_expr( } else if (NULL != new_expr) { // replace with new wrapped expr ref_stmt->get_select_item(0).expr_ = new_expr; + expr.get_column_types().at(0) = new_expr->get_result_type(); + LOG_TRACE("succeed to wrap enum to str", K(dest_type), K(*new_expr), K(expr)); } else { /*do nothing*/ } } diff --git a/src/sql/rewrite/ob_transformer_impl.cpp b/src/sql/rewrite/ob_transformer_impl.cpp index ff7cdb771..1d0437074 100644 --- a/src/sql/rewrite/ob_transformer_impl.cpp +++ b/src/sql/rewrite/ob_transformer_impl.cpp @@ -313,7 +313,7 @@ int ObTransformerImpl::choose_rewrite_rules(ObDMLStmt* stmt, uint64_t& need_type LOG_WARN("failed to check stmt functions", K(ret)); } else { // TODO::unpivot open - if (func.contain_unpivot_query_) { + if (func.contain_unpivot_query_ || func.contain_enum_set_values_) { disable_list = ObTransformRule::ALL_TRANSFORM_RULES; } if (func.contain_sequence_) { @@ -345,6 +345,14 @@ int ObTransformerImpl::check_stmt_functions(ObDMLStmt* stmt, StmtFunc& func) func.contain_for_update_ = func.contain_for_update_ || has_for_update; func.contain_unpivot_query_ = func.contain_unpivot_query_ || stmt->is_unpivot_select(); } + for (int64_t i = 0; OB_SUCC(ret) && !func.contain_enum_set_values_ && i < stmt->get_column_items().count(); ++i) { + const ColumnItem &col = stmt->get_column_items().at(i); + if (OB_ISNULL(col.get_expr())) { + ret = OB_ERR_UNEXPECTED; + } else if (ob_is_enumset_tc(col.get_expr()->get_data_type())) { + func.contain_enum_set_values_ = true; + } + } if (OB_SUCC(ret) && (stmt->is_delete_stmt() || stmt->is_update_stmt() || stmt->is_merge_stmt() || stmt->is_insert_stmt())) { ObDelUpdStmt* del_upd_stmt = static_cast(stmt); diff --git a/src/sql/rewrite/ob_transformer_impl.h b/src/sql/rewrite/ob_transformer_impl.h index 99a34e382..b5ff292c7 100644 --- a/src/sql/rewrite/ob_transformer_impl.h +++ b/src/sql/rewrite/ob_transformer_impl.h @@ -110,13 +110,14 @@ public: contain_for_update_(false), contain_domain_index_(false), update_global_index_(false), - contain_unpivot_query_(false) + contain_unpivot_query_(false), + contain_enum_set_values_(false) {} bool all_found() const { return contain_hie_query_ && contain_sequence_ && contain_for_update_ && contain_domain_index_ && - update_global_index_ && contain_unpivot_query_; + update_global_index_ && contain_unpivot_query_ && contain_enum_set_values_; } bool contain_hie_query_; @@ -125,6 +126,7 @@ public: bool contain_domain_index_; bool update_global_index_; bool contain_unpivot_query_; + bool contain_enum_set_values_; }; int check_stmt_functions(ObDMLStmt* stmt, StmtFunc& func); inline ObTransformerCtx* get_trans_ctx() -- GitLab