Skip to content

Commit d846408

Browse files
branch-4.0: [function](agg) support agg function of group_array_union #57166 (#57596)
Cherry-picked from #57166 Co-authored-by: zhangstar333 <[email protected]>
1 parent 6a67606 commit d846408

File tree

12 files changed

+930
-597
lines changed

12 files changed

+930
-597
lines changed

be/src/exprs/hybrid_set.h

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@ class HybridSetBase : public FilterBase {
221221
// use in vectorize execute engine
222222
virtual void insert(void* data, size_t) = 0;
223223

224+
virtual void insert_range_from(const vectorized::ColumnPtr& column, size_t start,
225+
size_t end) = 0;
226+
224227
virtual void insert_fixed_len(const vectorized::ColumnPtr& column, size_t start) = 0;
225228

226229
virtual void insert(HybridSetBase* set) {
@@ -291,8 +294,16 @@ class HybridSet : public HybridSetBase {
291294
void insert(void* data, size_t /*unused*/) override { insert(data); }
292295

293296
void insert_fixed_len(const vectorized::ColumnPtr& column, size_t start) override {
294-
const auto size = column->size();
297+
insert_range_from(column, start, column->size());
298+
}
295299

300+
void insert_range_from(const vectorized::ColumnPtr& column, size_t start, size_t end) override {
301+
if (end > column->size()) {
302+
throw doris::Exception(doris::ErrorCode::INTERNAL_ERROR,
303+
"Parameters start = {}, end = {}, are out of bound in "
304+
"HybridSet::insert_range_from method (data.size() = {}).",
305+
start, end, column->size());
306+
}
296307
if (column->is_nullable()) {
297308
const auto* nullable = assert_cast<const vectorized::ColumnNullable*>(column.get());
298309
const auto& col = nullable->get_nested_column();
@@ -301,7 +312,7 @@ class HybridSet : public HybridSetBase {
301312
.get_data();
302313

303314
const ElementType* data = (ElementType*)col.get_raw_data().data;
304-
for (size_t i = start; i < size; i++) {
315+
for (size_t i = start; i < end; i++) {
305316
if (!nullmap[i]) {
306317
_set.insert(*(data + i));
307318
} else {
@@ -310,7 +321,7 @@ class HybridSet : public HybridSetBase {
310321
}
311322
} else {
312323
const ElementType* data = (ElementType*)column->get_raw_data().data;
313-
for (size_t i = start; i < size; i++) {
324+
for (size_t i = start; i < end; i++) {
314325
_set.insert(*(data + i));
315326
}
316327
}
@@ -448,6 +459,16 @@ class StringSet : public HybridSetBase {
448459
}
449460

450461
void insert_fixed_len(const vectorized::ColumnPtr& column, size_t start) override {
462+
insert_range_from(column, start, column->size());
463+
}
464+
465+
void insert_range_from(const vectorized::ColumnPtr& column, size_t start, size_t end) override {
466+
if (end > column->size()) {
467+
throw doris::Exception(doris::ErrorCode::INTERNAL_ERROR,
468+
"Parameters start = {}, end = {}, are out of bound in "
469+
"StringSet::insert_range_from method (data.size() = {}).",
470+
start, end, column->size());
471+
}
451472
if (column->is_nullable()) {
452473
const auto* nullable = assert_cast<const vectorized::ColumnNullable*>(column.get());
453474
const auto& nullmap =
@@ -456,19 +477,19 @@ class StringSet : public HybridSetBase {
456477
if (nullable->get_nested_column().is_column_string64()) {
457478
_insert_fixed_len_string(assert_cast<const vectorized::ColumnString64&>(
458479
nullable->get_nested_column()),
459-
nullmap.data(), start, nullmap.size());
480+
nullmap.data(), start, end);
460481
} else {
461482
_insert_fixed_len_string(
462483
assert_cast<const vectorized::ColumnString&>(nullable->get_nested_column()),
463-
nullmap.data(), start, nullmap.size());
484+
nullmap.data(), start, end);
464485
}
465486
} else {
466487
if (column->is_column_string64()) {
467488
_insert_fixed_len_string(assert_cast<const vectorized::ColumnString64&>(*column),
468-
nullptr, start, column->size());
489+
nullptr, start, end);
469490
} else {
470491
_insert_fixed_len_string(assert_cast<const vectorized::ColumnString&>(*column),
471-
nullptr, start, column->size());
492+
nullptr, start, end);
472493
}
473494
}
474495
}
@@ -618,6 +639,16 @@ class StringValueSet : public HybridSetBase {
618639
}
619640

620641
void insert_fixed_len(const vectorized::ColumnPtr& column, size_t start) override {
642+
insert_range_from(column, start, column->size());
643+
}
644+
645+
void insert_range_from(const vectorized::ColumnPtr& column, size_t start, size_t end) override {
646+
if (end > column->size()) {
647+
throw doris::Exception(doris::ErrorCode::INTERNAL_ERROR,
648+
"Parameters start = {}, end = {}, are out of bound in "
649+
"StringSet::insert_range_from method (data.size() = {}).",
650+
start, end, column->size());
651+
}
621652
if (column->is_nullable()) {
622653
const auto* nullable = assert_cast<const vectorized::ColumnNullable*>(column.get());
623654
const auto& nullmap =
@@ -626,19 +657,19 @@ class StringValueSet : public HybridSetBase {
626657
if (nullable->get_nested_column().is_column_string64()) {
627658
_insert_fixed_len_string(assert_cast<const vectorized::ColumnString64&>(
628659
nullable->get_nested_column()),
629-
nullmap.data(), start, nullmap.size());
660+
nullmap.data(), start, end);
630661
} else {
631662
_insert_fixed_len_string(
632663
assert_cast<const vectorized::ColumnString&>(nullable->get_nested_column()),
633-
nullmap.data(), start, nullmap.size());
664+
nullmap.data(), start, end);
634665
}
635666
} else {
636667
if (column->is_column_string64()) {
637668
_insert_fixed_len_string(assert_cast<const vectorized::ColumnString64&>(*column),
638-
nullptr, start, column->size());
669+
nullptr, start, end);
639670
} else {
640671
_insert_fixed_len_string(assert_cast<const vectorized::ColumnString&>(*column),
641-
nullptr, start, column->size());
672+
nullptr, start, end);
642673
}
643674
}
644675
}

be/src/vec/aggregate_functions/aggregate_function_group_array_intersect.cpp

Lines changed: 0 additions & 66 deletions
This file was deleted.

0 commit comments

Comments
 (0)