From 94710a2ae8725fce88574495bd43798802a2c963 Mon Sep 17 00:00:00 2001 From: wz-WillZheng <18701736737@163.com> Date: Wed, 13 Nov 2024 04:18:12 +0000 Subject: [PATCH] Fix case: handle nullptr pointer --- .../das/iter/ob_das_text_retrieval_iter.cpp | 47 ++++++++++++------- .../iter/ob_das_text_retrieval_merge_iter.cpp | 14 ++++-- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/src/sql/das/iter/ob_das_text_retrieval_iter.cpp b/src/sql/das/iter/ob_das_text_retrieval_iter.cpp index dac445a30..9201cd6f9 100644 --- a/src/sql/das/iter/ob_das_text_retrieval_iter.cpp +++ b/src/sql/das/iter/ob_das_text_retrieval_iter.cpp @@ -110,12 +110,14 @@ int ObDASTextRetrievalIter::inner_init(ObDASIterParam ¶m) } } + const int64_t default_size = OB_MAX(max_batch_size_, 1); if (OB_FAIL(ret)) { } else if (OB_FAIL(init_calc_exprs())) { LOG_WARN("failed to init row-wise calc exprs", K(ret)); + } else if (OB_ISNULL(skip_ = to_bit_vector(allocator_.alloc(ObBitVector::memory_size(default_size))))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to allocate skip bit vector", K(ret)); } else { - int64_t default_size = OB_MAX(max_batch_size_, 1); - skip_ = to_bit_vector(allocator_.alloc(ObBitVector::memory_size(default_size))); skip_->init(default_size); is_inited_ = true; } @@ -126,7 +128,9 @@ int ObDASTextRetrievalIter::inner_init(ObDASIterParam ¶m) int ObDASTextRetrievalIter::inner_reuse() { int ret = OB_SUCCESS; - skip_->reset(OB_MAX(max_batch_size_, 1)); + if (OB_NOT_NULL(skip_)) { + skip_->reset(OB_MAX(max_batch_size_, 1)); + } if (nullptr != mem_context_) { mem_context_->reset_remain_one_page(); } @@ -135,18 +139,23 @@ int ObDASTextRetrievalIter::inner_reuse() int64_t old_default_size = OB_MAX(max_batch_size_, 1); max_batch_size_ = ir_rtdef_->eval_ctx_->max_batch_size_; if (old_default_size < OB_MAX(max_batch_size_, 1)) { - int64_t default_size = OB_MAX(max_batch_size_, 1); + const int64_t default_size = OB_MAX(max_batch_size_, 1); allocator_.reuse(); - skip_ = to_bit_vector(allocator_.alloc(ObBitVector::memory_size(default_size))); - skip_->init(default_size); + if (OB_ISNULL(skip_ = to_bit_vector(allocator_.alloc(ObBitVector::memory_size(default_size))))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to allocate skip bit vector", K(ret)); + } else { + skip_->init(default_size); + } } - - const ObTabletID &old_inv_scan_id = inv_idx_scan_param_.tablet_id_; - inverted_idx_scan_iter_->set_scan_param(inv_idx_scan_param_); - inv_idx_scan_param_.need_switch_param_ = inv_idx_scan_param_.need_switch_param_ || - ((old_inv_scan_id.is_valid() && old_inv_scan_id != inv_idx_tablet_id_) ? true : false); - if (!inv_idx_scan_param_.key_ranges_.empty()) { - inv_idx_scan_param_.key_ranges_.reuse(); + if (OB_SUCC(ret)) { + const ObTabletID &old_inv_scan_id = inv_idx_scan_param_.tablet_id_; + inverted_idx_scan_iter_->set_scan_param(inv_idx_scan_param_); + inv_idx_scan_param_.need_switch_param_ = inv_idx_scan_param_.need_switch_param_ || + ((old_inv_scan_id.is_valid() && old_inv_scan_id != inv_idx_tablet_id_) ? true : false); + if (!inv_idx_scan_param_.key_ranges_.empty()) { + inv_idx_scan_param_.key_ranges_.reuse(); + } } if (FAILEDx(inverted_idx_scan_iter_->reuse())) { LOG_WARN("failed to reuse inverted index iter", K(ret)); @@ -859,7 +868,7 @@ int ObDASTRCacheIter::inner_init(ObDASIterParam ¶m) LOG_WARN("failed to init base class", K(ret)); } else { is_inited_ = false; - int64_t default_size = OB_MAX(max_batch_size_, 1); + const int64_t default_size = OB_MAX(max_batch_size_, 1); relevance_.set_allocator(&allocator_); if (OB_FAIL(relevance_.init(default_size))) { LOG_WARN("failed to init next batch iter idxes array", K(ret)); @@ -880,13 +889,15 @@ int ObDASTRCacheIter::inner_init(ObDASIterParam ¶m) int ObDASTRCacheIter::inner_reuse() { int ret = OB_SUCCESS; - skip_->reset(OB_MAX(max_batch_size_, 1)); + if (OB_NOT_NULL(skip_)) { + skip_->reset(OB_MAX(max_batch_size_, 1)); + } int64_t old_default_size = OB_MAX(max_batch_size_, 1); max_batch_size_ = ir_rtdef_->eval_ctx_->max_batch_size_; if (old_default_size < OB_MAX(max_batch_size_, 1)) { relevance_.reuse(); doc_id_.reuse(); - int64_t default_size = OB_MAX(max_batch_size_, 1); + const int64_t default_size = OB_MAX(max_batch_size_, 1); allocator_.reuse(); if (OB_FAIL(relevance_.init(default_size))) { LOG_WARN("failed to init relevance_ array", K(ret)); @@ -896,8 +907,10 @@ int ObDASTRCacheIter::inner_reuse() LOG_WARN("failed to init doc_id_ array", K(ret)); } else if (OB_FAIL(doc_id_.prepare_allocate(default_size))) { LOG_WARN("failed to prepare allocate doc_id_ array", K(ret)); + } else if (OB_ISNULL(skip_ = to_bit_vector(allocator_.alloc(ObBitVector::memory_size(default_size))))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to allocate skip bit vector", K(ret)); } else { - skip_ = to_bit_vector(allocator_.alloc(ObBitVector::memory_size(default_size))); skip_->init(default_size); } } diff --git a/src/sql/das/iter/ob_das_text_retrieval_merge_iter.cpp b/src/sql/das/iter/ob_das_text_retrieval_merge_iter.cpp index 6ba949f22..2b414837b 100644 --- a/src/sql/das/iter/ob_das_text_retrieval_merge_iter.cpp +++ b/src/sql/das/iter/ob_das_text_retrieval_merge_iter.cpp @@ -1086,10 +1086,16 @@ int ObDASTRTaatIter::fill_chunk_store_by_tr_iter() } } if (OB_SUCC(ret) && ir_ctdef_->inv_scan_doc_id_col_->is_batch_result()) { - for (int64_t i = 0; i < hash_map_size_; ++i) { - sql::ObBitVector *skip = to_bit_vector(mem_context_->get_arena_allocator().alloc(ObBitVector::memory_size(capacity))); - skip->init(capacity); - skips[i] = skip; + for (int64_t i = 0; OB_SUCC(ret) && i < hash_map_size_; ++i) { + sql::ObBitVector *skip = nullptr; + if (OB_ISNULL(skip = to_bit_vector(mem_context_->get_arena_allocator().alloc(ObBitVector::memory_size(capacity))))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to allocate enough memory", K(capacity), K(ret)); + } else { + skip->init(capacity); + skips[i] = skip; + } + } } }