diff --git a/clickhouse/columns/enum.cpp b/clickhouse/columns/enum.cpp index 1fa2cba5..8243de7a 100644 --- a/clickhouse/columns/enum.cpp +++ b/clickhouse/columns/enum.cpp @@ -28,8 +28,8 @@ ColumnEnum::ColumnEnum(TypeRef type, std::vector&& data) template void ColumnEnum::Append(const T& value, bool checkValue) { - if (checkValue) { - // TODO: type_->HasEnumValue(value), "Enum type doesn't have value " + std::to_string(value); + if (checkValue && !type_->As()->HasEnumValue(value)) { + throw ValidationError("Enum type doesn't have value " + std::to_string(value)); } data_.push_back(value); } @@ -56,8 +56,8 @@ std::string_view ColumnEnum::NameAt(size_t n) const { template void ColumnEnum::SetAt(size_t n, const T& value, bool checkValue) { - if (checkValue) { - // TODO: type_->HasEnumValue(value), "Enum type doesn't have value " + std::to_string(value); + if (checkValue && !type_->As()->HasEnumValue(value)) { + throw ValidationError("Enum type doesn't have value " + std::to_string(value)); } data_.at(n) = value; } diff --git a/ut/columns_ut.cpp b/ut/columns_ut.cpp index 5573626f..e02147ef 100644 --- a/ut/columns_ut.cpp +++ b/ut/columns_ut.cpp @@ -751,6 +751,20 @@ TEST(ColumnsCase, EnumTest) { ASSERT_TRUE(CreateColumnByType("Enum8('Hi' = 1, 'Hello' = 2)")->Type()->IsEqual(Type::CreateEnum8(enum_items))); } +TEST(ColumnsCase, EnumCheckValue) { + auto column = std::make_shared(Type::CreateEnum8({{"Hi", 1}, {"Hello", 2}})); + + EXPECT_NO_THROW(column->Append(1, true)); + EXPECT_THROW(column->Append(3, true), ValidationError); + EXPECT_EQ(column->Size(), 1u); + + EXPECT_NO_THROW(column->SetAt(0, 2, true)); + EXPECT_EQ(column->At(0), 2); + + EXPECT_THROW(column->SetAt(0, 3, true), ValidationError); + EXPECT_EQ(column->At(0), 2); +} + TEST(ColumnsCase, NullableSlice) { auto data = std::make_shared(MakeNumbers()); auto nulls = std::make_shared(MakeBools());