diff --git a/src/sql/engine/set/ob_hash_except_op.cpp b/src/sql/engine/set/ob_hash_except_op.cpp index f21223ff0b422f346503683b5536c67f029abb47..66ae454768aaf3a4b252c07d09693937af660f62 100644 --- a/src/sql/engine/set/ob_hash_except_op.cpp +++ b/src/sql/engine/set/ob_hash_except_op.cpp @@ -97,7 +97,9 @@ int ObHashExceptOp::inner_get_next_row() const ObChunkDatumStore::StoredRow* store_row = nullptr; const common::ObIArray* cur_exprs = nullptr; clear_evaluated_flag(); - if (first_get_left_) { + if (iter_end_) { + ret = OB_ITER_END; + } else if (first_get_left_) { if (OB_FAIL(is_left_has_row(left_has_row))) { LOG_WARN("failed to judge left has row", K(ret)); } else if (!left_has_row) { @@ -178,6 +180,9 @@ int ObHashExceptOp::inner_get_next_row() LOG_WARN("copy current row failed", K(ret)); } } + if (OB_ITER_END == ret) { + iter_end_ = true; + } return ret; } diff --git a/src/sql/engine/set/ob_hash_intersect_op.cpp b/src/sql/engine/set/ob_hash_intersect_op.cpp index 29050f2f3625c207e453159b870b02e85b5bf4c6..6c02fac1e1d21173f4e1dccbe430f2d76fd41ef1 100644 --- a/src/sql/engine/set/ob_hash_intersect_op.cpp +++ b/src/sql/engine/set/ob_hash_intersect_op.cpp @@ -84,7 +84,9 @@ int ObHashIntersectOp::inner_get_next_row() const ObHashPartCols* part_cols = nullptr; const common::ObIArray* cur_exprs = nullptr; clear_evaluated_flag(); - if (first_get_left_) { + if (iter_end_) { + ret = OB_ITER_END; + } else if (first_get_left_) { if (OB_FAIL(is_left_has_row(left_has_row))) { LOG_WARN("failed to judge left has row", K(ret)); } else if (!left_has_row) { @@ -164,6 +166,9 @@ int ObHashIntersectOp::inner_get_next_row() LOG_WARN("copy current row failed", K(ret)); } } + if (OB_ITER_END == ret) { + iter_end_ = true; + } return ret; } diff --git a/src/sql/engine/set/ob_hash_set_op.cpp b/src/sql/engine/set/ob_hash_set_op.cpp index 8f242b8a78422ee99724bd628fadf286e952e7f5..83f651e00b08000ae6f07447a60e646ad3a86d3f 100644 --- a/src/sql/engine/set/ob_hash_set_op.cpp +++ b/src/sql/engine/set/ob_hash_set_op.cpp @@ -32,7 +32,8 @@ ObHashSetOp::ObHashSetOp(ObExecContext& exec_ctx, const ObOpSpec& spec, ObOpInpu has_got_part_(false), profile_(ObSqlWorkAreaType::HASH_WORK_AREA), sql_mem_processor_(profile_), - hp_infras_() + hp_infras_(), + iter_end_(false) {} int ObHashSetOp::inner_open() @@ -52,6 +53,7 @@ void ObHashSetOp::reset() first_get_left_ = true; has_got_part_ = false; hp_infras_.reset(); + iter_end_ = false; } int ObHashSetOp::inner_close() diff --git a/src/sql/engine/set/ob_hash_set_op.h b/src/sql/engine/set/ob_hash_set_op.h index ac4a70036891eef897dc3c3cfdfb79556602abf9..eb64dfaf313f8e41ddf25662e4ba4890c01a5799 100644 --- a/src/sql/engine/set/ob_hash_set_op.h +++ b/src/sql/engine/set/ob_hash_set_op.h @@ -58,6 +58,7 @@ protected: ObSqlWorkAreaProfile profile_; ObSqlMemMgrProcessor sql_mem_processor_; ObHashPartInfrastructure hp_infras_; + bool iter_end_; }; } // end namespace sql diff --git a/src/sql/engine/set/ob_hash_union_op.cpp b/src/sql/engine/set/ob_hash_union_op.cpp index 6994a4da691380b2c6c899d66ce79d523960b1f0..3e988757c207d5d7a9e81227ed87e9e778cff3a4 100644 --- a/src/sql/engine/set/ob_hash_union_op.cpp +++ b/src/sql/engine/set/ob_hash_union_op.cpp @@ -91,6 +91,8 @@ int ObHashUnionOp::inner_get_next_row() LOG_WARN("failed to get next row", K(ret)); } first_get_left_ = false; + } else if (iter_end_) { + ret = OB_ITER_END; } bool got_row = false; bool has_exists = false; @@ -145,6 +147,9 @@ int ObHashUnionOp::inner_get_next_row() LOG_WARN("copy current row failed", K(ret)); } } + if (OB_ITER_END == ret) { + iter_end_ = true; + } return ret; } diff --git a/src/sql/engine/set/ob_merge_except_op.cpp b/src/sql/engine/set/ob_merge_except_op.cpp index 5ed1401d88e37c3fbc84b90be62321446604b92b..b68ca338aab6b0c3e0dbec59759a70a83bc09346 100644 --- a/src/sql/engine/set/ob_merge_except_op.cpp +++ b/src/sql/engine/set/ob_merge_except_op.cpp @@ -72,6 +72,9 @@ int ObMergeExceptOp::inner_get_next_row() bool break_outer_loop = false; const ObIArray* left_row = NULL; clear_evaluated_flag(); + if (iter_end_) { + ret = OB_ITER_END; + } while (OB_SUCC(ret) && OB_SUCC(do_strict_distinct(*left_, last_row_.store_row_, left_row))) { break_outer_loop = right_iter_end_; while (OB_SUCC(ret) && !right_iter_end_) { @@ -120,6 +123,8 @@ int ObMergeExceptOp::inner_get_next_row() } else if (OB_FAIL(last_row_.save_store_row(*left_row, eval_ctx_, 0))) { LOG_WARN("failed to save right row", K(ret)); } + } else if (OB_ITER_END == ret) { + iter_end_ = true; } return ret; } diff --git a/src/sql/engine/set/ob_merge_intersect_op.cpp b/src/sql/engine/set/ob_merge_intersect_op.cpp index 373a756001fc279039bb8014669b5e3a435ae799..5577f2a28fbcca7fce4b47bba1326575af02942b 100644 --- a/src/sql/engine/set/ob_merge_intersect_op.cpp +++ b/src/sql/engine/set/ob_merge_intersect_op.cpp @@ -71,6 +71,9 @@ int ObMergeIntersectOp::inner_get_next_row() int cmp = 0; bool break_outer_loop = false; const ObIArray* left_row = NULL; + if (iter_end_) { + ret = OB_ITER_END; + } clear_evaluated_flag(); while (OB_SUCC(ret) && OB_SUCC(do_strict_distinct(*left_, last_row_.store_row_, left_row))) { while (OB_SUCC(ret) && !right_iter_end_) { @@ -111,6 +114,8 @@ int ObMergeIntersectOp::inner_get_next_row() } else if (OB_FAIL(last_row_.save_store_row(*left_row, eval_ctx_, 0))) { LOG_WARN("failed to save right row", K(ret)); } + } else if (OB_ITER_END == ret) { + iter_end_ = true; } return ret; } diff --git a/src/sql/engine/set/ob_merge_set_op.cpp b/src/sql/engine/set/ob_merge_set_op.cpp index bb1f6dd3a50a6d7ff2c23643a8893dd5132ee7e9..4cbaa8ef6f22773f0bc1cf1aebf18aac08740f02 100644 --- a/src/sql/engine/set/ob_merge_set_op.cpp +++ b/src/sql/engine/set/ob_merge_set_op.cpp @@ -28,7 +28,8 @@ ObMergeSetOp::ObMergeSetOp(ObExecContext& exec_ctx, const ObOpSpec& spec, ObOpIn alloc_(ObModIds::OB_SQL_MERGE_GROUPBY, OB_MALLOC_NORMAL_BLOCK_SIZE, OB_SERVER_TENANT_ID, ObCtxIds::WORK_AREA), last_row_(alloc_), cmp_(), - need_skip_init_row_(false) + need_skip_init_row_(false), + iter_end_(false) {} int ObMergeSetOp::inner_open() @@ -57,6 +58,7 @@ int ObMergeSetOp::rescan() last_row_.reset(); alloc_.reset(); need_skip_init_row_ = false; + iter_end_ = false; if (OB_FAIL(ObOperator::rescan())) { LOG_WARN("failed to rescan", K(ret)); } diff --git a/src/sql/engine/set/ob_merge_set_op.h b/src/sql/engine/set/ob_merge_set_op.h index 9c2ea18f994c5cefded3c227c7c456f54d2eb024..34fbd27b8d23f93d3f08383ed4ff46e78c4f70fd 100644 --- a/src/sql/engine/set/ob_merge_set_op.h +++ b/src/sql/engine/set/ob_merge_set_op.h @@ -73,6 +73,7 @@ protected: ObChunkDatumStore::LastStoredRow<> last_row_; Compare cmp_; bool need_skip_init_row_; + bool iter_end_; }; template diff --git a/src/sql/engine/set/ob_merge_union_op.cpp b/src/sql/engine/set/ob_merge_union_op.cpp index eff2827beb3ddd6157cd18ad45e8c2acf5a82dc7..0df530d401ebdcfb29af0d65f52338ebcb9e4554 100644 --- a/src/sql/engine/set/ob_merge_union_op.cpp +++ b/src/sql/engine/set/ob_merge_union_op.cpp @@ -282,9 +282,13 @@ int ObMergeUnionOp::inner_get_next_row() if (OB_ISNULL(get_next_row_func_)) { ret = OB_ERR_UNEXPECTED; LOG_ERROR("get_next_row_func is NULL", K(ret)); + } else if (iter_end_) { + ret = OB_ITER_END; } else if (OB_FAIL((this->*get_next_row_func_)())) { if (OB_ITER_END != ret) { LOG_WARN("get next row failed", K(ret)); + } else { + iter_end_ = true; } } return ret;