@@ -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