From 75b04d6a2b0f1d2f9a0640df2822f73ad79f02da Mon Sep 17 00:00:00 2001 From: sdc Date: Fri, 13 Oct 2023 03:43:46 +0000 Subject: [PATCH] [CP] fix distinct clob bug --- .../code_generator/ob_static_engine_cg.cpp | 21 ++++++++++++++ src/sql/resolver/dml/ob_select_resolver.cpp | 28 ------------------- src/sql/resolver/dml/ob_select_resolver.h | 1 - 3 files changed, 21 insertions(+), 29 deletions(-) diff --git a/src/sql/code_generator/ob_static_engine_cg.cpp b/src/sql/code_generator/ob_static_engine_cg.cpp index 96ea6291d..78125bd1c 100644 --- a/src/sql/code_generator/ob_static_engine_cg.cpp +++ b/src/sql/code_generator/ob_static_engine_cg.cpp @@ -1037,6 +1037,13 @@ int ObStaticEngineCG::generate_spec( if (OB_ISNULL(raw_expr)) { ret = OB_ERR_UNEXPECTED; LOG_ERROR("null pointer", K(ret)); + } else if (is_oracle_mode() && OB_UNLIKELY(ObLongTextType == raw_expr->get_data_type() + || ObLobType == raw_expr->get_data_type())) { + ret = OB_ERR_INVALID_TYPE_FOR_OP; + LOG_WARN("select distinct lob not allowed", K(ret)); + } else if (is_oracle_mode() && OB_UNLIKELY(ObJsonType == raw_expr->get_data_type())) { + ret = OB_ERR_INVALID_CMP_OP; + LOG_WARN("select distinct json not allowed", K(ret)); } else if (raw_expr->is_const_expr()) { // distinct const value, 这里需要注意:distinct 1被跳过了, // 但ObMergeDistinct中,如果没有distinct列,则默认所有值都相等,这个语义正好是符合预期的。 @@ -1105,6 +1112,13 @@ int ObStaticEngineCG::generate_spec( if (OB_ISNULL(raw_expr)) { ret = OB_ERR_UNEXPECTED; LOG_ERROR("null pointer", K(ret)); + } else if (is_oracle_mode() && OB_UNLIKELY(ObLongTextType == raw_expr->get_data_type() + || ObLobType == raw_expr->get_data_type())) { + ret = OB_ERR_INVALID_TYPE_FOR_OP; + LOG_WARN("select distinct lob not allowed", K(ret)); + } else if (is_oracle_mode() && OB_UNLIKELY(ObJsonType == raw_expr->get_data_type())) { + ret = OB_ERR_INVALID_CMP_OP; + LOG_WARN("select distinct json not allowed", K(ret)); } else if (raw_expr->is_const_expr()) { // distinct const value, 这里需要注意:distinct 1被跳过了, // 但ObMergeDistinct中,如果没有distinct列,则默认所有值都相等,这个语义正好是符合预期的。 @@ -1693,6 +1707,13 @@ int ObStaticEngineCG::fill_sort_funcs( // other udt types not supported, xmltype does not have order or map member function ret = OB_ERR_NO_ORDER_MAP_SQL; LOG_WARN("cannot ORDER objects without MAP or ORDER method", K(ret)); + } else if (is_oracle_mode() && OB_UNLIKELY(ObLongTextType == expr->datum_meta_.type_ + || ObLobType == expr->datum_meta_.type_)) { + ret = OB_ERR_INVALID_TYPE_FOR_OP; + LOG_WARN("order by lob not allowed", K(ret)); + } else if (is_oracle_mode() && OB_UNLIKELY(ObJsonType == expr->datum_meta_.type_)) { + ret = OB_ERR_INVALID_CMP_OP; + LOG_WARN("order by json not allowed", K(ret)); } else { ObSortCmpFunc cmp_func; cmp_func.cmp_func_ = ObDatumFuncs::get_nullsafe_cmp_func(expr->datum_meta_.type_, diff --git a/src/sql/resolver/dml/ob_select_resolver.cpp b/src/sql/resolver/dml/ob_select_resolver.cpp index dc4d977b7..f337ab368 100644 --- a/src/sql/resolver/dml/ob_select_resolver.cpp +++ b/src/sql/resolver/dml/ob_select_resolver.cpp @@ -960,33 +960,6 @@ int ObSelectResolver::check_order_by() return ret; } -int ObSelectResolver::check_field_list() -{ - int ret = OB_SUCCESS; - ObSelectStmt *select_stmt = get_select_stmt(); - if (! is_oracle_mode()) { - } else if (OB_ISNULL(select_stmt)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("select stmt is null", K(ret)); - } else if (select_stmt->has_distinct()) { - common::ObIArray &select_items = select_stmt->get_select_items(); - for (int64_t i = 0; OB_SUCC(ret) && i < select_items.count(); i++) { - ObRawExpr *expr = NULL; - if (OB_ISNULL(expr = select_items.at(i).expr_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("select expr is null", K(ret)); - } else if (ObLongTextType == expr->get_data_type() || ObLobType == expr->get_data_type()) { - ret = OB_ERR_INVALID_TYPE_FOR_OP; - LOG_WARN("select distinct lob not allowed", K(ret)); - } else if (lib::is_oracle_mode() && ObJsonType == expr->get_data_type()) { - ret = OB_ERR_INVALID_CMP_OP; - LOG_WARN("select distinct json not allowed", K(ret)); - } - } - } - return ret; -} - int ObSelectResolver::search_connect_group_by_clause(const ParseNode &parent, const ParseNode *&start_with, const ParseNode *&connect_by, @@ -1175,7 +1148,6 @@ int ObSelectResolver::resolve_normal_query(const ParseNode &parse_tree) OZ( select_stmt->formalize_stmt(session_info_) ); //统一为本层的表达式进行only full group by验证,避免检查的逻辑过于分散 - OZ( check_field_list() ); OZ( check_group_by() ); OZ( check_order_by() ); OZ( check_pseudo_columns() ); diff --git a/src/sql/resolver/dml/ob_select_resolver.h b/src/sql/resolver/dml/ob_select_resolver.h index aa96b7b29..69fd3068b 100644 --- a/src/sql/resolver/dml/ob_select_resolver.h +++ b/src/sql/resolver/dml/ob_select_resolver.h @@ -248,7 +248,6 @@ protected: virtual int check_in_sysview(bool &in_sysview) const override; int check_group_by(); int check_order_by(); - int check_field_list(); int check_pseudo_columns(); int check_grouping_columns(); int check_grouping_columns(ObSelectStmt &stmt, ObRawExpr *&expr);