Skip to content

Commit 09a6870

Browse files
authored
Support for big datetime in table_flat (#5829)
1 parent a818871 commit 09a6870

File tree

3 files changed

+184
-7
lines changed

3 files changed

+184
-7
lines changed

ydb/core/tablet_flat/datetime_ut.cpp

Lines changed: 165 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,13 @@ Y_UNIT_TEST_SUITE(TFlatTableDatetime) {
2121
struct Datetime : Column<3, NScheme::NTypeIds::Datetime> {};
2222
struct Timestamp : Column<4, NScheme::NTypeIds::Timestamp> {};
2323
struct Interval : Column<5, NScheme::NTypeIds::Interval> {};
24+
struct Date32 : Column<6, NScheme::NTypeIds::Date32> {};
25+
struct Datetime64 : Column<7, NScheme::NTypeIds::Datetime64> {};
26+
struct Timestamp64 : Column<8, NScheme::NTypeIds::Timestamp64> {};
27+
struct Interval64 : Column<9, NScheme::NTypeIds::Interval64> {};
2428

2529
using TKey = TableKey<Key>;
26-
using TColumns = TableColumns<Key, Date, Datetime, Timestamp, Interval>;
30+
using TColumns = TableColumns<Key, Date, Datetime, Timestamp, Interval, Date32, Datetime64, Timestamp64, Interval64>;
2731
};
2832

2933
struct DateKey : Table<2> {
@@ -58,8 +62,39 @@ Y_UNIT_TEST_SUITE(TFlatTableDatetime) {
5862
using TColumns = TableColumns<Key, Value>;
5963
};
6064

65+
struct Date32Key : Table<6> {
66+
struct Key : Column<1, NScheme::NTypeIds::Date32> {};
67+
struct Value : Column<2, NScheme::NTypeIds::Uint32> {};
68+
69+
using TKey = TableKey<Key>;
70+
using TColumns = TableColumns<Key, Value>;
71+
};
72+
73+
struct Datetime64Key : Table<7> {
74+
struct Key : Column<1, NScheme::NTypeIds::Datetime64> {};
75+
struct Value : Column<2, NScheme::NTypeIds::Uint32> {};
76+
77+
using TKey = TableKey<Key>;
78+
using TColumns = TableColumns<Key, Value>;
79+
};
80+
81+
struct Timestamp64Key : Table<8> {
82+
struct Key : Column<1, NScheme::NTypeIds::Timestamp64> {};
83+
struct Value : Column<2, NScheme::NTypeIds::Uint32> {};
84+
85+
using TKey = TableKey<Key>;
86+
using TColumns = TableColumns<Key, Value>;
87+
};
88+
89+
struct Interval64Key : Table<9> {
90+
struct Key : Column<1, NScheme::NTypeIds::Interval64> {};
91+
struct Value : Column<2, NScheme::NTypeIds::Uint32> {};
92+
93+
using TKey = TableKey<Key>;
94+
using TColumns = TableColumns<Key, Value>;
95+
};
6196

62-
using TTables = SchemaTables<DateValue, DateKey, DatetimeKey, TimestampKey, IntervalKey>;
97+
using TTables = SchemaTables<DateValue, DateKey, DatetimeKey, TimestampKey, IntervalKey, Date32Key, Datetime64Key, Timestamp64Key, Interval64Key>;
6398
using TSettings = SchemaSettings<ExecutorLogBatching<true>,
6499
ExecutorLogFlushPeriod<TDuration::MicroSeconds(512).GetValue()>>;
65100
};
@@ -105,17 +140,30 @@ Y_UNIT_TEST_SUITE(TFlatTableDatetime) {
105140
.Update<Schema::DateValue::Date>(Min<ui16>())
106141
.Update<Schema::DateValue::Datetime>(Min<ui32>())
107142
.Update<Schema::DateValue::Timestamp>(Min<ui64>())
108-
.Update<Schema::DateValue::Interval>(Min<i64>());
143+
.Update<Schema::DateValue::Interval>(Min<i64>())
144+
.Update<Schema::DateValue::Date32>(Min<i32>())
145+
.Update<Schema::DateValue::Datetime64>(Min<i64>())
146+
.Update<Schema::DateValue::Timestamp64>(Min<i64>())
147+
.Update<Schema::DateValue::Interval64>(Min<i64>());
109148
db.Table<Schema::DateValue>().Key(2)
110149
.Update<Schema::DateValue::Date>((ui16)100)
111150
.Update<Schema::DateValue::Datetime>((ui32)100)
112151
.Update<Schema::DateValue::Timestamp>((ui64)100)
113-
.Update<Schema::DateValue::Interval>((i64)100);
152+
.Update<Schema::DateValue::Interval>((i64)100)
153+
.Update<Schema::DateValue::Date32>((i32)-100)
154+
.Update<Schema::DateValue::Datetime64>((i64)-100)
155+
.Update<Schema::DateValue::Timestamp64>((i64)-100)
156+
.Update<Schema::DateValue::Interval64>((i64)-100);
157+
114158
db.Table<Schema::DateValue>().Key(3)
115159
.Update<Schema::DateValue::Date>(Max<ui16>())
116160
.Update<Schema::DateValue::Datetime>(Max<ui32>())
117161
.Update<Schema::DateValue::Timestamp>(Max<ui64>())
118-
.Update<Schema::DateValue::Interval>(Max<i64>());
162+
.Update<Schema::DateValue::Interval>(Max<i64>())
163+
.Update<Schema::DateValue::Date32>(Max<i32>())
164+
.Update<Schema::DateValue::Datetime64>(Max<i64>())
165+
.Update<Schema::DateValue::Timestamp64>(Max<i64>())
166+
.Update<Schema::DateValue::Interval64>(Max<i64>());
119167

120168
// DateKey
121169
for (ui16 i = 1; i <= 10; ++i) {
@@ -127,6 +175,14 @@ Y_UNIT_TEST_SUITE(TFlatTableDatetime) {
127175
.Update<Schema::DateKey::Value>(i);
128176
db.Table<Schema::IntervalKey>().Key((i64)i - 5)
129177
.Update<Schema::DateKey::Value>(i);
178+
db.Table<Schema::Date32Key>().Key(i)
179+
.Update<Schema::Date32Key::Value>(i);
180+
db.Table<Schema::Datetime64Key>().Key((ui32)i)
181+
.Update<Schema::DateKey::Value>(i);
182+
db.Table<Schema::Timestamp64Key>().Key((ui64)i)
183+
.Update<Schema::DateKey::Value>(i);
184+
db.Table<Schema::Interval64Key>().Key((i64)i - 5)
185+
.Update<Schema::DateKey::Value>(i);
130186
}
131187

132188
return true;
@@ -158,14 +214,26 @@ Y_UNIT_TEST_SUITE(TFlatTableDatetime) {
158214
UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Datetime>(), Min<ui32>());
159215
UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Timestamp>(), Min<ui64>());
160216
UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Interval>(), Min<i64>());
217+
UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Date32>(), Min<i32>());
218+
UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Datetime64>(), Min<i64>());
219+
UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Timestamp64>(), Min<i64>());
220+
UNIT_ASSERT_VALUES_EQUAL(row1.GetValue<Schema::DateValue::Interval64>(), Min<i64>());
161221
UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Date>(), (ui16)100);
162222
UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Datetime>(), (ui32)100);
163223
UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Timestamp>(), (ui64)100);
164224
UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Interval>(), (i64)100);
225+
UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Date32>(), (i32)-100);
226+
UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Datetime64>(), (i64)-100);
227+
UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Timestamp64>(), (i64)-100);
228+
UNIT_ASSERT_VALUES_EQUAL(row2.GetValue<Schema::DateValue::Interval64>(), (i64)-100);
165229
UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Date>(), Max<ui16>());
166230
UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Datetime>(), Max<ui32>());
167231
UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Timestamp>(), Max<ui64>());
168232
UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Interval>(), Max<i64>());
233+
UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Date32>(), Max<i32>());
234+
UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Datetime64>(), Max<i64>());
235+
UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Timestamp64>(), Max<i64>());
236+
UNIT_ASSERT_VALUES_EQUAL(row3.GetValue<Schema::DateValue::Interval64>(), Max<i64>());
169237
}
170238

