blob: 74829b71ce7929f4b1cbd0a58436c0bc7f7e2994 [file] [log] [blame]
// 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.
#include <gmock/gmock-more-matchers.h>
#include <gtest/gtest.h>
#include <cstddef>
#include <cstdlib>
#include "column_nullable_test.h"
#include "vec/columns/column.h"
#include "vec/columns/column_decimal.h"
#include "vec/columns/column_nullable.h"
#include "vec/columns/column_string.h"
#include "vec/common/arena.h"
#include "vec/common/string_ref.h"
#include "vec/core/types.h"
using namespace doris;
using namespace doris::vectorized;
TEST(ColumnNullableSerializationTest, column_nullable_column_vector) {
const size_t input_rows_count = 4096 * 1000;
ColumnNullable::Ptr column_nullable = create_column_nullable<TYPE_BIGINT>(input_rows_count);
Arena arena(4096);
auto data = arena.alloc(input_rows_count * column_nullable->get_max_row_byte_size());
std::vector<StringRef> data_strs(input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
data_strs[i] = StringRef(data + i * column_nullable->get_max_row_byte_size(), 0);
}
column_nullable->serialize(data_strs.data(), input_rows_count);
ColumnNullable::MutablePtr result_column =
ColumnNullable::create(ColumnInt64::create(), ColumnUInt8::create());
result_column->deserialize(data_strs.data(), input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
EXPECT_EQ(column_nullable->get_data_at(i), result_column->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable->get_data_at(i),
result_column->get_data_at(i));
}
}
TEST(ColumnNullableSerializationTest, column_nullable_column_vector_all_null) {
const size_t input_rows_count = 4096 * 1000;
ColumnNullable::Ptr column_nullable =
create_column_nullable<TYPE_BIGINT>(input_rows_count, true);
Arena arena(4096);
auto data = arena.alloc(input_rows_count * column_nullable->get_max_row_byte_size());
std::vector<StringRef> data_strs(input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
data_strs[i] = StringRef(data + i * column_nullable->get_max_row_byte_size(), 0);
}
column_nullable->serialize(data_strs.data(), input_rows_count);
ColumnNullable::MutablePtr result_column =
ColumnNullable::create(ColumnInt64::create(), ColumnUInt8::create());
result_column->deserialize(data_strs.data(), input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
EXPECT_EQ(column_nullable->get_data_at(i), result_column->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable->get_data_at(i),
result_column->get_data_at(i));
}
}
TEST(ColumnNullableSerializationTest, column_nullable_column_vector_all_not_null) {
const size_t input_rows_count = 4096 * 1000;
ColumnNullable::Ptr column_nullable =
create_column_nullable<TYPE_BIGINT>(input_rows_count, false, true);
Arena arena(4096);
auto data = arena.alloc(input_rows_count * column_nullable->get_max_row_byte_size());
std::vector<StringRef> data_strs(input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
data_strs[i] = StringRef(data + i * column_nullable->get_max_row_byte_size(), 0);
}
column_nullable->serialize(data_strs.data(), input_rows_count);
ColumnNullable::MutablePtr result_column =
ColumnNullable::create(ColumnInt64::create(), ColumnUInt8::create());
result_column->deserialize(data_strs.data(), input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
EXPECT_EQ(column_nullable->get_data_at(i), result_column->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable->get_data_at(i),
result_column->get_data_at(i));
}
}
TEST(ColumnNullableSerializationTest, column_nullable_column_string) {
const size_t input_rows_count = 4096;
ColumnNullable::Ptr column_nullable = create_column_nullable<TYPE_STRING>(input_rows_count);
Arena arena(4096);
auto data = arena.alloc(input_rows_count * column_nullable->get_max_row_byte_size());
std::vector<StringRef> data_strs(input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
data_strs[i] = StringRef(data + i * column_nullable->get_max_row_byte_size(), 0);
}
column_nullable->serialize(data_strs.data(), input_rows_count);
ColumnNullable::MutablePtr result_column =
ColumnNullable::create(ColumnString::create(), ColumnUInt8::create());
result_column->deserialize(data_strs.data(), input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
ASSERT_EQ(column_nullable->get_data_at(i), result_column->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable->get_data_at(i),
result_column->get_data_at(i));
}
}
TEST(ColumnNullableSerializationTest, column_nullable_column_string_all_null) {
const size_t input_rows_count = 4096;
ColumnNullable::Ptr column_nullable =
create_column_nullable<TYPE_STRING>(input_rows_count, true);
Arena arena(4096);
auto data = arena.alloc(input_rows_count * column_nullable->get_max_row_byte_size());
std::vector<StringRef> data_strs(input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
data_strs[i] = StringRef(data + i * column_nullable->get_max_row_byte_size(), 0);
}
column_nullable->serialize(data_strs.data(), input_rows_count);
ColumnNullable::MutablePtr result_column =
ColumnNullable::create(ColumnString::create(), ColumnUInt8::create());
result_column->deserialize(data_strs.data(), input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
ASSERT_EQ(column_nullable->get_data_at(i), result_column->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable->get_data_at(i),
result_column->get_data_at(i));
}
}
TEST(ColumnNullableSerializationTest, column_nullable_column_string_all_not_null) {
const size_t input_rows_count = 4096;
ColumnNullable::Ptr column_nullable =
create_column_nullable<TYPE_STRING>(input_rows_count, false, true);
Arena arena(4096);
auto data = arena.alloc(input_rows_count * column_nullable->get_max_row_byte_size());
std::vector<StringRef> data_strs(input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
data_strs[i] = StringRef(data + i * column_nullable->get_max_row_byte_size(), 0);
}
column_nullable->serialize(data_strs.data(), input_rows_count);
ColumnNullable::MutablePtr result_column =
ColumnNullable::create(ColumnString::create(), ColumnUInt8::create());
result_column->deserialize(data_strs.data(), input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
ASSERT_EQ(column_nullable->get_data_at(i), result_column->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable->get_data_at(i),
result_column->get_data_at(i));
}
}
TEST(ColumnNullableSerializationTest, column_nullable_column_decimal) {
const size_t input_rows_count = 4096 * 1000;
ColumnNullable::Ptr column_nullable = create_column_nullable<TYPE_DECIMAL64>(input_rows_count);
Arena arena(4096);
auto data = arena.alloc(input_rows_count * column_nullable->get_max_row_byte_size());
std::vector<StringRef> data_strs(input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
data_strs[i] = StringRef(data + i * column_nullable->get_max_row_byte_size(), 0);
}
column_nullable->serialize(data_strs.data(), input_rows_count);
ColumnNullable::MutablePtr result_column =
ColumnNullable::create(ColumnDecimal64::create(0, 6), ColumnUInt8::create());
result_column->deserialize(data_strs.data(), input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
ASSERT_EQ(column_nullable->get_data_at(i), result_column->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable->get_data_at(i),
result_column->get_data_at(i));
}
}
TEST(ColumnNullableSerializationTest, column_nullable_column_decimal_all_null) {
const size_t input_rows_count = 4096 * 1000;
ColumnNullable::Ptr column_nullable =
create_column_nullable<TYPE_DECIMAL64>(input_rows_count, true);
Arena arena(4096);
auto data = arena.alloc(input_rows_count * column_nullable->get_max_row_byte_size());
std::vector<StringRef> data_strs(input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
data_strs[i] = StringRef(data + i * column_nullable->get_max_row_byte_size(), 0);
}
column_nullable->serialize(data_strs.data(), input_rows_count);
ColumnNullable::MutablePtr result_column =
ColumnNullable::create(ColumnDecimal64::create(0, 6), ColumnUInt8::create());
result_column->deserialize(data_strs.data(), input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
ASSERT_EQ(column_nullable->get_data_at(i), result_column->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable->get_data_at(i),
result_column->get_data_at(i));
}
}
TEST(ColumnNullableSerializationTest, column_nullable_column_decimal_all_not_null) {
const size_t input_rows_count = 4096 * 1000;
ColumnNullable::Ptr column_nullable =
create_column_nullable<TYPE_DECIMAL64>(input_rows_count, false, true);
Arena arena(4096);
auto data = arena.alloc(input_rows_count * column_nullable->get_max_row_byte_size());
std::vector<StringRef> data_strs(input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
data_strs[i] = StringRef(data + i * column_nullable->get_max_row_byte_size(), 0);
}
column_nullable->serialize(data_strs.data(), input_rows_count);
ColumnNullable::MutablePtr result_column =
ColumnNullable::create(ColumnDecimal64::create(0, 6), ColumnUInt8::create());
result_column->deserialize(data_strs.data(), input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
ASSERT_EQ(column_nullable->get_data_at(i), result_column->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable->get_data_at(i),
result_column->get_data_at(i));
}
}
TEST(ColumnNullableSerializationTest, multiple_columns) {
const size_t input_rows_count = 4096 * 100;
auto column_nullable_decimal64 = create_column_nullable<TYPE_DECIMAL64>(input_rows_count);
auto column_nullable_int64 = create_column_nullable<TYPE_BIGINT>(input_rows_count);
auto column_nullable_string = create_column_nullable<TYPE_STRING>(input_rows_count);
size_t max_row_byte_size = 0;
max_row_byte_size += column_nullable_decimal64->get_max_row_byte_size();
max_row_byte_size += column_nullable_int64->get_max_row_byte_size();
max_row_byte_size += column_nullable_string->get_max_row_byte_size();
Arena arena(4096);
auto* data = arena.alloc(input_rows_count * max_row_byte_size);
std::vector<StringRef> data_strs(input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
data_strs[i] = StringRef(data + i * max_row_byte_size, 0);
}
column_nullable_decimal64->serialize(data_strs.data(), input_rows_count);
column_nullable_int64->serialize(data_strs.data(), input_rows_count);
column_nullable_string->serialize(data_strs.data(), input_rows_count);
ColumnNullable::MutablePtr result_column_decimal64 =
ColumnNullable::create(ColumnDecimal64::create(0, 6), ColumnUInt8::create());
ColumnNullable::MutablePtr result_column_int64 =
ColumnNullable::create(ColumnInt64::create(), ColumnUInt8::create());
ColumnNullable::MutablePtr result_column_string =
ColumnNullable::create(ColumnString::create(), ColumnUInt8::create());
result_column_decimal64->deserialize(data_strs.data(), input_rows_count);
result_column_int64->deserialize(data_strs.data(), input_rows_count);
result_column_string->deserialize(data_strs.data(), input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
ASSERT_EQ(column_nullable_decimal64->get_data_at(i),
result_column_decimal64->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable_decimal64->get_data_at(i),
result_column_decimal64->get_data_at(i));
ASSERT_EQ(column_nullable_int64->get_data_at(i), result_column_int64->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable_int64->get_data_at(i),
result_column_int64->get_data_at(i));
ASSERT_EQ(column_nullable_string->get_data_at(i), result_column_string->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable_string->get_data_at(i),
result_column_string->get_data_at(i));
}
}
TEST(ColumnNullableSerializationTest, multiple_columns_all_null) {
const size_t input_rows_count = 4096 * 100;
auto column_nullable_decimal64 = create_column_nullable<TYPE_DECIMAL64>(input_rows_count, true);
auto column_nullable_int64 = create_column_nullable<TYPE_BIGINT>(input_rows_count, true);
auto column_nullable_string = create_column_nullable<TYPE_STRING>(input_rows_count, true);
size_t max_row_byte_size = 0;
max_row_byte_size += column_nullable_decimal64->get_max_row_byte_size();
max_row_byte_size += column_nullable_int64->get_max_row_byte_size();
max_row_byte_size += column_nullable_string->get_max_row_byte_size();
Arena arena(4096);
auto* data = arena.alloc(input_rows_count * max_row_byte_size);
std::vector<StringRef> data_strs(input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
data_strs[i] = StringRef(data + i * max_row_byte_size, 0);
}
column_nullable_decimal64->serialize(data_strs.data(), input_rows_count);
column_nullable_int64->serialize(data_strs.data(), input_rows_count);
column_nullable_string->serialize(data_strs.data(), input_rows_count);
ColumnNullable::MutablePtr result_column_decimal64 =
ColumnNullable::create(ColumnDecimal64::create(0, 6), ColumnUInt8::create());
ColumnNullable::MutablePtr result_column_int64 =
ColumnNullable::create(ColumnInt64::create(), ColumnUInt8::create());
ColumnNullable::MutablePtr result_column_string =
ColumnNullable::create(ColumnString::create(), ColumnUInt8::create());
result_column_decimal64->deserialize(data_strs.data(), input_rows_count);
result_column_int64->deserialize(data_strs.data(), input_rows_count);
result_column_string->deserialize(data_strs.data(), input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
ASSERT_EQ(column_nullable_decimal64->get_data_at(i),
result_column_decimal64->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable_decimal64->get_data_at(i),
result_column_decimal64->get_data_at(i));
ASSERT_EQ(column_nullable_int64->get_data_at(i), result_column_int64->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable_int64->get_data_at(i),
result_column_int64->get_data_at(i));
ASSERT_EQ(column_nullable_string->get_data_at(i), result_column_string->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable_string->get_data_at(i),
result_column_string->get_data_at(i));
}
}
TEST(ColumnNullableSerializationTest, multiple_columns_all_not_null) {
const size_t input_rows_count = 4096 * 100;
auto column_nullable_decimal64 =
create_column_nullable<TYPE_DECIMAL64>(input_rows_count, false, true);
auto column_nullable_int64 = create_column_nullable<TYPE_BIGINT>(input_rows_count, false, true);
auto column_nullable_string =
create_column_nullable<TYPE_STRING>(input_rows_count, false, true);
size_t max_row_byte_size = 0;
max_row_byte_size += column_nullable_decimal64->get_max_row_byte_size();
max_row_byte_size += column_nullable_int64->get_max_row_byte_size();
max_row_byte_size += column_nullable_string->get_max_row_byte_size();
Arena arena(4096);
auto data = arena.alloc(input_rows_count * max_row_byte_size);
std::vector<StringRef> data_strs(input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
data_strs[i] = StringRef(data + i * max_row_byte_size, 0);
}
column_nullable_decimal64->serialize(data_strs.data(), input_rows_count);
column_nullable_int64->serialize(data_strs.data(), input_rows_count);
column_nullable_string->serialize(data_strs.data(), input_rows_count);
ColumnNullable::MutablePtr result_column_decimal64 =
ColumnNullable::create(ColumnDecimal64::create(0, 6), ColumnUInt8::create());
ColumnNullable::MutablePtr result_column_int64 =
ColumnNullable::create(ColumnInt64::create(), ColumnUInt8::create());
ColumnNullable::MutablePtr result_column_string =
ColumnNullable::create(ColumnString::create(), ColumnUInt8::create());
result_column_decimal64->deserialize(data_strs.data(), input_rows_count);
result_column_int64->deserialize(data_strs.data(), input_rows_count);
result_column_string->deserialize(data_strs.data(), input_rows_count);
for (size_t i = 0; i < input_rows_count; ++i) {
ASSERT_EQ(column_nullable_decimal64->get_data_at(i),
result_column_decimal64->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable_decimal64->get_data_at(i),
result_column_decimal64->get_data_at(i));
ASSERT_EQ(column_nullable_int64->get_data_at(i), result_column_int64->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable_int64->get_data_at(i),
result_column_int64->get_data_at(i));
ASSERT_EQ(column_nullable_string->get_data_at(i), result_column_string->get_data_at(i))
<< fmt::format("source {}\nresult {}\n", column_nullable_string->get_data_at(i),
result_column_string->get_data_at(i));
}
}