@@ -413,6 +413,29 @@ void DuckDBToSubstrait::TransformComparisonExpression(Expression &dexpr, substra
413
413
*scalar_fun->mutable_output_type () = DuckToSubstraitType (dcomp.return_type );
414
414
}
415
415
416
+ void DuckDBToSubstrait::TransformBetweenExpression (Expression &dexpr, substrait::Expression &sexpr) {
417
+ auto &dcomp = dexpr.Cast <BoundBetweenExpression>();
418
+
419
+ if (dexpr.type != ExpressionType::COMPARE_BETWEEN) {
420
+ throw InternalException (" Not a between comparison expression" );
421
+ }
422
+
423
+ auto scalar_fun = sexpr.mutable_scalar_function ();
424
+ vector<::substrait::Type> args_types;
425
+ args_types.emplace_back (DuckToSubstraitType (dcomp.input ->return_type ));
426
+ args_types.emplace_back (DuckToSubstraitType (dcomp.lower ->return_type ));
427
+ args_types.emplace_back (DuckToSubstraitType (dcomp.upper ->return_type ));
428
+ scalar_fun->set_function_reference (RegisterFunction (" between" , args_types));
429
+
430
+ auto sarg = scalar_fun->add_arguments ();
431
+ TransformExpr (*dcomp.input , *sarg->mutable_value (), 0 );
432
+ sarg = scalar_fun->add_arguments ();
433
+ TransformExpr (*dcomp.lower , *sarg->mutable_value (), 0 );
434
+ sarg = scalar_fun->add_arguments ();
435
+ TransformExpr (*dcomp.upper , *sarg->mutable_value (), 0 );
436
+ *scalar_fun->mutable_output_type () = DuckToSubstraitType (dcomp.return_type );
437
+ }
438
+
416
439
void DuckDBToSubstrait::TransformConjunctionExpression (Expression &dexpr, substrait::Expression &sexpr,
417
440
uint64_t col_offset) {
418
441
auto &dconj = dexpr.Cast <BoundConjunctionExpression>();
@@ -537,6 +560,9 @@ void DuckDBToSubstrait::TransformExpr(Expression &dexpr, substrait::Expression &
537
560
case ExpressionType::COMPARE_NOT_DISTINCT_FROM:
538
561
TransformComparisonExpression (dexpr, sexpr);
539
562
break ;
563
+ case ExpressionType::COMPARE_BETWEEN:
564
+ TransformBetweenExpression (dexpr, sexpr);
565
+ break ;
540
566
case ExpressionType::CONJUNCTION_AND:
541
567
case ExpressionType::CONJUNCTION_OR:
542
568
TransformConjunctionExpression (dexpr, sexpr, col_offset);
@@ -557,7 +583,7 @@ void DuckDBToSubstrait::TransformExpr(Expression &dexpr, substrait::Expression &
557
583
TransformNotExpression (dexpr, sexpr, col_offset);
558
584
break ;
559
585
default :
560
- throw InternalException (ExpressionTypeToString (dexpr.type ));
586
+ throw NotImplementedException (ExpressionTypeToString (dexpr.type ));
561
587
}
562
588
}
563
589
@@ -742,7 +768,7 @@ substrait::Expression *DuckDBToSubstrait::TransformJoinCond(const JoinCondition
742
768
join_comparision = " lt" ;
743
769
break ;
744
770
default :
745
- throw InternalException (" Unsupported join comparison: " + ExpressionTypeToOperator (dcond.comparison ));
771
+ throw NotImplementedException (" Unsupported join comparison: " + ExpressionTypeToOperator (dcond.comparison ));
746
772
}
747
773
vector<::substrait::Type> args_types;
748
774
auto scalar_fun = expr->mutable_scalar_function ();
@@ -946,7 +972,7 @@ substrait::Rel *DuckDBToSubstrait::TransformComparisonJoin(LogicalOperator &dop)
946
972
sjoin->set_type (substrait::JoinRel::JoinType::JoinRel_JoinType_JOIN_TYPE_OUTER);
947
973
break ;
948
974
default :
949
- throw InternalException (" Unsupported join type " + JoinTypeToString (djoin.join_type ));
975
+ throw NotImplementedException (" Unsupported join type " + JoinTypeToString (djoin.join_type ));
950
976
}
951
977
// somewhat odd semantics on our side
952
978
if (djoin.left_projection_map .empty ()) {
@@ -984,15 +1010,15 @@ substrait::Rel *DuckDBToSubstrait::TransformAggregateGroup(LogicalOperator &dop)
984
1010
for (auto &dgrp : daggr.groups ) {
985
1011
if (dgrp->type != ExpressionType::BOUND_REF) {
986
1012
// TODO push projection or push substrait to allow expressions here
987
- throw InternalException (" No expressions in groupings yet" );
1013
+ throw NotImplementedException (" No expressions in groupings yet" );
988
1014
}
989
1015
TransformExpr (*dgrp, *sgrp->add_grouping_expressions ());
990
1016
}
991
1017
for (auto &dmeas : daggr.expressions ) {
992
1018
auto smeas = saggr->add_measures ()->mutable_measure ();
993
1019
if (dmeas->type != ExpressionType::BOUND_AGGREGATE) {
994
1020
// TODO push projection or push substrait, too
995
- throw InternalException (" No non-aggregate expressions in measures yet" );
1021
+ throw NotImplementedException (" No non-aggregate expressions in measures yet" );
996
1022
}
997
1023
auto &daexpr = dmeas->Cast <BoundAggregateExpression>();
998
1024
@@ -1422,7 +1448,7 @@ substrait::Rel *DuckDBToSubstrait::TransformOp(LogicalOperator &dop) {
1422
1448
case LogicalOperatorType::LOGICAL_DUMMY_SCAN:
1423
1449
return TransformDummyScan ();
1424
1450
default :
1425
- throw InternalException (LogicalOperatorToString (dop.type ));
1451
+ throw NotImplementedException (LogicalOperatorToString (dop.type ));
1426
1452
}
1427
1453
}
1428
1454
0 commit comments