6
6
#include < ydb/library/yql/utils/yql_panic.h>
7
7
#include < ydb/library/yql/minikql/mkql_type_builder.h>
8
8
#include < ydb/library/yql/minikql/mkql_type_ops.h>
9
+ #include < ydb/library/yql/minikql/mkql_node_cast.h>
9
10
10
11
#include < library/cpp/yson/node/node_io.h>
11
12
#include < library/cpp/yson/detail.h>
@@ -254,6 +255,10 @@ class IYsonBlockReaderWithNativeFlag : public IYsonBlockReader {
254
255
return NUdf::TBlockItem ();
255
256
}
256
257
YQL_ENSURE (prev == BeginListSymbol);
258
+ if (buf.Current () == EndListSymbol) {
259
+ buf.Next ();
260
+ return NUdf::TBlockItem ();
261
+ }
257
262
auto result = GetNotNull (buf);
258
263
if (buf.Current () == ListItemSeparatorSymbol) {
259
264
buf.Next ();
@@ -513,7 +518,7 @@ class TPrimitiveColumnConverter {
513
518
case arrow::Type::UINT64: PrimitiveConverterImpl_ = GEN_TYPE (UInt64); break ;
514
519
case arrow::Type::DOUBLE: PrimitiveConverterImpl_ = GEN_TYPE (Double); break ;
515
520
case arrow::Type::FLOAT: PrimitiveConverterImpl_ = GEN_TYPE (Float); break ;
516
- case arrow::Type::STRING: PrimitiveConverterImpl_ = GEN_TYPE_STR (String ); break ;
521
+ case arrow::Type::STRING: PrimitiveConverterImpl_ = GEN_TYPE_STR (Binary ); break ; // all strings from yt is in binary format
517
522
case arrow::Type::BINARY: PrimitiveConverterImpl_ = GEN_TYPE_STR (Binary); break ;
518
523
default :
519
524
return ; // will check in runtime
@@ -615,7 +620,13 @@ class TYtColumnConverter final : public IYtColumnConverter {
615
620
: Settings_(std::move(settings))
616
621
, DictYsonConverter_(Settings_)
617
622
, YsonConverter_(Settings_)
618
- , DictPrimitiveConverter_(Settings_) {}
623
+ , DictPrimitiveConverter_(Settings_)
624
+ {
625
+ auto type = Settings_.Type ;
626
+ IsJson_ = type->IsData () && AS_TYPE (TDataType, type)->GetDataSlot () == NUdf::EDataSlot::Json
627
+ || (Native && type->IsOptional () && AS_TYPE (TOptionalType, type)->GetItemType ()->IsData ()
628
+ && AS_TYPE (TDataType, AS_TYPE (TOptionalType, type)->GetItemType ())->GetDataSlot () == NUdf::EDataSlot::Json);
629
+ }
619
630
620
631
arrow::Datum Convert (std::shared_ptr<arrow::ArrayData> block) override {
621
632
if (arrow::Type::DICTIONARY == block->type ->id ()) {
@@ -628,6 +639,11 @@ class TYtColumnConverter final : public IYtColumnConverter {
628
639
auto result = arrow::compute::Cast (DictPrimitiveConverter_.Convert (block), Settings_.ArrowType );
629
640
YQL_ENSURE (result.ok ());
630
641
return *result;
642
+ } else if (IsJson_ && arrow::Type::STRING == Settings_.ArrowType ->id () && arrow::Type::BINARY == valType->id ())
643
+ {
644
+ auto result = arrow::compute::Cast (DictPrimitiveConverter_.Convert (block), Settings_.ArrowType );
645
+ YQL_ENSURE (result.ok ());
646
+ return *result;
631
647
} else {
632
648
return DictYsonConverter_.Convert (block);
633
649
}
@@ -640,6 +656,11 @@ class TYtColumnConverter final : public IYtColumnConverter {
640
656
auto result = arrow::compute::Cast (arrow::Datum (*block), Settings_.ArrowType );
641
657
YQL_ENSURE (result.ok ());
642
658
return *result;
659
+ } else if (IsJson_ && arrow::Type::STRING == Settings_.ArrowType ->id () && arrow::Type::BINARY == blockType->id ())
660
+ {
661
+ auto result = arrow::compute::Cast (arrow::Datum (*block), Settings_.ArrowType );
662
+ YQL_ENSURE (result.ok ());
663
+ return *result;
643
664
} else {
644
665
YQL_ENSURE (arrow::Type::BINARY == blockType->id ());
645
666
return YsonConverter_.Convert (block);
@@ -651,6 +672,7 @@ class TYtColumnConverter final : public IYtColumnConverter {
651
672
TYtYsonColumnConverter<Native, IsTopOptional, true > DictYsonConverter_;
652
673
TYtYsonColumnConverter<Native, IsTopOptional, false > YsonConverter_;
653
674
TPrimitiveColumnConverter<true > DictPrimitiveConverter_;
675
+ bool IsJson_;
654
676
};
655
677
656
678
TYtColumnConverterSettings::TYtColumnConverterSettings (NKikimr::NMiniKQL::TType* type, const NUdf::IPgBuilder* pgBuilder, arrow::MemoryPool& pool, bool isNative)
0 commit comments