Skip to content

Commit 219df53

Browse files
authored
Merge 3f047d9 into 4a35432
2 parents 4a35432 + 3f047d9 commit 219df53

File tree

3 files changed

+112
-26
lines changed

3 files changed

+112
-26
lines changed

ydb/core/grpc_services/rpc_read_rows.cpp

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,11 @@ class TReadRowsRPC : public TActorBootstrapped<TReadRowsRPC> {
607607
for (const auto& colMeta : RequestedColumnsMeta) {
608608
const auto type = getTypeFromColMeta(colMeta);
609609
auto* col = resultSet->Addcolumns();
610-
*col->mutable_type() = NYdb::TProtoAccessor::GetProto(type);
610+
if (colMeta.IsNotNullColumn || colMeta.Type.GetTypeId() == NScheme::NTypeIds::Pg) { // pg type in nullable itself
611+
*col->mutable_type() = NYdb::TProtoAccessor::GetProto(type);
612+
} else {
613+
*col->mutable_type()->mutable_optional_type()->mutable_item() = NYdb::TProtoAccessor::GetProto(type);
614+
}
611615
*col->mutable_name() = colMeta.Name;
612616
}
613617

@@ -637,18 +641,41 @@ class TReadRowsRPC : public TActorBootstrapped<TReadRowsRPC> {
637641
}
638642
case NScheme::NTypeIds::Decimal: {
639643
using namespace NYql::NDecimal;
640-
641-
const auto loHi = cell.AsValue<std::pair<ui64, i64>>();
642-
Ydb::Value valueProto;
643-
valueProto.set_low_128(loHi.first);
644-
valueProto.set_high_128(loHi.second);
645-
const NYdb::TDecimalValue decimal(valueProto,
646-
{static_cast<ui8>(colMeta.Type.GetDecimalType().GetPrecision()), static_cast<ui8>(colMeta.Type.GetDecimalType().GetScale())});
647-
vb.Decimal(decimal);
644+
645+
NYdb::TDecimalType decimalType{
646+
static_cast<ui8>(colMeta.Type.GetDecimalType().GetPrecision()),
647+
static_cast<ui8>(colMeta.Type.GetDecimalType().GetScale())
648+
};
649+
650+
if (cell.IsNull()) {
651+
vb.EmptyOptional(NYdb::TTypeBuilder().Decimal(decimalType).Build());
652+
} else {
653+
const auto loHi = cell.AsValue<std::pair<ui64, i64>>();
654+
Ydb::Value valueProto;
655+
valueProto.set_low_128(loHi.first);
656+
valueProto.set_high_128(loHi.second);
657+
if (colMeta.IsNotNullColumn) {
658+
vb.Decimal({valueProto, decimalType});
659+
} else {
660+
vb.BeginOptional();
661+
vb.Decimal({valueProto, decimalType});
662+
vb.EndOptional();
663+
}
664+
}
648665
break;
649666
}
650667
default: {
651-
ProtoValueFromCell(vb, colMeta.Type, cell);
668+
if (cell.IsNull()) {
669+
vb.EmptyOptional((NYdb::EPrimitiveType)colMeta.Type.GetTypeId());
670+
} else {
671+
if (colMeta.IsNotNullColumn) {
672+
ProtoValueFromCell(vb, colMeta.Type, cell);
673+
} else {
674+
vb.BeginOptional();
675+
ProtoValueFromCell(vb, colMeta.Type, cell);
676+
vb.EndOptional();
677+
}
678+
}
652679
break;
653680
}
654681
}
@@ -744,13 +771,15 @@ class TReadRowsRPC : public TActorBootstrapped<TReadRowsRPC> {
744771
, Name(colInfo.Name)
745772
, Type(colInfo.PType)
746773
, PTypeMod(colInfo.PTypeMod)
774+
, IsNotNullColumn(colInfo.IsNotNullColumn)
747775
{
748776
}
749777

750778
ui32 Id;
751779
TString Name;
752780
NScheme::TTypeInfo Type;
753781
TString PTypeMod;
782+
bool IsNotNullColumn;
754783
};
755784
TVector<TColumnMeta> RequestedColumnsMeta;
756785

ydb/core/kqp/ut/opt/kqp_kv_ut.cpp

