adjust set op to reentrant
This commit is contained in:
@ -97,7 +97,9 @@ int ObHashExceptOp::inner_get_next_row()
|
|||||||
const ObChunkDatumStore::StoredRow* store_row = nullptr;
|
const ObChunkDatumStore::StoredRow* store_row = nullptr;
|
||||||
const common::ObIArray<ObExpr*>* cur_exprs = nullptr;
|
const common::ObIArray<ObExpr*>* cur_exprs = nullptr;
|
||||||
clear_evaluated_flag();
|
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))) {
|
if (OB_FAIL(is_left_has_row(left_has_row))) {
|
||||||
LOG_WARN("failed to judge left has row", K(ret));
|
LOG_WARN("failed to judge left has row", K(ret));
|
||||||
} else if (!left_has_row) {
|
} else if (!left_has_row) {
|
||||||
@ -178,6 +180,9 @@ int ObHashExceptOp::inner_get_next_row()
|
|||||||
LOG_WARN("copy current row failed", K(ret));
|
LOG_WARN("copy current row failed", K(ret));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (OB_ITER_END == ret) {
|
||||||
|
iter_end_ = true;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -84,7 +84,9 @@ int ObHashIntersectOp::inner_get_next_row()
|
|||||||
const ObHashPartCols* part_cols = nullptr;
|
const ObHashPartCols* part_cols = nullptr;
|
||||||
const common::ObIArray<ObExpr*>* cur_exprs = nullptr;
|
const common::ObIArray<ObExpr*>* cur_exprs = nullptr;
|
||||||
clear_evaluated_flag();
|
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))) {
|
if (OB_FAIL(is_left_has_row(left_has_row))) {
|
||||||
LOG_WARN("failed to judge left has row", K(ret));
|
LOG_WARN("failed to judge left has row", K(ret));
|
||||||
} else if (!left_has_row) {
|
} else if (!left_has_row) {
|
||||||
@ -164,6 +166,9 @@ int ObHashIntersectOp::inner_get_next_row()
|
|||||||
LOG_WARN("copy current row failed", K(ret));
|
LOG_WARN("copy current row failed", K(ret));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (OB_ITER_END == ret) {
|
||||||
|
iter_end_ = true;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -32,7 +32,8 @@ ObHashSetOp::ObHashSetOp(ObExecContext& exec_ctx, const ObOpSpec& spec, ObOpInpu
|
|||||||
has_got_part_(false),
|
has_got_part_(false),
|
||||||
profile_(ObSqlWorkAreaType::HASH_WORK_AREA),
|
profile_(ObSqlWorkAreaType::HASH_WORK_AREA),
|
||||||
sql_mem_processor_(profile_),
|
sql_mem_processor_(profile_),
|
||||||
hp_infras_()
|
hp_infras_(),
|
||||||
|
iter_end_(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
int ObHashSetOp::inner_open()
|
int ObHashSetOp::inner_open()
|
||||||
@ -52,6 +53,7 @@ void ObHashSetOp::reset()
|
|||||||
first_get_left_ = true;
|
first_get_left_ = true;
|
||||||
has_got_part_ = false;
|
has_got_part_ = false;
|
||||||
hp_infras_.reset();
|
hp_infras_.reset();
|
||||||
|
iter_end_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ObHashSetOp::inner_close()
|
int ObHashSetOp::inner_close()
|
||||||
|
|||||||
@ -58,6 +58,7 @@ protected:
|
|||||||
ObSqlWorkAreaProfile profile_;
|
ObSqlWorkAreaProfile profile_;
|
||||||
ObSqlMemMgrProcessor sql_mem_processor_;
|
ObSqlMemMgrProcessor sql_mem_processor_;
|
||||||
ObHashPartInfrastructure<ObHashPartCols, ObHashPartStoredRow> hp_infras_;
|
ObHashPartInfrastructure<ObHashPartCols, ObHashPartStoredRow> hp_infras_;
|
||||||
|
bool iter_end_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace sql
|
} // end namespace sql
|
||||||
|
|||||||
@ -91,6 +91,8 @@ int ObHashUnionOp::inner_get_next_row()
|
|||||||
LOG_WARN("failed to get next row", K(ret));
|
LOG_WARN("failed to get next row", K(ret));
|
||||||
}
|
}
|
||||||
first_get_left_ = false;
|
first_get_left_ = false;
|
||||||
|
} else if (iter_end_) {
|
||||||
|
ret = OB_ITER_END;
|
||||||
}
|
}
|
||||||
bool got_row = false;
|
bool got_row = false;
|
||||||
bool has_exists = false;
|
bool has_exists = false;
|
||||||
@ -145,6 +147,9 @@ int ObHashUnionOp::inner_get_next_row()
|
|||||||
LOG_WARN("copy current row failed", K(ret));
|
LOG_WARN("copy current row failed", K(ret));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (OB_ITER_END == ret) {
|
||||||
|
iter_end_ = true;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -72,6 +72,9 @@ int ObMergeExceptOp::inner_get_next_row()
|
|||||||
bool break_outer_loop = false;
|
bool break_outer_loop = false;
|
||||||
const ObIArray<ObExpr*>* left_row = NULL;
|
const ObIArray<ObExpr*>* left_row = NULL;
|
||||||
clear_evaluated_flag();
|
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))) {
|
while (OB_SUCC(ret) && OB_SUCC(do_strict_distinct(*left_, last_row_.store_row_, left_row))) {
|
||||||
break_outer_loop = right_iter_end_;
|
break_outer_loop = right_iter_end_;
|
||||||
while (OB_SUCC(ret) && !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))) {
|
} else if (OB_FAIL(last_row_.save_store_row(*left_row, eval_ctx_, 0))) {
|
||||||
LOG_WARN("failed to save right row", K(ret));
|
LOG_WARN("failed to save right row", K(ret));
|
||||||
}
|
}
|
||||||
|
} else if (OB_ITER_END == ret) {
|
||||||
|
iter_end_ = true;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -71,6 +71,9 @@ int ObMergeIntersectOp::inner_get_next_row()
|
|||||||
int cmp = 0;
|
int cmp = 0;
|
||||||
bool break_outer_loop = false;
|
bool break_outer_loop = false;
|
||||||
const ObIArray<ObExpr*>* left_row = NULL;
|
const ObIArray<ObExpr*>* left_row = NULL;
|
||||||
|
if (iter_end_) {
|
||||||
|
ret = OB_ITER_END;
|
||||||
|
}
|
||||||
clear_evaluated_flag();
|
clear_evaluated_flag();
|
||||||
while (OB_SUCC(ret) && OB_SUCC(do_strict_distinct(*left_, last_row_.store_row_, left_row))) {
|
while (OB_SUCC(ret) && OB_SUCC(do_strict_distinct(*left_, last_row_.store_row_, left_row))) {
|
||||||
while (OB_SUCC(ret) && !right_iter_end_) {
|
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))) {
|
} else if (OB_FAIL(last_row_.save_store_row(*left_row, eval_ctx_, 0))) {
|
||||||
LOG_WARN("failed to save right row", K(ret));
|
LOG_WARN("failed to save right row", K(ret));
|
||||||
}
|
}
|
||||||
|
} else if (OB_ITER_END == ret) {
|
||||||
|
iter_end_ = true;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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),
|
alloc_(ObModIds::OB_SQL_MERGE_GROUPBY, OB_MALLOC_NORMAL_BLOCK_SIZE, OB_SERVER_TENANT_ID, ObCtxIds::WORK_AREA),
|
||||||
last_row_(alloc_),
|
last_row_(alloc_),
|
||||||
cmp_(),
|
cmp_(),
|
||||||
need_skip_init_row_(false)
|
need_skip_init_row_(false),
|
||||||
|
iter_end_(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
int ObMergeSetOp::inner_open()
|
int ObMergeSetOp::inner_open()
|
||||||
@ -57,6 +58,7 @@ int ObMergeSetOp::rescan()
|
|||||||
last_row_.reset();
|
last_row_.reset();
|
||||||
alloc_.reset();
|
alloc_.reset();
|
||||||
need_skip_init_row_ = false;
|
need_skip_init_row_ = false;
|
||||||
|
iter_end_ = false;
|
||||||
if (OB_FAIL(ObOperator::rescan())) {
|
if (OB_FAIL(ObOperator::rescan())) {
|
||||||
LOG_WARN("failed to rescan", K(ret));
|
LOG_WARN("failed to rescan", K(ret));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -73,6 +73,7 @@ protected:
|
|||||||
ObChunkDatumStore::LastStoredRow<> last_row_;
|
ObChunkDatumStore::LastStoredRow<> last_row_;
|
||||||
Compare cmp_;
|
Compare cmp_;
|
||||||
bool need_skip_init_row_;
|
bool need_skip_init_row_;
|
||||||
|
bool iter_end_;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
|||||||
@ -282,9 +282,13 @@ int ObMergeUnionOp::inner_get_next_row()
|
|||||||
if (OB_ISNULL(get_next_row_func_)) {
|
if (OB_ISNULL(get_next_row_func_)) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_ERROR("get_next_row_func is NULL", K(ret));
|
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_)())) {
|
} else if (OB_FAIL((this->*get_next_row_func_)())) {
|
||||||
if (OB_ITER_END != ret) {
|
if (OB_ITER_END != ret) {
|
||||||
LOG_WARN("get next row failed", K(ret));
|
LOG_WARN("get next row failed", K(ret));
|
||||||
|
} else {
|
||||||
|
iter_end_ = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
Reference in New Issue
Block a user