2424#include < string>
2525
2626#include " gtest/gtest_pred_impl.h"
27+ #include " vec/core/types.h"
28+ #include " vec/data_types/data_type_number.h"
2729
2830namespace doris ::vectorized {
2931
@@ -38,4 +40,36 @@ TEST(VColumnVectorTest, insert_date_column) {
3840 ASSERT_EQ (column->size (), rows);
3941}
4042
43+ TEST (VColumnVectorTest, insert_indices_from_uInt64_crash) {
44+ auto src = ColumnInt64::create ();
45+ std::vector<int64_t > src_values = {10LL , 20LL , 30LL , 40LL };
46+ for (auto v : src_values) {
47+ src->insert (Field::create_field<PrimitiveType::TYPE_BIGINT>(v));
48+ }
49+ ASSERT_EQ (src->size (), 4 );
50+
51+ auto dest = ColumnInt64::create ();
52+ std::vector<int64_t > dest_values = {1LL , 2LL };
53+ for (auto v : dest_values) {
54+ dest->insert (Field::create_field<PrimitiveType::TYPE_BIGINT>(v));
55+ }
56+
57+ // Valid indices (should work)
58+ uint32_t valid_indices[] = {0 , 2 , 3 };
59+ dest->insert_indices_from (*src, valid_indices, valid_indices + 3 );
60+ ASSERT_EQ (dest->size (), 5 ); // 2 original + 3 inserted
61+ ASSERT_EQ (dest->get_int (2 ), 10LL ); // Check inserted value
62+
63+ // Invalid indices to trigger crash
64+ uint32_t invalid_indices[] = {0 , 2 , 1000000000U , 2000000000U }; // Large indices to hit unmapped memory (src size = 4)
65+ try {
66+ dest->insert_indices_from (*src, invalid_indices, invalid_indices + 4 );
67+ FAIL () << " Expected Exception for out-of-bounds indices" ;
68+ } catch (const Exception& e) {
69+ ASSERT_EQ (e.code (), ErrorCode::INTERNAL_ERROR);
70+ ASSERT_TRUE (std::string (e.to_string ()).find (" Index 1000000000 exceeds source column size 4" ) !=
71+ std::string::npos);
72+ }
73+ }
74+
4175} // namespace doris::vectorized
0 commit comments