@@ -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 }
0 commit comments