You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2023/04/22 11:18:03 UTC
[doris] 15/15: [refactor](exceptionsafe) disallow call new method explicitly (#18830)
This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch branch-2.0-alpha
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 7471ff24f934e645d891412cfd7d3508d6e01f8e
Author: yiguolei <67...@qq.com>
AuthorDate: Fri Apr 21 09:13:24 2023 +0800
[refactor](exceptionsafe) disallow call new method explicitly (#18830)
disallow call new method explicitly
force to use create_shared or create_unique to use shared ptr
placement new is allowed
reference https://abseil.io/tips/42 to add factory method to all class.
I think we should follow this guide because if throw exception in new method, the program will terminate.
---------
Co-authored-by: yiguolei <yi...@gmail.com>
---
be/src/common/factory_creator.h | 55 ++++++++++++++++++++++++
be/src/olap/schema_change.cpp | 11 +++--
be/src/pipeline/exec/data_queue.cpp | 2 +-
be/src/pipeline/exec/operator.h | 2 +-
be/src/pipeline/pipeline_task.cpp | 2 +-
be/src/service/point_query_executor.cpp | 4 +-
be/src/vec/common/sort/sorter.h | 2 +-
be/src/vec/core/block.cpp | 2 +-
be/src/vec/core/block.h | 7 ++-
be/src/vec/core/block_spill_reader.cpp | 22 +++++++---
be/src/vec/exec/scan/pip_scanner_context.h | 9 ++--
be/src/vec/exec/scan/scanner_context.cpp | 8 ++--
be/src/vec/exec/vrepeat_node.cpp | 2 +-
be/src/vec/exec/vsort_node.cpp | 2 +-
be/src/vec/runtime/vdata_stream_recvr.cpp | 4 +-
be/src/vec/runtime/vdata_stream_recvr.h | 2 +-
be/src/vec/sink/vdata_stream_sender.cpp | 2 +-
be/src/vec/sink/vresult_file_sink.cpp | 3 +-
be/src/vec/sink/vtablet_sink.cpp | 6 +--
be/test/vec/exec/parquet/parquet_reader_test.cpp | 5 +--
be/test/vec/exec/parquet/parquet_thrift_test.cpp | 2 +-
be/test/vec/function/function_test_util.cpp | 4 +-
22 files changed, 113 insertions(+), 45 deletions(-)
diff --git a/be/src/common/factory_creator.h b/be/src/common/factory_creator.h
new file mode 100644
index 0000000000..f3ece32685
--- /dev/null
+++ b/be/src/common/factory_creator.h
@@ -0,0 +1,55 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#pragma once
+#include <memory>
+
+// All object should inherit from this class, like
+// class A {
+// DISALLOW_EXPILICT_NEW(A);
+// };
+//
+// Then the caller could not call new A() any more, has to call A::create_shared(...)
+// or A::create_unique(...), then we could make sure all object in our project is shared
+// pointer.
+// But could call A a(...);
+
+// A macro to disallow the copy constructor and operator= functions
+// This should be used in the private: declarations for a class
+//
+// Not use template like cowhelper to implements this feature because it has problem
+// during inherits
+// TODO try to allow make_unique
+//
+#define ENABLE_FACTORY_CREATOR(TypeName) \
+private: \
+ void* operator new(std::size_t size) { return ::operator new(size); } \
+ void* operator new[](std::size_t size) { return ::operator new[](size); } \
+ \
+public: \
+ void* operator new(std::size_t count, void* ptr) { return ::operator new(count, ptr); } \
+ void operator delete(void* ptr) noexcept { ::operator delete(ptr); } \
+ void operator delete[](void* ptr) noexcept { ::operator delete[](ptr); } \
+ void operator delete(void* ptr, void* place) noexcept { ::operator delete(ptr, place); } \
+ template <typename... Args> \
+ static std::shared_ptr<TypeName> create_shared(Args&&... args) { \
+ return std::make_shared<TypeName>(std::forward<Args>(args)...); \
+ } \
+ template <typename... Args> \
+ static std::unique_ptr<TypeName> create_unique(Args&&... args) { \
+ return std::unique_ptr<TypeName>(new TypeName(std::forward<Args>(args)...)); \
+ }
diff --git a/be/src/olap/schema_change.cpp b/be/src/olap/schema_change.cpp
index d96a103f2d..0f65b5d59d 100644
--- a/be/src/olap/schema_change.cpp
+++ b/be/src/olap/schema_change.cpp
@@ -429,8 +429,8 @@ Status VSchemaChangeDirectly::_inner_process(RowsetReaderSharedPtr rowset_reader
TabletSchemaSPtr base_tablet_schema) {
do {
auto new_block =
- std::make_unique<vectorized::Block>(new_tablet->tablet_schema()->create_block());
- auto ref_block = std::make_unique<vectorized::Block>(base_tablet_schema->create_block());
+ vectorized::Block::create_unique(new_tablet->tablet_schema()->create_block());
+ auto ref_block = vectorized::Block::create_unique(base_tablet_schema->create_block());
rowset_reader->next_block(ref_block.get());
if (ref_block->rows() == 0) {
@@ -501,11 +501,10 @@ Status VSchemaChangeWithSorting::_inner_process(RowsetReaderSharedPtr rowset_rea
return Status::OK();
};
- auto new_block =
- std::make_unique<vectorized::Block>(new_tablet->tablet_schema()->create_block());
+ auto new_block = vectorized::Block::create_unique(new_tablet->tablet_schema()->create_block());
do {
- auto ref_block = std::make_unique<vectorized::Block>(base_tablet_schema->create_block());
+ auto ref_block = vectorized::Block::create_unique(base_tablet_schema->create_block());
rowset_reader->next_block(ref_block.get());
if (ref_block->rows() == 0) {
break;
@@ -527,7 +526,7 @@ Status VSchemaChangeWithSorting::_inner_process(RowsetReaderSharedPtr rowset_rea
// move unique ptr
blocks.push_back(
- std::make_unique<vectorized::Block>(new_tablet->tablet_schema()->create_block()));
+ vectorized::Block::create_unique(new_tablet->tablet_schema()->create_block()));
swap(blocks.back(), new_block);
} while (true);
diff --git a/be/src/pipeline/exec/data_queue.cpp b/be/src/pipeline/exec/data_queue.cpp
index a6f2c43939..1f7494ef21 100644
--- a/be/src/pipeline/exec/data_queue.cpp
+++ b/be/src/pipeline/exec/data_queue.cpp
@@ -58,7 +58,7 @@ std::unique_ptr<vectorized::Block> DataQueue::get_free_block(int child_idx) {
}
}
- return std::make_unique<vectorized::Block>();
+ return vectorized::Block::create_unique();
}
void DataQueue::push_free_block(std::unique_ptr<vectorized::Block> block, int child_idx) {
diff --git a/be/src/pipeline/exec/operator.h b/be/src/pipeline/exec/operator.h
index de02d4c73e..345fc2b3b4 100644
--- a/be/src/pipeline/exec/operator.h
+++ b/be/src/pipeline/exec/operator.h
@@ -422,7 +422,7 @@ public:
StatefulOperator(OperatorBuilderBase* builder, ExecNode* node)
: StreamingOperator<OperatorBuilderType>(builder, node),
- _child_block(new vectorized::Block),
+ _child_block(vectorized::Block::create_unique()),
_child_source_state(SourceState::DEPEND_ON_SOURCE) {}
virtual ~StatefulOperator() = default;
diff --git a/be/src/pipeline/pipeline_task.cpp b/be/src/pipeline/pipeline_task.cpp
index 8121414a6b..0dd5cb90e9 100644
--- a/be/src/pipeline/pipeline_task.cpp
+++ b/be/src/pipeline/pipeline_task.cpp
@@ -78,7 +78,7 @@ Status PipelineTask::prepare(RuntimeState* state) {
fmt::format_to(operator_ids_str, "]");
_task_profile->add_info_string("OperatorIds(source2root)", fmt::to_string(operator_ids_str));
- _block.reset(new doris::vectorized::Block());
+ _block = doris::vectorized::Block::create_unique();
// We should make sure initial state for task are runnable so that we can do some preparation jobs (e.g. initialize runtime filters).
set_state(PipelineTaskState::RUNNABLE);
diff --git a/be/src/service/point_query_executor.cpp b/be/src/service/point_query_executor.cpp
index ed42c0c9c4..02947f0d37 100644
--- a/be/src/service/point_query_executor.cpp
+++ b/be/src/service/point_query_executor.cpp
@@ -54,7 +54,7 @@ Status Reusable::init(const TDescriptorTable& t_desc_tbl, const std::vector<TExp
_runtime_state->set_desc_tbl(_desc_tbl);
_block_pool.resize(block_size);
for (int i = 0; i < _block_pool.size(); ++i) {
- _block_pool[i] = std::make_unique<vectorized::Block>(tuple_desc()->slots(), 10);
+ _block_pool[i] = vectorized::Block::create_unique(tuple_desc()->slots(), 10);
}
RETURN_IF_ERROR(vectorized::VExpr::create_expr_trees(_runtime_state->obj_pool(), output_exprs,
@@ -69,7 +69,7 @@ Status Reusable::init(const TDescriptorTable& t_desc_tbl, const std::vector<TExp
std::unique_ptr<vectorized::Block> Reusable::get_block() {
std::lock_guard lock(_block_mutex);
if (_block_pool.empty()) {
- return std::make_unique<vectorized::Block>(tuple_desc()->slots(), 4);
+ return vectorized::Block::create_unique(tuple_desc()->slots(), 4);
}
auto block = std::move(_block_pool.back());
CHECK(block != nullptr);
diff --git a/be/src/vec/common/sort/sorter.h b/be/src/vec/common/sort/sorter.h
index 880e70f726..4dcaba872a 100644
--- a/be/src/vec/common/sort/sorter.h
+++ b/be/src/vec/common/sort/sorter.h
@@ -38,7 +38,7 @@ public:
// create_empty_block should ignore invalid slots, unsorted_block
// should be same structure with arrival block from child node
// since block from child node may ignored these slots
- : unsorted_block_(new Block(
+ : unsorted_block_(Block::create_unique(
VectorizedUtils::create_empty_block(row_desc, true /*ignore invalid slot*/))),
offset_(offset),
limit_(limit),
diff --git a/be/src/vec/core/block.cpp b/be/src/vec/core/block.cpp
index dc7cef55c1..16946fe3cf 100644
--- a/be/src/vec/core/block.cpp
+++ b/be/src/vec/core/block.cpp
@@ -971,7 +971,7 @@ std::string MutableBlock::dump_data(size_t row_limit) const {
}
std::unique_ptr<Block> Block::create_same_struct_block(size_t size) const {
- auto temp_block = std::make_unique<Block>();
+ auto temp_block = Block::create_unique();
for (const auto& d : data) {
auto column = d.type->create_column();
column->resize(size);
diff --git a/be/src/vec/core/block.h b/be/src/vec/core/block.h
index dba2e62ea3..85cf3f624b 100644
--- a/be/src/vec/core/block.h
+++ b/be/src/vec/core/block.h
@@ -28,6 +28,8 @@
#include <utility>
#include <vector>
+#include "common/factory_creator.h"
+#include "common/status.h"
#include "gen_cpp/data.pb.h"
#include "runtime/descriptors.h"
#include "vec/columns/column.h"
@@ -53,10 +55,11 @@ namespace vectorized {
*/
class MutableBlock;
class Block {
+ ENABLE_FACTORY_CREATOR(Block);
+
private:
using Container = ColumnsWithTypeAndName;
using IndexByName = phmap::flat_hash_map<String, size_t>;
-
Container data;
IndexByName index_by_name;
std::vector<bool> row_same_bit;
@@ -383,6 +386,8 @@ using BlocksPtr = std::shared_ptr<Blocks>;
using BlocksPtrs = std::shared_ptr<std::vector<BlocksPtr>>;
class MutableBlock {
+ ENABLE_FACTORY_CREATOR(MutableBlock);
+
private:
MutableColumns _columns;
DataTypes _data_types;
diff --git a/be/src/vec/core/block_spill_reader.cpp b/be/src/vec/core/block_spill_reader.cpp
index be14bc4d55..d2a503bbc1 100644
--- a/be/src/vec/core/block_spill_reader.cpp
+++ b/be/src/vec/core/block_spill_reader.cpp
@@ -100,16 +100,24 @@ Status BlockSpillReader::read(Block* block, bool* eos) {
}
DCHECK(bytes_read == bytes_to_read);
- PBlock pb_block;
BlockUPtr new_block = nullptr;
- {
- SCOPED_TIMER(deserialize_time_);
- if (!pb_block.ParseFromArray(result.data, result.size)) {
- return Status::InternalError("Failed to read spilled block");
+ // COUNTER_UPDATE(read_bytes_, bytes_read);
+ // COUNTER_UPDATE(read_block_num_, 1);
+
+ if (bytes_read > 0) {
+ PBlock pb_block;
+ BlockUPtr new_block = nullptr;
+ {
+ SCOPED_TIMER(deserialize_time_);
+ if (!pb_block.ParseFromArray(result.data, result.size)) {
+ return Status::InternalError("Failed to read spilled block");
+ }
+ new_block = Block::create_unique(pb_block);
}
- new_block.reset(new Block(pb_block));
+ block->swap(*new_block);
+ } else {
+ block->clear_column_data();
}
- block->swap(*new_block);
++read_block_index_;
diff --git a/be/src/vec/exec/scan/pip_scanner_context.h b/be/src/vec/exec/scan/pip_scanner_context.h
index d90aa9a911..3637181364 100644
--- a/be/src/vec/exec/scan/pip_scanner_context.h
+++ b/be/src/vec/exec/scan/pip_scanner_context.h
@@ -137,11 +137,12 @@ public:
limit == -1 ? _batch_size : std::min(static_cast<int64_t>(_batch_size), limit);
int64_t free_blocks_memory_usage = 0;
for (int i = 0; i < _max_queue_size; ++i) {
- auto block = std::make_unique<vectorized::Block>(_output_tuple_desc->slots(),
- real_block_size,
- true /*ignore invalid slots*/);
+ auto block = vectorized::Block::create_unique(_output_tuple_desc->slots(),
+ real_block_size,
+ true /*ignore invalid slots*/);
free_blocks_memory_usage += block->allocated_bytes();
- _colocate_mutable_blocks.emplace_back(new vectorized::MutableBlock(block.get()));
+ _colocate_mutable_blocks.emplace_back(
+ vectorized::MutableBlock::create_unique(block.get()));
_colocate_blocks.emplace_back(std::move(block));
_colocate_block_mutexs.emplace_back(new std::mutex);
}
diff --git a/be/src/vec/exec/scan/scanner_context.cpp b/be/src/vec/exec/scan/scanner_context.cpp
index 1c1cd3f73f..2a120a5fc6 100644
--- a/be/src/vec/exec/scan/scanner_context.cpp
+++ b/be/src/vec/exec/scan/scanner_context.cpp
@@ -90,8 +90,8 @@ Status ScannerContext::init() {
// So use _output_tuple_desc;
int64_t free_blocks_memory_usage = 0;
for (int i = 0; i < pre_alloc_block_count; ++i) {
- auto block = std::make_unique<vectorized::Block>(
- _output_tuple_desc->slots(), real_block_size, true /*ignore invalid slots*/);
+ auto block = vectorized::Block::create_unique(_output_tuple_desc->slots(), real_block_size,
+ true /*ignore invalid slots*/);
free_blocks_memory_usage += block->allocated_bytes();
_free_blocks.emplace_back(std::move(block));
}
@@ -132,8 +132,8 @@ vectorized::BlockUPtr ScannerContext::get_free_block(bool* has_free_block,
*has_free_block = false;
COUNTER_UPDATE(_newly_create_free_blocks_num, 1);
- return std::make_unique<vectorized::Block>(_real_tuple_desc->slots(), _batch_size,
- true /*ignore invalid slots*/);
+ return vectorized::Block::create_unique(_real_tuple_desc->slots(), _batch_size,
+ true /*ignore invalid slots*/);
}
void ScannerContext::return_free_block(std::unique_ptr<vectorized::Block> block) {
diff --git a/be/src/vec/exec/vrepeat_node.cpp b/be/src/vec/exec/vrepeat_node.cpp
index c3fe0e8d0f..9c3e2e1211 100644
--- a/be/src/vec/exec/vrepeat_node.cpp
+++ b/be/src/vec/exec/vrepeat_node.cpp
@@ -202,7 +202,7 @@ Status VRepeatNode::push(RuntimeState* state, vectorized::Block* input_block, bo
DCHECK(!_expr_ctxs.empty());
if (input_block->rows() > 0) {
- _intermediate_block.reset(new Block());
+ _intermediate_block = Block::create_unique();
for (auto expr : _expr_ctxs) {
int result_column_id = -1;
diff --git a/be/src/vec/exec/vsort_node.cpp b/be/src/vec/exec/vsort_node.cpp
index 3651f40629..cf62ab408d 100644
--- a/be/src/vec/exec/vsort_node.cpp
+++ b/be/src/vec/exec/vsort_node.cpp
@@ -166,7 +166,7 @@ Status VSortNode::open(RuntimeState* state) {
// The child has been opened and the sorter created. Sort the input.
// The final merge is done on-demand as rows are requested in get_next().
bool eos = false;
- std::unique_ptr<Block> upstream_block(new Block());
+ std::unique_ptr<Block> upstream_block = Block::create_unique();
do {
RETURN_IF_ERROR_AND_CHECK_SPAN(
child(0)->get_next_after_projects(
diff --git a/be/src/vec/runtime/vdata_stream_recvr.cpp b/be/src/vec/runtime/vdata_stream_recvr.cpp
index 39d70ee4f1..98b1ce1450 100644
--- a/be/src/vec/runtime/vdata_stream_recvr.cpp
+++ b/be/src/vec/runtime/vdata_stream_recvr.cpp
@@ -137,7 +137,7 @@ void VDataStreamRecvr::SenderQueue::add_block(const PBlock& pblock, int be_numbe
int64_t deserialize_time = 0;
{
SCOPED_RAW_TIMER(&deserialize_time);
- block.reset(new Block(pblock));
+ block = Block::create_unique(pblock);
}
auto block_byte_size = block->allocated_bytes();
@@ -176,7 +176,7 @@ void VDataStreamRecvr::SenderQueue::add_block(Block* block, bool use_move) {
auto block_bytes_received = block->bytes();
// Has to use unique ptr here, because clone column may failed if allocate memory failed.
- BlockUPtr nblock = std::make_unique<Block>(block->get_columns_with_type_and_name());
+ BlockUPtr nblock = Block::create_unique(block->get_columns_with_type_and_name());
// local exchange should copy the block contented if use move == false
if (use_move) {
diff --git a/be/src/vec/runtime/vdata_stream_recvr.h b/be/src/vec/runtime/vdata_stream_recvr.h
index dd179ca29e..d88223113e 100644
--- a/be/src/vec/runtime/vdata_stream_recvr.h
+++ b/be/src/vec/runtime/vdata_stream_recvr.h
@@ -224,7 +224,7 @@ public:
if (_is_cancelled || !block->rows()) {
return;
}
- BlockUPtr nblock = std::make_unique<Block>(block->get_columns_with_type_and_name());
+ BlockUPtr nblock = Block::create_unique(block->get_columns_with_type_and_name());
// local exchange should copy the block contented if use move == false
if (use_move) {
diff --git a/be/src/vec/sink/vdata_stream_sender.cpp b/be/src/vec/sink/vdata_stream_sender.cpp
index 47204ba8c4..f19a088883 100644
--- a/be/src/vec/sink/vdata_stream_sender.cpp
+++ b/be/src/vec/sink/vdata_stream_sender.cpp
@@ -183,7 +183,7 @@ Status Channel::add_rows(Block* block, const std::vector<int>& rows) {
if (_mutable_block == nullptr) {
SCOPED_CONSUME_MEM_TRACKER(_parent->_mem_tracker.get());
- _mutable_block.reset(new MutableBlock(block->clone_empty()));
+ _mutable_block = MutableBlock::create_unique(block->clone_empty());
}
int row_wait_add = rows.size();
diff --git a/be/src/vec/sink/vresult_file_sink.cpp b/be/src/vec/sink/vresult_file_sink.cpp
index 07d0c45927..066b74aa9b 100644
--- a/be/src/vec/sink/vresult_file_sink.cpp
+++ b/be/src/vec/sink/vresult_file_sink.cpp
@@ -109,7 +109,8 @@ Status VResultFileSink::prepare(RuntimeState* state) {
_output_row_descriptor));
} else {
// init channel
- _output_block.reset(new Block(_output_row_descriptor.tuple_descriptors()[0]->slots(), 1));
+ _output_block =
+ Block::create_unique(_output_row_descriptor.tuple_descriptors()[0]->slots(), 1);
_writer.reset(new (std::nothrow) VFileResultWriter(
_file_opts.get(), _storage_type, state->fragment_instance_id(), _output_vexpr_ctxs,
_profile, nullptr, _output_block.get(), state->return_object_data_as_binary(),
diff --git a/be/src/vec/sink/vtablet_sink.cpp b/be/src/vec/sink/vtablet_sink.cpp
index d1bcf7fcca..6df70e41e5 100644
--- a/be/src/vec/sink/vtablet_sink.cpp
+++ b/be/src/vec/sink/vtablet_sink.cpp
@@ -452,7 +452,7 @@ Status VNodeChannel::add_block(vectorized::Block* block, const Payload* payload,
}
if (UNLIKELY(!_cur_mutable_block)) {
- _cur_mutable_block.reset(new vectorized::MutableBlock(block->clone_empty()));
+ _cur_mutable_block = vectorized::MutableBlock::create_unique(block->clone_empty());
}
std::unique_ptr<Payload> temp_payload = nullptr;
@@ -536,7 +536,7 @@ Status VNodeChannel::add_block(vectorized::Block* block, const Payload* payload,
<< " jobid:" << std::to_string(_state->load_job_id())
<< " loadinfo:" << _load_info;
}
- _cur_mutable_block.reset(new vectorized::MutableBlock(block->clone_empty()));
+ _cur_mutable_block = vectorized::MutableBlock::create_unique(block->clone_empty());
_cur_add_block_request.clear_tablet_ids();
}
@@ -824,7 +824,7 @@ void VNodeChannel::mark_close() {
std::lock_guard<std::mutex> l(_pending_batches_lock);
if (!_cur_mutable_block) {
// add a dummy block
- _cur_mutable_block.reset(new vectorized::MutableBlock());
+ _cur_mutable_block = vectorized::MutableBlock::create_unique();
}
_pending_blocks.emplace(std::move(_cur_mutable_block), _cur_add_block_request);
_pending_batches_num++;
diff --git a/be/test/vec/exec/parquet/parquet_reader_test.cpp b/be/test/vec/exec/parquet/parquet_reader_test.cpp
index ec4eb12fed..a83cdd9d79 100644
--- a/be/test/vec/exec/parquet/parquet_reader_test.cpp
+++ b/be/test/vec/exec/parquet/parquet_reader_test.cpp
@@ -122,7 +122,7 @@ TEST_F(ParquetReaderTest, normal) {
partition_columns;
std::unordered_map<std::string, VExprContext*> missing_columns;
p_reader->set_fill_columns(partition_columns, missing_columns);
- Block* block = new Block();
+ BlockUPtr block = Block::create_unique();
for (const auto& slot_desc : tuple_desc->slots()) {
auto data_type =
vectorized::DataTypeFactory::instance().create_data_type(slot_desc->type(), true);
@@ -132,12 +132,11 @@ TEST_F(ParquetReaderTest, normal) {
}
bool eof = false;
size_t read_row = 0;
- p_reader->get_next_block(block, &read_row, &eof);
+ p_reader->get_next_block(block.get(), &read_row, &eof);
for (auto& col : block->get_columns_with_type_and_name()) {
ASSERT_EQ(col.column->size(), 10);
}
EXPECT_TRUE(eof);
- delete block;
delete p_reader;
}
diff --git a/be/test/vec/exec/parquet/parquet_thrift_test.cpp b/be/test/vec/exec/parquet/parquet_thrift_test.cpp
index 3db30dfc2b..f41c442a96 100644
--- a/be/test/vec/exec/parquet/parquet_thrift_test.cpp
+++ b/be/test/vec/exec/parquet/parquet_thrift_test.cpp
@@ -324,7 +324,7 @@ static void create_block(std::unique_ptr<vectorized::Block>& block) {
ObjectPool object_pool;
doris::TupleDescriptor* tuple_desc = create_tuple_desc(&object_pool, column_descs);
auto tuple_slots = tuple_desc->slots();
- block.reset(new vectorized::Block());
+ block = vectorized::Block::create_unique();
for (const auto& slot_desc : tuple_slots) {
auto data_type = slot_desc->get_data_type_ptr();
MutableColumnPtr data_column = data_type->create_column();
diff --git a/be/test/vec/function/function_test_util.cpp b/be/test/vec/function/function_test_util.cpp
index da975a2c84..47905b832c 100644
--- a/be/test/vec/function/function_test_util.cpp
+++ b/be/test/vec/function/function_test_util.cpp
@@ -290,7 +290,7 @@ Block* create_block_from_inputset(const InputTypeSet& input_types, const InputDa
// 1.1 insert data and create block
auto row_size = input_set.size();
- std::unique_ptr<Block> block(new Block());
+ std::unique_ptr<Block> block = Block::create_unique();
for (size_t i = 0; i < descs.size(); ++i) {
auto& desc = descs[i];
auto column = desc.data_type->create_column();
@@ -357,7 +357,7 @@ Block* process_table_function(TableFunction* fn, Block* input_block,
} while (!fn->eos());
}
- std::unique_ptr<Block> output_block(new Block());
+ std::unique_ptr<Block> output_block = Block::create_unique();
output_block->insert({std::move(column), descs[0].data_type, descs[0].col_name});
return output_block.release();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org