Skip to content

Commit 4ddc2cb

Browse files
authored
Support of Interval type in ToPg (#3368)
1 parent fadc4d7 commit 4ddc2cb

File tree

14 files changed

+207
-0
lines changed

14 files changed

+207
-0
lines changed

ydb/library/yql/core/type_ann/type_ann_pg.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,9 @@ const TTypeAnnotationNode* ToPgImpl(TPositionHandle pos, const TTypeAnnotationNo
463463
case NUdf::EDataSlot::Timestamp:
464464
pgType = "timestamp";
465465
break;
466+
case NUdf::EDataSlot::Interval:
467+
pgType = "interval";
468+
break;
466469
default:
467470
ctx.AddError(TIssue(ctx.GetPosition(pos),
468471
TStringBuilder() << "Unsupported type: " << dataType->GetName()));

ydb/library/yql/parser/pg_wrapper/comp_factory.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ extern "C" {
3939
#include "catalog/pg_namespace_d.h"
4040
#include "catalog/pg_tablespace_d.h"
4141
#include "catalog/pg_type_d.h"
42+
#include "datatype/timestamp.h"
4243
#include "utils/builtins.h"
4344
#include "utils/memutils.h"
4445
#include "utils/array.h"
@@ -1914,6 +1915,14 @@ inline i64 Timestamp2Pg(ui64 value) {
19141915
return i64(value) - PgTimestampShift;
19151916
}
19161917

1918+
inline Interval* Interval2Pg(i64 value) {
1919+
auto ret = (Interval*)palloc(sizeof(Interval));
1920+
ret->time = value % 86400000000ll;
1921+
ret->day = value / 86400000000ll;
1922+
ret->month = 0;
1923+
return ret;
1924+
}
1925+
19171926
template <NUdf::EDataSlot Slot>
19181927
NUdf::TUnboxedValuePod ConvertToPgValue(NUdf::TUnboxedValuePod value, TMaybe<NUdf::EDataSlot> actualSlot = {}) {
19191928
#ifndef NDEBUG
@@ -1955,6 +1964,10 @@ NUdf::TUnboxedValuePod ConvertToPgValue(NUdf::TUnboxedValuePod value, TMaybe<NUd
19551964
auto res = Timestamp2Pg(value.Get<ui64>());
19561965
return ScalarDatumToPod(res);
19571966
}
1967+
case NUdf::EDataSlot::Interval: {
1968+
auto res = Interval2Pg(value.Get<i64>());
1969+
return PointerDatumToPod(PointerGetDatum(res));
1970+
}
19581971

19591972
default:
19601973
ythrow yexception() << "Unexpected data slot in ConvertToPgValue: " << Slot;
@@ -2673,6 +2686,27 @@ struct TToPgExec {
26732686
}
26742687
break;
26752688
}
2689+
case NUdf::EDataSlot::Interval: {
2690+
NUdf::TFixedSizeBlockReader<i64, true> reader;
2691+
NUdf::TStringArrayBuilder<arrow::BinaryType, true> builder(NKikimr::NMiniKQL::TTypeInfoHelper(), arrow::binary(), *ctx->memory_pool(), length);
2692+
for (size_t i = 0; i < length; ++i) {
2693+
auto item = reader.GetItem(array, i);
2694+
if (!item) {
2695+
builder.Add(NUdf::TBlockItem());
2696+
continue;
2697+
}
2698+
2699+
Interval pgInterval;
2700+
pgInterval.time = item.Get<i64>() % 86400000000ll;
2701+
pgInterval.day = item.Get<i64>() / 86400000000ll;
2702+
pgInterval.month = 0;
2703+
auto ref = NUdf::TStringRef((const char*)&pgInterval, sizeof(Interval));
2704+
builder.AddPgItem<false, 0>(ref);
2705+
}
2706+
2707+
*res = builder.Build(true);
2708+
break;
2709+
}
26762710
default:
26772711
ythrow yexception() << "Unsupported type: " << NUdf::GetDataTypeInfo(SourceDataSlot).Name;
26782712
}
@@ -2706,6 +2740,7 @@ std::shared_ptr<arrow::compute::ScalarKernel> MakeToPgKernel(TType* inputType, T
27062740
break;
27072741
case NUdf::EDataSlot::String:
27082742
case NUdf::EDataSlot::Utf8:
2743+
case NUdf::EDataSlot::Interval:
27092744
kernel->null_handling = arrow::compute::NullHandling::COMPUTED_NO_PREALLOCATE;
27102745
break;
27112746
default:
@@ -2958,6 +2993,8 @@ TComputationNodeFactory GetPgFactory() {
29582993
return new TToPg<NUdf::EDataSlot::Datetime>(ctx.Mutables, arg);
29592994
case NUdf::EDataSlot::Timestamp:
29602995
return new TToPg<NUdf::EDataSlot::Timestamp>(ctx.Mutables, arg);
2996+
case NUdf::EDataSlot::Interval:
2997+
return new TToPg<NUdf::EDataSlot::Interval>(ctx.Mutables, arg);
29612998
default:
29622999
ythrow yexception() << "Unsupported type: " << NUdf::GetDataTypeInfo(*sourceDataSlot).Name;
29633000
}

ydb/library/yql/tests/sql/dq_file/part3/canondata/result.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1603,6 +1603,28 @@
16031603
}
16041604
],
16051605
"test.test[pg-coalesce-default.txt-Results]": [],
1606+
"test.test[pg-interval_to_pg-default.txt-Analyze]": [
1607+
{
1608+
"checksum": "b4dd508a329723c74293d80f0278c705",
1609+
"size": 505,
1610+
"uri": "https://{canondata_backend}/1784117/0327cec5b34f60c96db651d3505ec161fd64bb5a/resource.tar.gz#test.test_pg-interval_to_pg-default.txt-Analyze_/plan.txt"
1611+
}
1612+
],
1613+
"test.test[pg-interval_to_pg-default.txt-Debug]": [
1614+
{
1615+
"checksum": "6c60903593658c97940813cd422698e4",
1616+
"size": 514,
1617+
"uri": "https://{canondata_backend}/1784117/0327cec5b34f60c96db651d3505ec161fd64bb5a/resource.tar.gz#test.test_pg-interval_to_pg-default.txt-Debug_/opt.yql_patched"
1618+
}
1619+
],
1620+
"test.test[pg-interval_to_pg-default.txt-Plan]": [
1621+
{
1622+
"checksum": "b4dd508a329723c74293d80f0278c705",
1623+
"size": 505,
1624+
"uri": "https://{canondata_backend}/1784117/0327cec5b34f60c96db651d3505ec161fd64bb5a/resource.tar.gz#test.test_pg-interval_to_pg-default.txt-Plan_/plan.txt"
1625+
}
1626+
],
1627+
"test.test[pg-interval_to_pg-default.txt-Results]": [],
16061628
"test.test[pg-palloc_big_string-default.txt-Analyze]": [
16071629
{
16081630
"checksum": "b4dd508a329723c74293d80f0278c705",

ydb/library/yql/tests/sql/dq_file/part6/canondata/result.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,28 @@
602602
}
603603
],
604604
"test.test[blocks-pg_call--Results]": [],
605+
"test.test[blocks-pg_to_interval--Analyze]": [
606+
{
607+
"checksum": "f280488c07cb2e4f2c36bfdefe041bea",
608+
"size": 3674,
609+
"uri": "https://{canondata_backend}/1936273/8158ee5ad7772de7c1ff0f5077d5120e3ff1552f/resource.tar.gz#test.test_blocks-pg_to_interval--Analyze_/plan.txt"
610+
}
611+
],
612+
"test.test[blocks-pg_to_interval--Debug]": [
613+
{
614+
"checksum": "aa2d323a110d66ba3e8fbda9928efd66",
615+
"size": 1328,
616+
"uri": "https://{canondata_backend}/1936273/8158ee5ad7772de7c1ff0f5077d5120e3ff1552f/resource.tar.gz#test.test_blocks-pg_to_interval--Debug_/opt.yql_patched"
617+
}
618+
],
619+
"test.test[blocks-pg_to_interval--Plan]": [
620+
{
621+
"checksum": "f280488c07cb2e4f2c36bfdefe041bea",
622+
"size": 3674,
623+
"uri": "https://{canondata_backend}/1936273/8158ee5ad7772de7c1ff0f5077d5120e3ff1552f/resource.tar.gz#test.test_blocks-pg_to_interval--Plan_/plan.txt"
624+
}
625+
],
626+
"test.test[blocks-pg_to_interval--Results]": [],
605627
"test.test[blocks-sort_two_asc--Analyze]": [
606628
{
607629
"checksum": "42cf8832ac7c4f1b59e9aff65e4fd0e2",

ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1875,6 +1875,20 @@
18751875
"uri": "https://{canondata_backend}/1889210/431569691fa60b20bf9ef4cc94610d8f1b1518e2/resource.tar.gz#test.test_pg-in_sorted-default.txt-Plan_/plan.txt"
18761876
}
18771877
],
1878+
"test.test[pg-interval_to_pg-default.txt-Debug]": [
1879+
{
1880+
"checksum": "07ebded86849dbd0472c0ad6473adbd0",
1881+
"size": 513,
1882+
"uri": "https://{canondata_backend}/1936273/3aa418c24e77eb510bbef390a883a810189ad7de/resource.tar.gz#test.test_pg-interval_to_pg-default.txt-Debug_/opt.yql_patched"
1883+
}
1884+
],
1885+
"test.test[pg-interval_to_pg-default.txt-Plan]": [
1886+
{
1887+
"checksum": "b4dd508a329723c74293d80f0278c705",
1888+
"size": 505,
1889+
"uri": "https://{canondata_backend}/1936273/3aa418c24e77eb510bbef390a883a810189ad7de/resource.tar.gz#test.test_pg-interval_to_pg-default.txt-Plan_/plan.txt"
1890+
}
1891+
],
18781892
"test.test[pg-join_using_case_insensetive1-default.txt-Debug]": [
18791893
{
18801894
"checksum": "f05158fb04e92f447279d343b7ec8261",

ydb/library/yql/tests/sql/hybrid_file/part8/canondata/result.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,20 @@
629629
"uri": "https://{canondata_backend}/1900335/dd59ce09b5b70054bb239659c9dedc5218a4d0cd/resource.tar.gz#test.test_blocks-pg_call--Plan_/plan.txt"
630630
}
631631
],
632+
"test.test[blocks-pg_to_interval--Debug]": [
633+
{
634+
"checksum": "3912087815d21983fd4de7001d621f42",
635+
"size": 1858,
636+
"uri": "https://{canondata_backend}/1775319/77c88c0fa3f3f609b448c73f04bafe73166ecd45/resource.tar.gz#test.test_blocks-pg_to_interval--Debug_/opt.yql_patched"
637+
}
638+
],
639+
"test.test[blocks-pg_to_interval--Plan]": [
640+
{
641+
"checksum": "aae9a532661bf8b83a7ebca08350bc28",
642+
"size": 4043,
643+
"uri": "https://{canondata_backend}/1775319/77c88c0fa3f3f609b448c73f04bafe73166ecd45/resource.tar.gz#test.test_blocks-pg_to_interval--Plan_/plan.txt"
644+
}
645+
],
632646
"test.test[blocks-sort_one_asc--Debug]": [
633647
{
634648
"checksum": "bcc1f67eedc12a11c9f39ccb5e6d1953",

ydb/library/yql/tests/sql/sql2yql/canondata/result.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3625,6 +3625,13 @@
36253625
"uri": "https://{canondata_backend}/1775059/da44f71e237a007832278fd3d7afc8b69720284d/resource.tar.gz#test_sql2yql.test_blocks-pg_to_dates_/sql.yql"
36263626
}
36273627
],
3628+
"test_sql2yql.test[blocks-pg_to_interval]": [
3629+
{
3630+
"checksum": "3aceb0365d1a5b1040b5e9900df64259",
3631+
"size": 1184,
3632+
"uri": "https://{canondata_backend}/1775319/adaa8bc37efcfd25d7dfdb8e0d9d14a4551711a4/resource.tar.gz#test_sql2yql.test_blocks-pg_to_interval_/sql.yql"
3633+
}
3634+
],
36283635
"test_sql2yql.test[blocks-pg_tofrom]": [
36293636
{
36303637
"checksum": "b826f6b175ed015c94598bd63781d9d7",
@@ -11164,6 +11171,13 @@
1116411171
"uri": "https://{canondata_backend}/1777230/1dbd9686602f9d78fffc85db08fced3180ab8411/resource.tar.gz#test_sql2yql.test_pg-insert_/sql.yql"
1116511172
}
1116611173
],
11174+
"test_sql2yql.test[pg-interval_to_pg]": [
11175+
{
11176+
"checksum": "818363ceef5bc60dfeccb3c16dbee80f",
11177+
"size": 1437,
11178+
"uri": "https://{canondata_backend}/1775319/adaa8bc37efcfd25d7dfdb8e0d9d14a4551711a4/resource.tar.gz#test_sql2yql.test_pg-interval_to_pg_/sql.yql"
11179+
}
11180+
],
1116711181
"test_sql2yql.test[pg-is_predicate]": [
1116811182
{
1116911183
"checksum": "59c977551580127020ede843f4176d6c",
@@ -21734,6 +21748,13 @@
2173421748
"uri": "https://{canondata_backend}/1775059/da44f71e237a007832278fd3d7afc8b69720284d/resource.tar.gz#test_sql_format.test_blocks-pg_to_dates_/formatted.sql"
2173521749
}
2173621750
],
21751+
"test_sql_format.test[blocks-pg_to_interval]": [
21752+
{
21753+
"checksum": "30a575eacb617fac885c8c284519938e",
21754+
"size": 61,
21755+
"uri": "https://{canondata_backend}/1775319/adaa8bc37efcfd25d7dfdb8e0d9d14a4551711a4/resource.tar.gz#test_sql_format.test_blocks-pg_to_interval_/formatted.sql"
21756+
}
21757+
],
2173721758
"test_sql_format.test[blocks-pg_tofrom]": [
2173821759
{
2173921760
"checksum": "25c9751ead91546896ba8aec437b67e0",
@@ -29098,6 +29119,13 @@
2909829119
"uri": "https://{canondata_backend}/1880306/64654158d6bfb1289c66c626a8162239289559d0/resource.tar.gz#test_sql_format.test_pg-in_sorted_/formatted.sql"
2909929120
}
2910029121
],
29122+
"test_sql_format.test[pg-interval_to_pg]": [
29123+
{
29124+
"checksum": "425ade30b8636c419362e606a93d5c43",
29125+
"size": 133,
29126+
"uri": "https://{canondata_backend}/1775319/adaa8bc37efcfd25d7dfdb8e0d9d14a4551711a4/resource.tar.gz#test_sql_format.test_pg-interval_to_pg_/formatted.sql"
29127+
}
29128+
],
2910129129
"test_sql_format.test[pg-pg_in_dict_key_with_stable_pickle]": [
2910229130
{
2910329131
"checksum": "f758865b5d78a28d3f519575ea234704",
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{"a"=0};
2+
{"a"=4291747199999999};
3+
{"a"=-4291747199999999};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{"_yql_row_spec"={
2+
"Type"=["StructType";[
3+
["a";["DataType";"Interval"]];
4+
]];
5+
}}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
in Input input_to_pg_interval.txt

0 commit comments

Comments
 (0)