171239
// DateKey
@@ -200,6 +268,38 @@ Y_UNIT_TEST_SUITE(TFlatTableDatetime) {
200268
UNIT_ASSERT_VALUES_EQUAL(row.GetValue<Schema::IntervalKey::Value>(), i);
201269
}
202270

271+
// Date32Key
272+
for (ui16 i = 1; i <= 10; ++i) {
273+
auto row = db.Table<Schema::Date32Key>().Key(i).Select();
274+
if (!IsReady(row))
275+
return false;
276+
UNIT_ASSERT_VALUES_EQUAL(row.GetValue<Schema::Date32Key::Value>(), (ui16)i);
277+
}
278+
279+
// Datetime64Key
280+
for (ui32 i = 1; i <= 10; ++i) {
281+
auto row = db.Table<Schema::Datetime64Key>().Key(i).Select();
282+
if (!IsReady(row))
283+
return false;
284+
UNIT_ASSERT_VALUES_EQUAL(row.GetValue<Schema::Datetime64Key::Value>(), i);
285+
}
286+
287+
// Timestamp64Key
288+
for (ui64 i = 1; i <= 10; ++i) {
289+
auto row = db.Table<Schema::Timestamp64Key>().Key(i).Select();
290+
if (!IsReady(row))
291+
return false;
292+
UNIT_ASSERT_VALUES_EQUAL(row.GetValue<Schema::Timestamp64Key::Value>(), i);
293+
}
294+
295+
// Interval64Key
296+
for (i16 i = 1; i <= 10; ++i) {
297+
auto row = db.Table<Schema::Interval64Key>().Key(i - 5).Select();
298+
if (!IsReady(row))
299+
return false;
300+
UNIT_ASSERT_VALUES_EQUAL(row.GetValue<Schema::Interval64Key::Value>(), i);
301+
}
302+
203303
return true;
204304
}
205305

