From a9b7a093d917ef0578e8881afd3fbc3614d99ec9 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 9 Feb 2024 05:44:28 +0000 Subject: [PATCH] Fix hint material related cases --- src/sql/code_generator/ob_static_engine_cg.cpp | 12 ++++++++++-- src/sql/optimizer/ob_logical_operator.cpp | 10 ++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/sql/code_generator/ob_static_engine_cg.cpp b/src/sql/code_generator/ob_static_engine_cg.cpp index 25c1dfbee..73657cbd0 100644 --- a/src/sql/code_generator/ob_static_engine_cg.cpp +++ b/src/sql/code_generator/ob_static_engine_cg.cpp @@ -636,8 +636,16 @@ int ObStaticEngineCG::check_vectorize_supported(bool &support, // dependency and breaks rownum's defination. // ObLogicalOperator *rownum_op = NULL; - if (OB_SUCC(ret) && OB_SUCC(op->find_rownum_expr(op->get_op_id(), rownum_op)) - && rownum_op != NULL && rownum_op != op) { + for (int64_t i = 0; rownum_op == NULL && OB_SUCC(ret) && i < op->get_num_of_child(); i++) { + ObLogicalOperator *child = op->get_child(i); + if (OB_ISNULL(child)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("op child is null", K(ret)); + } else if (OB_FAIL(child->find_rownum_expr(op->get_op_id(), rownum_op))) { + LOG_WARN("find rownum expr error", K(ret)); + } + } + if (NULL != rownum_op) { LOG_DEBUG("rownum expr is in count operator's subplan tree. Stop vectorization exec"); disable_vectorize = true; } diff --git a/src/sql/optimizer/ob_logical_operator.cpp b/src/sql/optimizer/ob_logical_operator.cpp index 6d250f89d..8380dc94f 100644 --- a/src/sql/optimizer/ob_logical_operator.cpp +++ b/src/sql/optimizer/ob_logical_operator.cpp @@ -3165,12 +3165,18 @@ int ObLogicalOperator::alloc_op_post(AllocOpContext& ctx) if (ObAllocOpHint::OB_ALL == alloc_op_hints.at(i).alloc_level_ && OB_FAIL(alloc_nodes_above(ctx, alloc_op_hints.at(i).flags_))) { LOG_WARN("fail to alloc op at all level", K(ret)); - } else if (ObAllocOpHint::OB_DFO == alloc_op_hints.at(i).alloc_level_ && + } + } + for (int64_t i = 0; OB_SUCC(ret) && i < alloc_op_hints.count(); ++i) { + if (ObAllocOpHint::OB_DFO == alloc_op_hints.at(i).alloc_level_ && (log_op_def::LOG_EXCHANGE == type_ && static_cast(this)->is_consumer()) && OB_FAIL(alloc_nodes_above(ctx, alloc_op_hints.at(i).flags_))) { LOG_WARN("fail to alloc op at dfo level", K(ret)); - } else if (ObAllocOpHint::OB_ENUMERATE == alloc_op_hints.at(i).alloc_level_ && + } + } + for (int64_t i = 0; OB_SUCC(ret) && i < alloc_op_hints.count(); ++i) { + if (ObAllocOpHint::OB_ENUMERATE == alloc_op_hints.at(i).alloc_level_ && alloc_op_hints.at(i).id_ == op_id_ && OB_FAIL(alloc_nodes_above(ctx, alloc_op_hints.at(i).flags_))) { LOG_WARN("fail to alloc op at enumerate level", K(ret));