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); + } +}