From 42a2e24f495d35bfee44e36d50a67f66aae28d4c Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 2 Dec 2022 12:38:02 +0000 Subject: [PATCH] fix merge set op do not assign last_left_idx leads core --- src/sql/engine/set/ob_merge_except_op.cpp | 4 ++-- src/sql/engine/set/ob_merge_intersect_op.cpp | 7 +++++-- src/sql/engine/set/ob_merge_set_op.cpp | 3 +++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/sql/engine/set/ob_merge_except_op.cpp b/src/sql/engine/set/ob_merge_except_op.cpp index 4b8d78e7f7..2ef31eab59 100644 --- a/src/sql/engine/set/ob_merge_except_op.cpp +++ b/src/sql/engine/set/ob_merge_except_op.cpp @@ -143,7 +143,7 @@ int ObMergeExceptOp::inner_get_next_batch(const int64_t max_row_cnt) clear_evaluated_flag(); const ObBatchRows *left_brs = nullptr; int64_t curr_left_idx = 0; - int64_t last_left_idx = 0; + int64_t last_left_idx = -1; if (OB_FAIL(left_->get_next_batch(batch_size, left_brs))) { LOG_WARN("failed to get next batch", K(ret)); } else if (left_brs->end_ && 0 == left_brs->size_) { @@ -225,7 +225,7 @@ int ObMergeExceptOp::inner_get_next_batch(const int64_t max_row_cnt) LOG_WARN("failed to convert batch", K(ret)); } else if (left_brs->end_) { brs_.end_ = true; - } else if (last_left_idx == left_brs->size_) { + } else if (last_left_idx == left_brs->size_ || last_left_idx < 0) { // empty batch } else if (OB_UNLIKELY(left_brs->skip_->at(last_left_idx))) { ret = OB_ERR_UNEXPECTED; diff --git a/src/sql/engine/set/ob_merge_intersect_op.cpp b/src/sql/engine/set/ob_merge_intersect_op.cpp index 635cae90a5..e2aab75a17 100644 --- a/src/sql/engine/set/ob_merge_intersect_op.cpp +++ b/src/sql/engine/set/ob_merge_intersect_op.cpp @@ -140,7 +140,7 @@ int ObMergeIntersectOp::inner_get_next_batch(const int64_t max_row_cnt) clear_evaluated_flag(); const ObBatchRows *left_brs = nullptr; int64_t curr_left_idx = 0; - int64_t last_left_idx = 0; + int64_t last_left_idx = -1; if (OB_FAIL(left_->get_next_batch(batch_size, left_brs))) { LOG_WARN("failed to get next batch", K(ret)); } else if (left_brs->end_ && 0 == left_brs->size_) { @@ -215,8 +215,11 @@ int ObMergeIntersectOp::inner_get_next_batch(const int64_t max_row_cnt) LOG_WARN("failed to convert batch", K(ret)); } else if (right_iter_end_) { brs_.end_ = true; - } else if (last_left_idx == left_brs->size_) { + } else if (last_left_idx == left_brs->size_ || last_left_idx < 0) { // empty batch + } else if (OB_UNLIKELY(left_brs->skip_->at(last_left_idx))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get wrong last row", K(last_left_idx), K(curr_left_idx), K(ret)); } else { ObEvalCtx::BatchInfoScopeGuard batch_info_guard(eval_ctx_); batch_info_guard.set_batch_idx(last_left_idx); diff --git a/src/sql/engine/set/ob_merge_set_op.cpp b/src/sql/engine/set/ob_merge_set_op.cpp index d3bbf1dbb9..4dce9193ea 100644 --- a/src/sql/engine/set/ob_merge_set_op.cpp +++ b/src/sql/engine/set/ob_merge_set_op.cpp @@ -368,6 +368,9 @@ int ObMergeSetOp::locate_next_left_inside(ObOperator &child_op, && OB_FAIL(cmp_(*last_row_.store_row_, child_op.get_spec().output_, curr_idx, eval_ctx_, cmp))) { LOG_WARN("failed to compare row", K(ret)); + } else if (last_idx < 0) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get wrong last idx", K(ret)); } else if (nullptr == last_row_.store_row_ && OB_FAIL(cmp_(child_op.get_spec().output_, child_op.get_spec().output_, last_idx, curr_idx, eval_ctx_, cmp))) {