[CP] Fix merge join backup restore const expr datum out of bounds
This commit is contained in:
@ -973,10 +973,15 @@ int ObMergeJoinOp::ChildBatchFetcher::get_next_batch(const int64_t max_row_cnt)
|
|||||||
} else {
|
} else {
|
||||||
const int64_t restore_cnt = MIN(max_row_cnt, remain_backup_rows);
|
const int64_t restore_cnt = MIN(max_row_cnt, remain_backup_rows);
|
||||||
for (int64_t i = 0; i < backup_datums_.count(); i++) {
|
for (int64_t i = 0; i < backup_datums_.count(); i++) {
|
||||||
|
const ObExpr *expr = all_exprs_->at(i);
|
||||||
|
if (expr->is_const_expr()) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
ObDatum *datum = all_exprs_->at(i)->locate_batch_datums(merge_join_op_.eval_ctx_);
|
ObDatum *datum = all_exprs_->at(i)->locate_batch_datums(merge_join_op_.eval_ctx_);
|
||||||
MEMCPY(datum, backup_datums_.at(i) + backup_rows_used_, sizeof(ObDatum) * restore_cnt);
|
MEMCPY(datum, backup_datums_.at(i) + backup_rows_used_, sizeof(ObDatum) * restore_cnt);
|
||||||
all_exprs_->at(i)->set_evaluated_projected(merge_join_op_.eval_ctx_);
|
all_exprs_->at(i)->set_evaluated_projected(merge_join_op_.eval_ctx_);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
brs_.size_ = restore_cnt;
|
brs_.size_ = restore_cnt;
|
||||||
brs_.end_ = false;
|
brs_.end_ = false;
|
||||||
brs_.skip_ = NULL;
|
brs_.skip_ = NULL;
|
||||||
@ -1020,8 +1025,11 @@ int ObMergeJoinOp::ChildBatchFetcher::backup_remain_rows()
|
|||||||
} else if (backup_datums_.empty()) {
|
} else if (backup_datums_.empty()) {
|
||||||
int64_t alloc_size = sizeof(ObDatum) * merge_join_op_.spec_.max_batch_size_;
|
int64_t alloc_size = sizeof(ObDatum) * merge_join_op_.spec_.max_batch_size_;
|
||||||
for (int64_t i = 0; i < all_exprs_->count() && OB_SUCC(ret); i++) {
|
for (int64_t i = 0; i < all_exprs_->count() && OB_SUCC(ret); i++) {
|
||||||
|
const ObExpr *expr = all_exprs_->at(i);
|
||||||
ObDatum *datum = NULL;
|
ObDatum *datum = NULL;
|
||||||
if (OB_ISNULL(datum = static_cast<ObDatum *>(allocator.alloc(alloc_size)))) {
|
// if expr is const, use NULL datum pointer as padding.
|
||||||
|
if (!expr->is_const_expr() &&
|
||||||
|
OB_ISNULL(datum = static_cast<ObDatum *>(allocator.alloc(alloc_size)))) {
|
||||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||||
LOG_WARN("allocate memory failed", K(ret));
|
LOG_WARN("allocate memory failed", K(ret));
|
||||||
} else if (OB_FAIL(backup_datums_.push_back(datum))) {
|
} else if (OB_FAIL(backup_datums_.push_back(datum))) {
|
||||||
@ -1035,9 +1043,13 @@ int ObMergeJoinOp::ChildBatchFetcher::backup_remain_rows()
|
|||||||
LOG_WARN("count mismatch", K(ret), K(all_exprs_->count()), K(backup_datums_.count()));
|
LOG_WARN("count mismatch", K(ret), K(all_exprs_->count()), K(backup_datums_.count()));
|
||||||
} else {
|
} else {
|
||||||
for (int64_t i = 0; i < all_exprs_->count() && OB_SUCC(ret); i++) {
|
for (int64_t i = 0; i < all_exprs_->count() && OB_SUCC(ret); i++) {
|
||||||
|
const ObExpr *expr = all_exprs_->at(i);
|
||||||
|
if (expr->is_const_expr()) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
backup_rows_cnt_ = 0;
|
backup_rows_cnt_ = 0;
|
||||||
backup_rows_used_ = 0;
|
backup_rows_used_ = 0;
|
||||||
ObDatumVector src_datum = all_exprs_->at(i)->locate_expr_datumvector(merge_join_op_.eval_ctx_);
|
ObDatumVector src_datum = expr->locate_expr_datumvector(merge_join_op_.eval_ctx_);
|
||||||
ObDatum *datum = backup_datums_.at(i);
|
ObDatum *datum = backup_datums_.at(i);
|
||||||
if (OB_ISNULL(datum)) {
|
if (OB_ISNULL(datum)) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
@ -1052,6 +1064,7 @@ int ObMergeJoinOp::ChildBatchFetcher::backup_remain_rows()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user