diff --git a/src/sql/rewrite/ob_transform_simplify_groupby.cpp b/src/sql/rewrite/ob_transform_simplify_groupby.cpp index 38841cb09..1cc85ce0f 100644 --- a/src/sql/rewrite/ob_transform_simplify_groupby.cpp +++ b/src/sql/rewrite/ob_transform_simplify_groupby.cpp @@ -159,7 +159,8 @@ int ObTransformSimplifyGroupby::check_upper_stmt_validity(ObSelectStmt *upper_st LOG_WARN("unexpected null", K(ret)); } else if (!upper_stmt->has_group_by()) { is_valid = false; - } else if (!is_only_full_group_by_on(ctx_->session_info_->get_sql_mode())) { + } else if (!ObTransformUtils::is_full_group_by(*upper_stmt, + ctx_->session_info_->get_sql_mode())) { is_valid = false; } //check condition不存在rownum diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index 0cf61527a..ca7b9f242 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -14836,5 +14836,11 @@ bool ObTransformUtils::is_const_null(ObRawExpr &expr) return bret; } +// if sql is only one row, is_full_group_by skipped checking orderby in resolver. +bool ObTransformUtils::is_full_group_by(ObSelectStmt& stmt, ObSQLMode mode) +{ + return !stmt.has_order_by() && is_only_full_group_by_on(mode); +} + } // namespace sql } // namespace oceanbase diff --git a/src/sql/rewrite/ob_transform_utils.h b/src/sql/rewrite/ob_transform_utils.h index f9539be7c..5d9f170f1 100644 --- a/src/sql/rewrite/ob_transform_utils.h +++ b/src/sql/rewrite/ob_transform_utils.h @@ -1877,6 +1877,7 @@ public: static int pushdown_qualify_filters(ObSelectStmt *stmt); // check if a constant or parameterized constant is NULL. static bool is_const_null(ObRawExpr &expr); + static bool is_full_group_by(ObSelectStmt& stmt, ObSQLMode mode); private: static int inner_get_lazy_left_join(ObDMLStmt *stmt, diff --git a/src/sql/rewrite/ob_transform_win_magic.cpp b/src/sql/rewrite/ob_transform_win_magic.cpp index c04bced3a..229f04cf6 100644 --- a/src/sql/rewrite/ob_transform_win_magic.cpp +++ b/src/sql/rewrite/ob_transform_win_magic.cpp @@ -1971,14 +1971,30 @@ int ObTransformWinMagic::push_down_join(ObDMLStmt *main_stmt, ObSelectStmt *view_stmt = NULL; ObSEArray renamed_cond; ObSEArray part_exprs; + ObSEArray view_select_list; + ObSEArray view_column_list; + ObSEArray query_refs; + ObSEArray old_column; + ObSEArray new_column; if (OB_ISNULL(main_stmt) || OB_ISNULL(view_table) || OB_ISNULL(push_down_table) || - OB_ISNULL(view_stmt = view_table->ref_query_)) { + OB_ISNULL(view_stmt = view_table->ref_query_) || OB_ISNULL(ctx_) || OB_ISNULL(ctx_->expr_factory_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("pointer is null", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::rename_subquery_pushdown_filter(*main_stmt, *view_stmt, view_table->table_id_, - ctx_->session_info_, *ctx_->expr_factory_, - cond_to_push_down, renamed_cond))) { - LOG_WARN("rename subuqery push down filter failed", K(ret)); + } else if (OB_FAIL(ObTransformUtils::extract_query_ref_expr(cond_to_push_down, query_refs))) { + LOG_WARN("failed to extract subquery", K(ret)); + } else if (OB_FAIL(main_stmt->get_view_output(*view_table, view_select_list, view_column_list))) { + LOG_WARN("get view output failed", K(ret)); + } else { + ObRawExprCopier copier(*ctx_->expr_factory_); + if (OB_FAIL(copier.add_replaced_expr(view_column_list, view_select_list))) { + LOG_WARN("failed to add exprs", K(ret)); + } else if (OB_FAIL(copier.add_skipped_expr(query_refs, false))) { + LOG_WARN("failed to add skipped expr", K(ret)); + } else if (OB_FAIL(copier.copy_on_replace(cond_to_push_down, renamed_cond))) { + LOG_WARN("failed to copy on replace filters", K(ret)); + } + } + if (OB_FAIL(ret)) { } else if (OB_FAIL(ObTransformUtils::add_table_item(view_stmt, push_down_table))) { LOG_WARN("add table item failed", K(ret)); } else if (OB_FAIL(append(view_stmt->get_condition_exprs(), renamed_cond))) { @@ -1996,11 +2012,8 @@ int ObTransformWinMagic::push_down_join(ObDMLStmt *main_stmt, } else if (!part_exprs.empty() && OB_FAIL(view_stmt->set_part_expr_items(part_exprs))) { LOG_WARN("failed to set part expr item", K(ret)); } else if (OB_FAIL(main_stmt->remove_part_expr_items(push_down_table->table_id_))) { - LOG_WARN("failed to remove part epxr", K(ret)); + LOG_WARN("failed to remove part epxr", K(ret)); } - - ObSEArray old_column; - ObSEArray new_column; for (int64_t i = 0; OB_SUCC(ret) && i < main_stmt->get_column_size(); i++) { if (OB_ISNULL(main_stmt->get_column_item(i)) || OB_ISNULL(main_stmt->get_column_item(i)->expr_)) { ret = OB_ERR_UNEXPECTED;