Skip to content

Commit 0a8fc11

Browse files
azevaykinzinal
authored andcommitted
24-3: Partition at decimal keys (ydb-platform#10696) (ydb-platform#10746)
1 parent 2b647e4 commit 0a8fc11

File tree

3 files changed

+54
-2
lines changed

3 files changed

+54
-2
lines changed

ydb/core/engine/mkql_proto.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,19 @@ bool CellsFromTuple(const NKikimrMiniKQL::TType* tupleType,
223223
}
224224
break;
225225
}
226+
case NScheme::NTypeIds::Decimal:
227+
{
228+
if (v.HasLow128() && v.HasHi128()) {
229+
NYql::NDecimal::TInt128 int128 = NYql::NDecimal::FromProto(v);
230+
auto &data = memoryOwner.emplace_back();
231+
data.resize(sizeof(NYql::NDecimal::TInt128));
232+
std::memcpy(data.Detach(), &int128, sizeof(NYql::NDecimal::TInt128));
233+
c = TCell(data);
234+
} else {
235+
CHECK_OR_RETURN_ERROR(false, Sprintf("Cannot parse value of type Decimal in tuple at position %" PRIu32, i));
236+
}
237+
break;
238+
}
226239
default:
227240
CHECK_OR_RETURN_ERROR(false, Sprintf("Unsupported typeId %" PRIu16 " at index %" PRIu32, typeId, i));
228241
break;
@@ -328,6 +341,13 @@ bool CellToValue(NScheme::TTypeInfo type, const TCell& c, NKikimrMiniKQL::TValue
328341
val.MutableOptional()->SetText(c.Data(), c.Size());
329342
break;
330343

344+
case NScheme::NTypeIds::Decimal: {
345+
const auto loHi = c.AsValue<std::pair<ui64, i64>>();
346+
val.MutableOptional()->SetLow128(loHi.first);
347+
val.MutableOptional()->SetHi128(loHi.second);
348+
break;
349+
}
350+
331351
case NScheme::NTypeIds::Pg: {
332352
auto convert = NPg::PgNativeTextFromNativeBinary(c.AsBuf(), type.GetTypeDesc());
333353
if (convert.Error) {

ydb/core/grpc_services/rpc_object_storage.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,19 @@ bool CellFromTuple(NScheme::TTypeInfo type,
144144
}
145145
break;
146146
}
147+
case NScheme::NTypeIds::Decimal:
148+
{
149+
if (tupleValue.Haslow_128()) {
150+
NYql::NDecimal::TInt128 int128 = NYql::NDecimal::FromHalfs(tupleValue.Getlow_128(), tupleValue.Gethigh_128());
151+
auto &data = memoryOwner.emplace_back();
152+
data.resize(sizeof(NYql::NDecimal::TInt128));
153+
std::memcpy(data.Detach(), &int128, sizeof(NYql::NDecimal::TInt128));
154+
c = TCell(data);
155+
} else {
156+
CHECK_OR_RETURN_ERROR(false, Sprintf("Cannot parse value of type Decimal in tuple at position %" PRIu32, position));
157+
}
158+
break;
159+
}
147160
default:
148161
CHECK_OR_RETURN_ERROR(false, Sprintf("Unsupported typeId %" PRIu16 " at index %" PRIu32, typeId, position));
149162
break;

ydb/core/kqp/ut/scan/kqp_scan_ut.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,15 +237,34 @@ Y_UNIT_TEST_SUITE(KqpScan) {
237237
.BeginTuple().AddElement().BeginOptional().Decimal(TDecimalValue("1.5", 22, 9)).EndOptional().EndTuple()
238238
.Build());
239239

240-
auto ret = session.CreateTable("/Root/DecimalTest",
240+
auto ret = session.CreateTable("/Root/DecimalTest",
241241
TTableBuilder()
242242
.AddNullableColumn("Key", TDecimalType(22, 9))
243243
.AddNullableColumn("Value", TDecimalType(22, 9))
244244
.SetPrimaryKeyColumn("Key")
245-
// .SetPartitionAtKeys(partitions) // Error at split boundary 0: Unsupported typeId 4865 at index 0
245+
.SetPartitionAtKeys(partitions)
246246
.Build()).GetValueSync();
247247
UNIT_ASSERT_C(ret.IsSuccess(), ret.GetIssues().ToString());
248248

249+
{
250+
auto describeResult = session.DescribeTable("/Root/DecimalTest" , TDescribeTableSettings().WithKeyShardBoundary(true)).ExtractValueSync();
251+
UNIT_ASSERT_VALUES_EQUAL(describeResult.GetStatus(), NYdb::EStatus::SUCCESS);
252+
const NYdb::NTable::TTableDescription& tableDescription = describeResult.GetTableDescription();
253+
const TVector<NYdb::NTable::TKeyRange>& keyRanges = tableDescription.GetKeyRanges();
254+
const TVector<NYdb::NTable::TTableColumn>& columns = tableDescription.GetTableColumns();
255+
UNIT_ASSERT_VALUES_EQUAL(columns.size(), 2);
256+
UNIT_ASSERT_STRINGS_EQUAL(columns[0].Type.ToString(), "Decimal(22,9)?");
257+
UNIT_ASSERT_STRINGS_EQUAL(columns[1].Type.ToString(), "Decimal(22,9)?");
258+
auto extractValue = [](const TValue& val) {
259+
auto parser = TValueParser(val);
260+
parser.OpenTuple();
261+
UNIT_ASSERT(parser.TryNextElement());
262+
return parser.GetOptionalDecimal()->ToString();
263+
};
264+
UNIT_ASSERT_VALUES_EQUAL(keyRanges.size(), 2);
265+
UNIT_ASSERT_STRINGS_EQUAL(extractValue(keyRanges[0].To()->GetValue()), "1.5");
266+
}
267+
249268
auto params = TParamsBuilder().AddParam("$in").BeginList()
250269
.AddListItem().BeginStruct()
251270
.AddMember("Key").Decimal(TDecimalValue("1.0"))

0 commit comments

Comments
 (0)