Skip to content

Commit d98b7cf

Browse files
hezuojiaoob-robot
authored andcommitted
[CP] Fix merge join backup restore const expr datum out of bounds
1 parent 9cb41a4 commit d98b7cf

File tree

1 file changed

+27
-14
lines changed

1 file changed

+27
-14
lines changed

src/sql/engine/join/ob_merge_join_op.cpp

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -973,9 +973,14 @@ int ObMergeJoinOp::ChildBatchFetcher::get_next_batch(const int64_t max_row_cnt)
973973
} else {
974974
const int64_t restore_cnt = MIN(max_row_cnt, remain_backup_rows);
975975
for (int64_t i = 0; i < backup_datums_.count(); i++) {
976-
ObDatum *datum = all_exprs_->at(i)->locate_batch_datums(merge_join_op_.eval_ctx_);
977-
MEMCPY(datum, backup_datums_.at(i) + backup_rows_used_, sizeof(ObDatum) * restore_cnt);
978-
all_exprs_->at(i)->set_evaluated_projected(merge_join_op_.eval_ctx_);
976+
const ObExpr *expr = all_exprs_->at(i);
977+
if (expr->is_const_expr()) {
978+
continue;
979+
} else {
980+
ObDatum *datum = all_exprs_->at(i)->locate_batch_datums(merge_join_op_.eval_ctx_);
981+
MEMCPY(datum, backup_datums_.at(i) + backup_rows_used_, sizeof(ObDatum) * restore_cnt);
982+
all_exprs_->at(i)->set_evaluated_projected(merge_join_op_.eval_ctx_);
983+
}
979984
}
980985
brs_.size_ = restore_cnt;
981986
brs_.end_ = false;
@@ -1020,8 +1025,11 @@ int ObMergeJoinOp::ChildBatchFetcher::backup_remain_rows()
10201025
} else if (backup_datums_.empty()) {
10211026
int64_t alloc_size = sizeof(ObDatum) * merge_join_op_.spec_.max_batch_size_;
10221027
for (int64_t i = 0; i < all_exprs_->count() && OB_SUCC(ret); i++) {
1028+
const ObExpr *expr = all_exprs_->at(i);
10231029
ObDatum *datum = NULL;
1024-
if (OB_ISNULL(datum = static_cast<ObDatum *>(allocator.alloc(alloc_size)))) {
1030+
// if expr is const, use NULL datum pointer as padding.
1031+
if (!expr->is_const_expr() &&
1032+
OB_ISNULL(datum = static_cast<ObDatum *>(allocator.alloc(alloc_size)))) {
10251033
ret = OB_ALLOCATE_MEMORY_FAILED;
10261034
LOG_WARN("allocate memory failed", K(ret));
10271035
} else if (OB_FAIL(backup_datums_.push_back(datum))) {
@@ -1035,17 +1043,22 @@ int ObMergeJoinOp::ChildBatchFetcher::backup_remain_rows()
10351043
LOG_WARN("count mismatch", K(ret), K(all_exprs_->count()), K(backup_datums_.count()));
10361044
} else {
10371045
for (int64_t i = 0; i < all_exprs_->count() && OB_SUCC(ret); i++) {
1038-
backup_rows_cnt_ = 0;
1039-
backup_rows_used_ = 0;
1040-
ObDatumVector src_datum = all_exprs_->at(i)->locate_expr_datumvector(merge_join_op_.eval_ctx_);
1041-
ObDatum *datum = backup_datums_.at(i);
1042-
if (OB_ISNULL(datum)) {
1043-
ret = OB_ERR_UNEXPECTED;
1044-
LOG_WARN("backup datums memory is null", K(ret), K(i), K(all_exprs_->count()));
1046+
const ObExpr *expr = all_exprs_->at(i);
1047+
if (expr->is_const_expr()) {
1048+
continue;
10451049
} else {
1046-
for (int64_t j = cur_idx_; j < brs_.size_ && OB_SUCC(ret); j++) {
1047-
if (!brs_.skip_->contain(j)) {
1048-
datum[backup_rows_cnt_++] = *src_datum.at(j);
1050+
backup_rows_cnt_ = 0;
1051+
backup_rows_used_ = 0;
1052+
ObDatumVector src_datum = expr->locate_expr_datumvector(merge_join_op_.eval_ctx_);
1053+
ObDatum *datum = backup_datums_.at(i);
1054+
if (OB_ISNULL(datum)) {
1055+
ret = OB_ERR_UNEXPECTED;
1056+
LOG_WARN("backup datums memory is null", K(ret), K(i), K(all_exprs_->count()));
1057+
} else {
1058+
for (int64_t j = cur_idx_; j < brs_.size_ && OB_SUCC(ret); j++) {
1059+
if (!brs_.skip_->contain(j)) {
1060+
datum[backup_rows_cnt_++] = *src_datum.at(j);
1061+
}
10491062
}
10501063
}
10511064
}

0 commit comments

Comments
 (0)