Skip to content

Commit e68dbd9

Browse files
authored
Merge 196377e into 72b229f
2 parents 72b229f + 196377e commit e68dbd9

File tree

3 files changed

+93
-19
lines changed

3 files changed

+93
-19
lines changed

ydb/core/grpc_services/rpc_object_storage.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,11 @@ class TObjectStorageListingRequestGrpc : public TActorBootstrapped<TObjectStorag
728728
const auto type = getTypeFromColMeta(colMeta);
729729
auto* col = resultSet.Addcolumns();
730730

731-
*col->mutable_type()->mutable_optional_type()->mutable_item() = NYdb::TProtoAccessor::GetProto(type);
731+
if (colMeta.IsNotNullColumn || colMeta.PType.GetTypeId() == NScheme::NTypeIds::Pg) {
732+
*col->mutable_type() = NYdb::TProtoAccessor::GetProto(type);
733+
} else {
734+
*col->mutable_type()->mutable_optional_type()->mutable_item() = NYdb::TProtoAccessor::GetProto(type);
735+
}
732736
*col->mutable_name() = colMeta.Name;
733737
}
734738

@@ -760,7 +764,9 @@ class TObjectStorageListingRequestGrpc : public TActorBootstrapped<TObjectStorag
760764
} else {
761765
const NScheme::TTypeInfo& typeInfo = colMeta.PType;
762766

763-
if (cell.IsNull()) {
767+
if (colMeta.IsNotNullColumn) {
768+
ProtoValueFromCell(vb, typeInfo, cell);
769+
} else if (cell.IsNull()) {
764770
vb.EmptyOptional((NYdb::EPrimitiveType)typeInfo.GetTypeId());
765771
} else {
766772
vb.BeginOptional();

ydb/core/grpc_services/rpc_read_rows.cpp

Lines changed: 16 additions & 2 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) {
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

@@ -648,7 +652,15 @@ class TReadRowsRPC : public TActorBootstrapped<TReadRowsRPC> {
648652
break;
649653
}
650654
default: {
651-
ProtoValueFromCell(vb, colMeta.Type, cell);
655+
if (colMeta.IsNotNullColumn) {
656+
ProtoValueFromCell(vb, colMeta.Type, cell);
657+
} else if (cell.IsNull()) {
658+
vb.EmptyOptional((NYdb::EPrimitiveType)colMeta.Type.GetTypeId());
659+
} else {
660+
vb.BeginOptional();
661+
ProtoValueFromCell(vb, colMeta.Type, cell);
662+
vb.EndOptional();
663+
}
652664
break;
653665
}
654666
}
@@ -744,13 +756,15 @@ class TReadRowsRPC : public TActorBootstrapped<TReadRowsRPC> {
744756
, Name(colInfo.Name)
745757
, Type(colInfo.PType)
746758
, PTypeMod(colInfo.PTypeMod)
759+
, IsNotNullColumn(colInfo.IsNotNullColumn)
747760
{
748761
}
749762

750763
ui32 Id;
751764
TString Name;
752765
NScheme::TTypeInfo Type;
753766
TString PTypeMod;
767+
bool IsNotNullColumn;
754768
};
755769
TVector<TColumnMeta> RequestedColumnsMeta;
756770

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, NewPrecharge) {
@@ -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

0 commit comments

Comments
 (0)