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