From 502fa2eb50d69e16f9b3343c86ce0950cdd529d5 Mon Sep 17 00:00:00 2001 From: yangzhg <780531911@qq.com> Date: Fri, 7 Feb 2020 21:40:29 +0800 Subject: [PATCH] [GroupingSet] Fix core when using grouping sets in large data (#2858) dst_tuples memory size to Allocate is wrong --- be/src/exec/repeat_node.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/be/src/exec/repeat_node.cpp b/be/src/exec/repeat_node.cpp index 7b9f36b807..9de70ee079 100644 --- a/be/src/exec/repeat_node.cpp +++ b/be/src/exec/repeat_node.cpp @@ -80,13 +80,6 @@ Status RepeatNode::get_repeated_batch( const vector& src_tuple_descs = child_row_batch->row_desc().tuple_descriptors(); const vector& dst_tuple_descs = row_batch->row_desc().tuple_descriptors(); vector dst_tuples(src_tuple_descs.size(), nullptr); - for (Tuple* &tuple : dst_tuples) { - void* tuple_buffer = tuple_pool->allocate(0); - if (tuple_buffer == nullptr) { - return Status::InternalError("Allocate memory for row batch failed."); - } - tuple = reinterpret_cast(tuple_buffer); - } for (int i = 0; i < child_row_batch->num_rows(); ++i) { int row_idx = row_batch->add_row(); TupleRow* dst_row = row_batch->get_row(row_idx); @@ -100,10 +93,18 @@ Status RepeatNode::get_repeated_batch( continue; } - char* new_tuple = reinterpret_cast(dst_tuples[j]); - new_tuple += (*dst_it)->byte_size(); - dst_tuples[j] = reinterpret_cast(new_tuple); - + if (dst_tuples[j] == nullptr) { + int size = row_batch->capacity() * (*dst_it)->byte_size(); + void* tuple_buffer = tuple_pool->allocate(size); + if (tuple_buffer == nullptr) { + return Status::InternalError("Allocate memory for row batch failed."); + } + dst_tuples[j] = reinterpret_cast(tuple_buffer); + } else { + char* new_tuple = reinterpret_cast(dst_tuples[j]); + new_tuple += (*dst_it)->byte_size(); + dst_tuples[j] = reinterpret_cast(new_tuple); + } dst_row->set_tuple(j, dst_tuples[j]); memset(dst_tuples[j], 0, (*dst_it)->num_null_bytes()); src_tuple->deep_copy(dst_tuples[j], **dst_it, tuple_pool);