From 3c0bb781afe9473bb694a7e64f5066d128329744 Mon Sep 17 00:00:00 2001 From: qrort <31865255+qrort@users.noreply.github.com> Date: Wed, 3 Jan 2024 17:01:27 +0300 Subject: [PATCH] add pg types to TQueryPlan (#828) --- ydb/core/kqp/opt/kqp_query_plan.cpp | 26 +++++++++++++++---------- ydb/core/kqp/ut/opt/kqp_not_null_ut.cpp | 4 +--- ydb/public/lib/value/value.cpp | 15 ++++++++++++++ ydb/public/lib/value/value.h | 2 ++ ydb/public/lib/value/ya.make | 1 + 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/ydb/core/kqp/opt/kqp_query_plan.cpp b/ydb/core/kqp/opt/kqp_query_plan.cpp index fbebd4bca6b6..c875a0224814 100644 --- a/ydb/core/kqp/opt/kqp_query_plan.cpp +++ b/ydb/core/kqp/opt/kqp_query_plan.cpp @@ -515,17 +515,23 @@ class TxPlanSerializer { } TString DescribeValue(const NKikimr::NClient::TValue& value) { - auto str = value.GetDataText(); - switch (value.GetType().GetData().GetScheme()) { - case NScheme::NTypeIds::Utf8: - case NScheme::NTypeIds::Json: - case NScheme::NTypeIds::String: - case NScheme::NTypeIds::String4k: - case NScheme::NTypeIds::String2m: - return "«" + str + "»"; - default: - return str; + if (value.GetType().GetKind() == NKikimrMiniKQL::ETypeKind::Data) { + auto str = value.GetDataText(); + switch (value.GetType().GetData().GetScheme()) { + case NScheme::NTypeIds::Utf8: + case NScheme::NTypeIds::Json: + case NScheme::NTypeIds::String: + case NScheme::NTypeIds::String4k: + case NScheme::NTypeIds::String2m: + return "«" + str + "»"; + default: + return str; + } + } + if (value.GetType().GetKind() == NKikimrMiniKQL::ETypeKind::Pg) { + return value.GetPgText(); } + Y_ENSURE(false, TStringBuilder() << "unexpected NKikimrMiniKQL::ETypeKind: " << ETypeKind_Name(value.GetType().GetKind())); } void Visit(const TKqpReadRangesSourceSettings& sourceSettings, TQueryPlanNode& planNode) { diff --git a/ydb/core/kqp/ut/opt/kqp_not_null_ut.cpp b/ydb/core/kqp/ut/opt/kqp_not_null_ut.cpp index bcb5ad28a010..80adbdfc0831 100644 --- a/ydb/core/kqp/ut/opt/kqp_not_null_ut.cpp +++ b/ydb/core/kqp/ut/opt/kqp_not_null_ut.cpp @@ -1653,8 +1653,6 @@ Y_UNIT_TEST_SUITE(KqpNotNullColumns) { } } -#if 0 - // TODO: fix TxPlanSerializer with PG keys Y_UNIT_TEST(SecondaryIndexWithNotNullDataColumnPg) { auto settings = TKikimrSettings() .SetWithSampleTables(false) @@ -1759,7 +1757,7 @@ Y_UNIT_TEST_SUITE(KqpNotNullColumns) { result.GetIssues().ToString()); } } -#endif + Y_UNIT_TEST_TWIN(JoinBothTablesWithNotNullPk, StreamLookup) { NKikimrConfig::TAppConfig appConfig; diff --git a/ydb/public/lib/value/value.cpp b/ydb/public/lib/value/value.cpp index 7edde8c7a5ec..a728604b6b9c 100644 --- a/ydb/public/lib/value/value.cpp +++ b/ydb/public/lib/value/value.cpp @@ -1,6 +1,7 @@ #include "value.h" #include +#include #include @@ -432,6 +433,20 @@ TString TValue::GetDataText() const { return TStringBuilder() << "\"\""; } +TString TValue::GetPgText() const { + Y_ASSERT(Type.GetKind() == NKikimrMiniKQL::ETypeKind::Pg); + if (Value.HasNullFlagValue()) { + return TString("null"); + } + if (Value.HasText()) { + return Value.GetText(); + } + auto pgType = Type.GetPg(); + auto convertResult = NPg::PgNativeTextFromNativeBinary(Value.GetBytes(), NPg::TypeDescFromPgTypeId(pgType.Getoid())); + Y_ENSURE(!convertResult.Error, convertResult.Error); + return convertResult.Str; +} + template <> TString TValue::GetTypeText(const TFormatCxx& format) const { switch(Type.GetKind()) { case NKikimrMiniKQL::ETypeKind::Void: diff --git a/ydb/public/lib/value/value.h b/ydb/public/lib/value/value.h index 8ae368ac027b..c0b668ffe058 100644 --- a/ydb/public/lib/value/value.h +++ b/ydb/public/lib/value/value.h @@ -89,6 +89,8 @@ class TValue { NScheme::TTypeId GetDataType() const; // gets text representation of simple 'Data' types TString GetDataText() const; + // gets text representation of 'Pg' types + TString GetPgText() const; // returns text representation of value's type template TString GetTypeText(const Format& format = Format()) const; // returns text representation of value itself diff --git a/ydb/public/lib/value/ya.make b/ydb/public/lib/value/ya.make index c87b3d471067..55e49f1b27af 100644 --- a/ydb/public/lib/value/ya.make +++ b/ydb/public/lib/value/ya.make @@ -9,6 +9,7 @@ PEERDIR( library/cpp/string_utils/base64 ydb/core/protos ydb/library/mkql_proto/protos + ydb/library/yql/parser/pg_wrapper/interface ydb/public/lib/scheme_types ydb/public/sdk/cpp/client/ydb_value )