From a779cc3f7e60ce72f4792ab1563deb0b05168f19 Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Mon, 24 Aug 2026 11:32:55 +0200 Subject: [PATCH] Validate enum values when requested --- clickhouse/columns/enum.cpp | 8 ++++---- ut/columns_ut.cpp | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) 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());