@@ -336,15 +336,25 @@ unique_ptr<ParsedExpression> SubstraitToDuckDB::TransformInExpr(const substrait:
336
336
return make_uniq<OperatorExpression>(ExpressionType::COMPARE_IN, std::move (values));
337
337
}
338
338
339
- unique_ptr<ParsedExpression> SubstraitToDuckDB::TransformNested (const substrait::Expression &sexpr) {
339
+ unique_ptr<ParsedExpression> SubstraitToDuckDB::TransformNested (const substrait::Expression &sexpr,
340
+ RootNameIterator *iterator) {
340
341
auto &nested_expression = sexpr.nested ();
341
342
if (nested_expression.has_struct_ ()) {
342
343
auto &struct_expression = nested_expression.struct_ ();
343
344
vector<unique_ptr<ParsedExpression>> children;
344
345
for (auto &child : struct_expression.fields ()) {
345
346
children.emplace_back (TransformExpr (child));
346
347
}
347
- return make_uniq<FunctionExpression>(" row" , std::move (children));
348
+ if (iterator && !iterator->Finished () && iterator->Unique (children.size ())) {
349
+ for (auto &child : children) {
350
+ child->alias = iterator->GetCurrentName ();
351
+ iterator->Next ();
352
+ }
353
+ return make_uniq<FunctionExpression>(" struct_pack" , std::move (children));
354
+ } else {
355
+ return make_uniq<FunctionExpression>(" row" , std::move (children));
356
+ }
357
+
348
358
} else if (nested_expression.has_list ()) {
349
359
auto &list_expression = nested_expression.list ();
350
360
vector<unique_ptr<ParsedExpression>> children;
@@ -366,7 +376,11 @@ unique_ptr<ParsedExpression> SubstraitToDuckDB::TransformNested(const substrait:
366
376
}
367
377
}
368
378
369
- unique_ptr<ParsedExpression> SubstraitToDuckDB::TransformExpr (const substrait::Expression &sexpr) {
379
+ unique_ptr<ParsedExpression> SubstraitToDuckDB::TransformExpr (const substrait::Expression &sexpr,
380
+ RootNameIterator *iterator) {
381
+ if (iterator) {
382
+ iterator->Next ();
383
+ }
370
384
switch (sexpr.rex_type_case ()) {
371
385
case substrait::Expression::RexTypeCase::kLiteral :
372
386
return TransformLiteralExpr (sexpr);
@@ -381,7 +395,7 @@ unique_ptr<ParsedExpression> SubstraitToDuckDB::TransformExpr(const substrait::E
381
395
case substrait::Expression::RexTypeCase::kSingularOrList :
382
396
return TransformInExpr (sexpr);
383
397
case substrait::Expression::RexTypeCase::kNested :
384
- return TransformNested (sexpr);
398
+ return TransformNested (sexpr, iterator );
385
399
case substrait::Expression::RexTypeCase::kSubquery :
386
400
default :
387
401
throw InternalException (" Unsupported expression type " + to_string (sexpr.rex_type_case ()));
@@ -463,22 +477,27 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformCrossProductOp(const substrait:
463
477
TransformOp (sub_cross.right ())->Alias (" right" ));
464
478
}
465
479
466
- shared_ptr<Relation> SubstraitToDuckDB::TransformFetchOp (const substrait::Rel &sop) {
480
+ shared_ptr<Relation> SubstraitToDuckDB::TransformFetchOp (const substrait::Rel &sop,
481
+ const google::protobuf::RepeatedPtrField<std::string> *names) {
467
482
auto &slimit = sop.fetch ();
468
483
idx_t limit = slimit.count () == -1 ? NumericLimits<idx_t >::Maximum () : slimit.count ();
469
484
idx_t offset = slimit.offset ();
470
- return make_shared_ptr<LimitRelation>(TransformOp (slimit.input ()), limit, offset);
485
+ return make_shared_ptr<LimitRelation>(TransformOp (slimit.input (), names ), limit, offset);
471
486
}
472
487
473
488
shared_ptr<Relation> SubstraitToDuckDB::TransformFilterOp (const substrait::Rel &sop) {
474
489
auto &sfilter = sop.filter ();
475
490
return make_shared_ptr<FilterRelation>(TransformOp (sfilter.input ()), TransformExpr (sfilter.condition ()));
476
491
}
477
492
478
- shared_ptr<Relation> SubstraitToDuckDB::TransformProjectOp (const substrait::Rel &sop) {
493
+ shared_ptr<Relation>
494
+ SubstraitToDuckDB::TransformProjectOp (const substrait::Rel &sop,
495
+ const google::protobuf::RepeatedPtrField<std::string> *names) {
479
496
vector<unique_ptr<ParsedExpression>> expressions;
497
+ RootNameIterator iterator (names);
498
+
480
499
for (auto &sexpr : sop.project ().expressions ()) {
481
- expressions.push_back (TransformExpr (sexpr));
500
+ expressions.push_back (TransformExpr (sexpr, &iterator ));
482
501
}
483
502
484
503
vector<string> mock_aliases;
@@ -635,12 +654,13 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformReadOp(const substrait::Rel &so
635
654
return scan;
636
655
}
637
656
638
- shared_ptr<Relation> SubstraitToDuckDB::TransformSortOp (const substrait::Rel &sop) {
657
+ shared_ptr<Relation> SubstraitToDuckDB::TransformSortOp (const substrait::Rel &sop,
658
+ const google::protobuf::RepeatedPtrField<std::string> *names) {
639
659
vector<OrderByNode> order_nodes;
640
660
for (auto &sordf : sop.sort ().sorts ()) {
641
661
order_nodes.push_back (TransformOrder (sordf));
642
662
}
643
- return make_shared_ptr<OrderRelation>(TransformOp (sop.sort ().input ()), std::move (order_nodes));
663
+ return make_shared_ptr<OrderRelation>(TransformOp (sop.sort ().input (), names ), std::move (order_nodes));
644
664
}
645
665
646
666
static SetOperationType TransformSetOperationType (substrait::SetRel_SetOp setop) {
@@ -660,7 +680,8 @@ static SetOperationType TransformSetOperationType(substrait::SetRel_SetOp setop)
660
680
}
661
681
}
662
682
663
- shared_ptr<Relation> SubstraitToDuckDB::TransformSetOp (const substrait::Rel &sop) {
683
+ shared_ptr<Relation> SubstraitToDuckDB::TransformSetOp (const substrait::Rel &sop,
684
+ const google::protobuf::RepeatedPtrField<std::string> *names) {
664
685
D_ASSERT (sop.has_set ());
665
686
auto &set = sop.set ();
666
687
auto set_op_type = set.op ();
@@ -672,31 +693,32 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformSetOp(const substrait::Rel &sop
672
693
throw NotImplementedException (" The amount of inputs (%d) is not supported for this set operation" , input_count);
673
694
}
674
695
auto lhs = TransformOp (inputs[0 ]);
675
- auto rhs = TransformOp (inputs[1 ]);
696
+ auto rhs = TransformOp (inputs[1 ], names );
676
697
677
698
return make_shared_ptr<SetOpRelation>(std::move (lhs), std::move (rhs), type);
678
699
}
679
700
680
- shared_ptr<Relation> SubstraitToDuckDB::TransformOp (const substrait::Rel &sop) {
701
+ shared_ptr<Relation> SubstraitToDuckDB::TransformOp (const substrait::Rel &sop,
702
+ const google::protobuf::RepeatedPtrField<std::string> *names) {
681
703
switch (sop.rel_type_case ()) {
682
704
case substrait::Rel::RelTypeCase::kJoin :
683
705
return TransformJoinOp (sop);
684
706
case substrait::Rel::RelTypeCase::kCross :
685
707
return TransformCrossProductOp (sop);
686
708
case substrait::Rel::RelTypeCase::kFetch :
687
- return TransformFetchOp (sop);
709
+ return TransformFetchOp (sop, names );
688
710
case substrait::Rel::RelTypeCase::kFilter :
689
711
return TransformFilterOp (sop);
690
712
case substrait::Rel::RelTypeCase::kProject :
691
- return TransformProjectOp (sop);
713
+ return TransformProjectOp (sop, names );
692
714
case substrait::Rel::RelTypeCase::kAggregate :
693
715
return TransformAggregateOp (sop);
694
716
case substrait::Rel::RelTypeCase::kRead :
695
717
return TransformReadOp (sop);
696
718
case substrait::Rel::RelTypeCase::kSort :
697
- return TransformSortOp (sop);
719
+ return TransformSortOp (sop, names );
698
720
case substrait::Rel::RelTypeCase::kSet :
699
- return TransformSetOp (sop);
721
+ return TransformSetOp (sop, names );
700
722
default :
701
723
throw InternalException (" Unsupported relation type " + to_string (sop.rel_type_case ()));
702
724
}
@@ -738,7 +760,7 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformRootOp(const substrait::RelRoot
738
760
const auto &column_names = sop.names ();
739
761
vector<unique_ptr<ParsedExpression>> expressions;
740
762
int id = 1 ;
741
- auto child = TransformOp (sop.input ());
763
+ auto child = TransformOp (sop.input (), &column_names );
742
764
auto first_projection_or_table = GetProjection (*child);
743
765
if (first_projection_or_table) {
744
766
vector<ColumnDefinition> *column_definitions = &first_projection_or_table->Cast <ProjectionRelation>().columns ;
0 commit comments