@@ -276,6 +376,66 @@ Y_UNIT_TEST_SUITE(TFlatTableDatetime) {
276376
UNIT_ASSERT(rowset.EndOfSet());
277377
}
278378

379+
// Date32Key
380+
{
381+
auto rowset = db.Table<Schema::Date32Key>().GreaterOrEqual(5).Select();
382+
if (!rowset.IsReady())
383+
return false;
384+
for (ui16 i = 5; i <= 10; ++i) {
385+
UNIT_ASSERT(!rowset.EndOfSet());
386+
UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), i);
387+
UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::Date32Key::Value>(), i);
388+
if (!rowset.Next())
389+
return false;
390+
}
391+
UNIT_ASSERT(rowset.EndOfSet());
392+
}
393+
394+
// Datetime64Key
395+
{
396+
auto rowset = db.Table<Schema::Datetime64Key>().GreaterOrEqual(5).Select();
397+
if (!rowset.IsReady())
398+
return false;
399+
for (ui32 i = 5; i <= 10; ++i) {
400+
UNIT_ASSERT(!rowset.EndOfSet());
401+
UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), i);
402+
UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::Datetime64Key::Value>(), i);
403+
if (!rowset.Next())
404+
return false;
405+
}
406+
UNIT_ASSERT(rowset.EndOfSet());
407+
}
408+
409+
// Timestamp64Key
410+
{
411+
auto rowset = db.Table<Schema::Timestamp64Key>().GreaterOrEqual(5).Select();
412+
if (!rowset.IsReady())
413+
return false;
414+
for (ui64 i = 5; i <= 10; ++i) {
415+
UNIT_ASSERT(!rowset.EndOfSet());
416+
UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), i);
417+
UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::Timestamp64Key::Value>(), i);
418+
if (!rowset.Next())
419+
return false;
420+
}
421+
UNIT_ASSERT(rowset.EndOfSet());
422+
}
423+
424+
// Interval64Key
425+
{
426+
auto rowset = db.Table<Schema::Interval64Key>().GreaterOrEqual(-2).Select();
427+
if (!rowset.IsReady())
428+
return false;
429+
for (i64 i = 3; i <= 10; ++i) {
430+
UNIT_ASSERT(!rowset.EndOfSet());
431+
UNIT_ASSERT_VALUES_EQUAL(rowset.GetKey(), i - 5);
432+
UNIT_ASSERT_VALUES_EQUAL(rowset.GetValue<Schema::Interval64Key::Value>(), i);
433+
if (!rowset.Next())
434+
return false;
435+
}
436+
UNIT_ASSERT(rowset.EndOfSet());
437+
}
438+
279439
return true;
280440
}
281441

