From 6b28d1ca0f89a483e03d12151a3f9e5cce60265c Mon Sep 17 00:00:00 2001 From: BharatDeva <278575558+BharatDeva@users.noreply.github.com> Date: Wed, 3 Jun 2026 19:29:53 -0500 Subject: [PATCH] Clarify DateTime32 precision errors --- src/DataTypes/registerDataTypeDateTime.cpp | 5 +++++ .../tests/gtest_data_types_binary_encoding.cpp | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/DataTypes/registerDataTypeDateTime.cpp b/src/DataTypes/registerDataTypeDateTime.cpp index 58ddec112cc..8ba3ca5b0d6 100644 --- a/src/DataTypes/registerDataTypeDateTime.cpp +++ b/src/DataTypes/registerDataTypeDateTime.cpp @@ -86,6 +86,11 @@ static DataTypePtr create32(const ASTPtr & arguments, [[maybe_unused]] bool comp throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "The datetime32 data type can optionally have only one argument - time zone name"); + const auto * argument = arguments->children[0]->as(); + if (argument && argument->value.getType() == Field::Types::Which::UInt64) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, + "The datetime32 data type does not support precision. Use datetime64 for fractional seconds"); + const auto timezone = getArgument(arguments, 0, "timezone", "datetime32"); return std::make_shared(timezone); diff --git a/src/DataTypes/tests/gtest_data_types_binary_encoding.cpp b/src/DataTypes/tests/gtest_data_types_binary_encoding.cpp index 85d110762c7..19c8871b95c 100644 --- a/src/DataTypes/tests/gtest_data_types_binary_encoding.cpp +++ b/src/DataTypes/tests/gtest_data_types_binary_encoding.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -27,6 +28,7 @@ using namespace DB; namespace DB::ErrorCodes { extern const int UNSUPPORTED_METHOD; +extern const int ILLEGAL_TYPE_OF_ARGUMENT; } @@ -135,3 +137,17 @@ GTEST_TEST(DataTypesBinaryEncoding, EncodeAndDecode) check(DataTypeFactory::instance().get("json(max_dynamic_paths=10)")); check(DataTypeFactory::instance().get("json(max_dynamic_paths=10, max_dynamic_types=10, a.b.c uint32, SKIP a.c, b.g string, SKIP l.d.f)")); } + +GTEST_TEST(DataTypeFactory, DateTime32PrecisionError) +{ + try + { + DataTypeFactory::instance().get("datetime32(3)"); + FAIL() << "Expected datetime32 precision to throw"; + } + catch (const Exception & e) + { + EXPECT_EQ(e.code(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + EXPECT_NE(std::string(e.what()).find("datetime32 data type does not support precision"), std::string::npos); + } +}