From 612777b690d4f8213917989c974a840697b79f0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3?= <150132506+iddqdex@users.noreply.github.com> Date: Tue, 21 May 2024 10:21:30 +0300 Subject: [PATCH] Decimal type in olap (#4701) --- ydb/core/kqp/ut/common/columnshard.cpp | 12 ++++- ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp | 49 +++++++++++++++++++ .../tx/schemeshard/olap/columns/update.cpp | 1 - .../lib/ydb_cli/common/csv_parser_ut.cpp | 4 ++ 4 files changed, 63 insertions(+), 3 deletions(-) diff --git a/ydb/core/kqp/ut/common/columnshard.cpp b/ydb/core/kqp/ut/common/columnshard.cpp index 151d51f9b254..4bd74f93cf74 100644 --- a/ydb/core/kqp/ut/common/columnshard.cpp +++ b/ydb/core/kqp/ut/common/columnshard.cpp @@ -133,9 +133,17 @@ namespace NKqp { TString TTestHelper::TColumnSchema::BuildQuery() const { TStringBuilder str; str << Name << ' '; - if (NScheme::NTypeIds::Pg == Type) { + switch (Type) { + case NScheme::NTypeIds::Pg: str << NPg::PgTypeNameFromTypeDesc(TypeDesc); - } else { + break; + case NScheme::NTypeIds::Decimal: { + TTypeBuilder builder; + builder.Decimal(TDecimalType(22, 9)); + str << builder.Build(); + break; + } + default: str << NScheme::GetTypeName(Type); } if (!NullableFlag) { diff --git a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp index 7b726b7b107f..0aa94620b647 100644 --- a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp +++ b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp @@ -6652,6 +6652,55 @@ Y_UNIT_TEST_SUITE(KqpOlapTypes) { testHelper.ReadData("SELECT * FROM `/Root/ColumnTableTest` WHERE id=1", TStringBuilder() << "[[1;" << ts.MicroSeconds() << "u;" << ts.MicroSeconds() << "u]]"); } + Y_UNIT_TEST(Decimal) { + TKikimrSettings runnerSettings; + runnerSettings.WithSampleTables = false; + + TTestHelper testHelper(runnerSettings); + + TVector schema = { + TTestHelper::TColumnSchema().SetName("id").SetType(NScheme::NTypeIds::Int64).SetNullable(false), + TTestHelper::TColumnSchema().SetName("dec").SetType(NScheme::NTypeIds::Decimal).SetNullable(false), + }; + + TTestHelper::TColumnTable testTable; + testTable.SetName("/Root/ColumnTableTest").SetPrimaryKey({"id"}).SetSharding({"id"}).SetSchema(schema); + testHelper.CreateTable(testTable); + + { + TValueBuilder builder; + builder.BeginList(); + builder.AddListItem().BeginStruct() + .AddMember("id").Int64(1) + .AddMember("dec").Decimal(TString("10.1")) + .EndStruct(); + builder.AddListItem().BeginStruct() + .AddMember("id").Int64(2) + .AddMember("dec").Decimal(TString("inf")) + .EndStruct(); + builder.AddListItem().BeginStruct() + .AddMember("id").Int64(3) + .AddMember("dec").Decimal(TString("-inf")) + .EndStruct(); + builder.AddListItem().BeginStruct() + .AddMember("id").Int64(4) + .AddMember("dec").Decimal(TString("nan")) + .EndStruct(); + builder.AddListItem().BeginStruct() + .AddMember("id").Int64(5) + .AddMember("dec").Decimal(TString("-nan")) + .EndStruct(); + builder.EndList(); + const auto result = testHelper.GetKikimr().GetTableClient().BulkUpsert(testTable.GetName(), builder.Build()).GetValueSync(); + UNIT_ASSERT_C(result.IsSuccess() , result.GetIssues().ToString()); + } + testHelper.ReadData("SELECT dec FROM `/Root/ColumnTableTest` WHERE id=1", "[[\"10.1\"]]"); + testHelper.ReadData("SELECT dec FROM `/Root/ColumnTableTest` WHERE id=2", "[[\"inf\"]]"); + testHelper.ReadData("SELECT dec FROM `/Root/ColumnTableTest` WHERE id=3", "[[\"-inf\"]]"); + testHelper.ReadData("SELECT dec FROM `/Root/ColumnTableTest` WHERE id=4", "[[\"nan\"]]"); + testHelper.ReadData("SELECT dec FROM `/Root/ColumnTableTest` WHERE id=5", "[[\"-nan\"]]"); + } + Y_UNIT_TEST(TimestampCmpErr) { TKikimrSettings runnerSettings; runnerSettings.WithSampleTables = false; diff --git a/ydb/core/tx/schemeshard/olap/columns/update.cpp b/ydb/core/tx/schemeshard/olap/columns/update.cpp index 3ea1055e9295..23d587ae92d3 100644 --- a/ydb/core/tx/schemeshard/olap/columns/update.cpp +++ b/ydb/core/tx/schemeshard/olap/columns/update.cpp @@ -155,7 +155,6 @@ namespace NKikimr::NSchemeShard { switch (typeId) { case NYql::NProto::Bool: case NYql::NProto::Interval: - case NYql::NProto::Decimal: case NYql::NProto::DyNumber: return false; default: diff --git a/ydb/public/lib/ydb_cli/common/csv_parser_ut.cpp b/ydb/public/lib/ydb_cli/common/csv_parser_ut.cpp index 9887c9fc7ea2..0619bca36b5d 100644 --- a/ydb/public/lib/ydb_cli/common/csv_parser_ut.cpp +++ b/ydb/public/lib/ydb_cli/common/csv_parser_ut.cpp @@ -106,6 +106,10 @@ Y_UNIT_TEST_SUITE(YdbCliCsvParserTests) { CommonTestParams("name", "1.183", {{"$name", TValueBuilder().Double(1.183).Build()}}); CommonTestParams("name", "1.183", {{"$name", TValueBuilder().DyNumber("1.183").Build()}}); CommonTestParams("name", "1.183", {{"$name", TValueBuilder().Decimal(TString("1.183")).Build()}}); + CommonTestParams("name", "inf", {{"$name", TValueBuilder().Decimal(TString("inf")).Build()}}); + CommonTestParams("name", "-inf", {{"$name", TValueBuilder().Decimal(TString("-inf")).Build()}}); + CommonTestParams("name", "nan", {{"$name", TValueBuilder().Decimal(TString("nan")).Build()}}); + CommonTestParams("name", "-nan", {{"$name", TValueBuilder().Decimal(TString("-nan")).Build()}}); CommonTestParams("name", "550e8400-e29b-41d4-a716-446655440000", {{"$name", TValueBuilder().Uuid(TUuidValue("550e8400-e29b-41d4-a716-446655440000")).Build()}}); CommonTestParams("name", "\"{\"\"a\"\":10, \"\"b\"\":\"\"string\"\"}\"", {{"$name", TValueBuilder().Json("{\"a\":10, \"b\":\"string\"}").Build()}}); CommonTestParams("name", "строка", {{"$name", TValueBuilder().OptionalUtf8("строка").Build()}});