ydb/core/tablet_flat/flat_cxx_database.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,10 @@ class TTypeValue : public TRawTypeValue {
110110

111111
operator i64() const {
112112
Y_ABORT_UNLESS((Type() == NScheme::NTypeIds::Int64
113-
|| Type() == NScheme::NTypeIds::Interval)
113+
|| Type() == NScheme::NTypeIds::Interval
114+
|| Type() == NScheme::NTypeIds::Datetime64
115+
|| Type() == NScheme::NTypeIds::Timestamp64
116+
|| Type() == NScheme::NTypeIds::Interval64)
114117
&& Size() == sizeof(i64), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
115118
return ReadUnaligned<i64>(reinterpret_cast<const i64*>(Data()));
116119
}
@@ -124,7 +127,9 @@ class TTypeValue : public TRawTypeValue {
124127
}
125128

126129
operator i32() const {
127-
Y_ABORT_UNLESS(Type() == NScheme::NTypeIds::Int32 && Size() == sizeof(i32), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
130+
Y_ABORT_UNLESS((Type() == NScheme::NTypeIds::Int32
131+
|| Type() == NScheme::NTypeIds::Date32)
132+
&& Size() == sizeof(i32), "Data=%" PRIxPTR ", Type=%" PRIi64 ", Size=%" PRIi64, (ui64)Data(), (i64)Type(), (i64)Size());
128133
i32 value = ReadUnaligned<i32>(reinterpret_cast<const i32*>(Data()));
129134
return value;
130135
}
@@ -230,6 +235,10 @@ template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Date> { typedef ui16 Typ
230235
template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Datetime> { typedef ui32 Type; };
231236
template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Timestamp> { typedef ui64 Type; };
232237
template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Interval> { typedef i64 Type; };
238+
template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Date32> { typedef i32 Type; };
239+
template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Datetime64> { typedef i64 Type; };
240+
template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Timestamp64> { typedef i64 Type; };
241+
template <> struct NSchemeTypeMapper<NScheme::NTypeIds::Interval64> { typedef i64 Type; };
233242

234243
/// only for compatibility with old code
235244
template <NScheme::TTypeId ValType>

ydb/core/tablet_flat/flat_executor_db_mon.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,14 @@ class TExecutor::TTxExecutorDbMon : public TTransactionBase<TExecutor> {
196196
case NScheme::NTypeIds::Interval:
197197
str << *(i64*)data;
198198
break;
199+
case NScheme::NTypeIds::Date32:
200+
str << *(i32*)data;
201+
break;
202+
case NScheme::NTypeIds::Datetime64:
203+
case NScheme::NTypeIds::Timestamp64:
204+
case NScheme::NTypeIds::Interval64:
205+
str << *(i64*)data;
206+
break;
199207
case NScheme::NTypeIds::PairUi64Ui64:
200208
str << "(" << ((std::pair<ui64,ui64>*)data)->first << "," << ((std::pair<ui64,ui64>*)data)->second << ")";
201209
break;

0 commit comments

Comments
 (0)