Lines changed: 69 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,11 @@ Y_UNIT_TEST_SUITE(KqpKv) {
152152
auto res = FormatResultSetYson(selectResult.GetResultSet());
153153
CompareYson(R"(
154154
[
155-
[1858343823u;0u;"abcde"];
156-
[1921763476782200957u;1u;"abcde"];
157-
[3843526951706058091u;2u;"abcde"];
158-
[5765290426629915225u;3u;"abcde"];
159-
[7687053901553772359u;4u;"abcde"]
155+
[[1858343823u];[0u];["abcde"]];
156+
[[1921763476782200957u];[1u];["abcde"]];
157+
[[3843526951706058091u];[2u];["abcde"]];
158+
[[5765290426629915225u];[3u];["abcde"]];
159+
[[7687053901553772359u];[4u];["abcde"]]
160160
]
161161
)", TString{res});
162162
}
@@ -263,11 +263,11 @@ Y_UNIT_TEST_SUITE(KqpKv) {
263263
UNIT_ASSERT_C(selectResult.IsSuccess(), selectResult.GetIssues().ToString());
264264
auto res = FormatResultSetYson(selectResult.GetResultSet());
265265
CompareYson(R"([
266-
[10u;0u;"abcde"];
267-
[11u;1u;"abcde"];
268-
[12u;2u;"abcde"];
269-
[13u;3u;"abcde"];
270-
[14u;4u;"abcde"]
266+
[[10u];[0u];["abcde"]];
267+
[[11u];[1u];["abcde"]];
268+
[[12u];[2u];["abcde"]];
269+
[[13u];[3u];["abcde"]];
270+
[[14u];[4u];["abcde"]]
271271
])", TString{res});
272272
}
273273
{
@@ -364,7 +364,7 @@ Y_UNIT_TEST_SUITE(KqpKv) {
364364
UNIT_ASSERT_C(selectResult.IsSuccess(), selectResult.GetIssues().ToString());
365365

366366
auto res = FormatResultSetYson(selectResult.GetResultSet());
367-
CompareYson(Sprintf("[[%du;%du]]", valueToReturn_1, valueToReturn_2), TString{res});
367+
CompareYson(Sprintf("[[[%du];[%du]]]", valueToReturn_1, valueToReturn_2), TString{res});
368368
}
369369

370370
Y_UNIT_TEST_TWIN(ReadRows_ExternalBlobs, UseExtBlobsPrecharge) {
@@ -813,9 +813,9 @@ Y_UNIT_TEST_SUITE(KqpKv) {
813813
auto res = FormatResultSetYson(selectResult.GetResultSet());
814814
CompareYson(R"(
815815
[
816-
["0.123456789";"0.123456789";"0.123456789";"0.123456789";0u];
817-
["1.123456789";"1000.123456789";"10.123456789";"1000000.123456789";1u];
818-
["2.123456789";"2000.123456789";"20.123456789";"2000000.123456789";2u]
816+
[["0.123456789"];["0.123456789"];["0.123456789"];["0.123456789"];[0u]];
817+
[["1.123456789"];["1000.123456789"];["10.123456789"];["1000000.123456789"];[1u]];
818+
[["2.123456789"];["2000.123456789"];["20.123456789"];["2000000.123456789"];[2u]]
819819
]
820820
)", TString{res});
821821
}
@@ -833,10 +833,64 @@ Y_UNIT_TEST_SUITE(KqpKv) {
833833
auto selectResult = db.ReadRows("/Root/TestTable", keys.Build()).GetValueSync();
834834
UNIT_ASSERT_C(selectResult.IsSuccess(), selectResult.GetIssues().ToString());
835835
auto res = FormatResultSetYson(selectResult.GetResultSet());
836-
CompareYson(R"([["inf";"inf";"inf";"inf";999999999u];])", TString{res});
836+
CompareYson(R"([[["inf"];["inf"];["inf"];["inf"];[999999999u]];])", TString{res});
837837
}
838838
}
839839

840+
Y_UNIT_TEST(ReadRows_Nulls) {
841+
auto settings = TKikimrSettings()
842+
.SetWithSampleTables(false);
843+
auto kikimr = TKikimrRunner{settings};
844+
auto db = kikimr.GetTableClient();
845+
auto session = db.CreateSession().GetValueSync().GetSession();
846+
847+
auto schemeResult = session.ExecuteSchemeQuery(R"(
848+
CREATE TABLE TestTable (
849+
Key Uint64,
850+
Data Uint32,
851+
Value Utf8,
852+
PRIMARY KEY (Key)
853+
);
854+
)").GetValueSync();
855+
UNIT_ASSERT_C(schemeResult.IsSuccess(), schemeResult.GetIssues().ToString());
856+
857+
NYdb::TValueBuilder rows;
858+
rows.BeginList();
859+
for (size_t i = 0; i < 5; ++i) {
860+
rows.AddListItem()
861+
.BeginStruct()
862+
.AddMember("Key").Uint64(i * 1921763474923857134ull + 1858343823)
863+
.EndStruct();
864+
}
865+
rows.EndList();
866+
867+
auto upsertResult = db.BulkUpsert("/Root/TestTable", rows.Build()).GetValueSync();
868+
UNIT_ASSERT_C(upsertResult.IsSuccess(), upsertResult.GetIssues().ToString());
869+
870+
NYdb::TValueBuilder keys;
871+
keys.BeginList();
872+
for (size_t i = 0; i < 5; ++i) {
873+
keys.AddListItem()
874+
.BeginStruct()
875+
.AddMember("Key").Uint64(i * 1921763474923857134ull + 1858343823)
876+
.EndStruct();
877+
}
878+
keys.EndList();
879+
auto selectResult = db.ReadRows("/Root/TestTable", keys.Build()).GetValueSync();
880+
Cerr << "IsSuccess(): " << selectResult.IsSuccess() << " GetStatus(): " << selectResult.GetStatus() << Endl;
881+
UNIT_ASSERT_C(selectResult.IsSuccess(), selectResult.GetIssues().ToString());
882+
auto res = FormatResultSetYson(selectResult.GetResultSet());
883+
CompareYson(R"(
884+
[
885+
[[1858343823u];#;#];
886+
[[1921763476782200957u];#;#];
887+
[[3843526951706058091u];#;#];
888+
[[5765290426629915225u];#;#];
889+
[[7687053901553772359u];#;#]
890+
]
891+
)", TString{res});
892+
}
893+
840894

841895
}
842896

ydb/core/statistics/service/service_impl.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,10 @@ class TStatService : public TActorBootstrapped<TStatService> {
695695

696696
while(parser.TryNextRow()) {
697697
auto& col = parser.ColumnParser("data");
698-
query_response->Data = col.GetString();
698+
// may be not optional from versions before fix of bug https://github.com/ydb-platform/ydb/issues/15701
699+
query_response->Data = col.GetKind() == NYdb::TTypeParser::ETypeKind::Optional
700+
? col.GetOptionalString()
701+
: col.GetString();
699702
}
700703
} else {
701704
SA_LOG_E("[TStatService::ReadRowsResponse] QueryId[ "

0 commit comments

Comments
 (0)