Skip to content

Commit 78d265c

Browse files
authored
Merge pull request #106 from nickgerrets/tpcds
TPC-DS queries and BETWEEN comparison
2 parents d8ca65b + 5ef934a commit 78d265c

File tree

7 files changed

+579
-9
lines changed

7 files changed

+579
-9
lines changed

duckdb-r

Submodule duckdb-r updated 640 files

src/from_substrait.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,6 @@ unique_ptr<ParsedExpression> SubstraitToDuckDB::TransformScalarFunctionExpr(cons
254254
return make_uniq<ComparisonExpression>(ExpressionType::COMPARE_NOT_DISTINCT_FROM, std::move(children[0]),
255255
std::move(children[1]));
256256
} else if (function_name == "between") {
257-
// FIXME: ADD between to substrait extension
258257
D_ASSERT(children.size() == 3);
259258
return make_uniq<BetweenExpression>(std::move(children[0]), std::move(children[1]), std::move(children[2]));
260259
} else if (function_name == "extract") {

src/include/to_substrait.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class DuckDBToSubstrait {
8888
void TransformFunctionExpression(Expression &dexpr, substrait::Expression &sexpr, uint64_t col_offset);
8989
static void TransformConstantExpression(Expression &dexpr, substrait::Expression &sexpr);
9090
void TransformComparisonExpression(Expression &dexpr, substrait::Expression &sexpr);
91+
void TransformBetweenExpression(Expression &dexpr, substrait::Expression &sexpr);
9192
void TransformConjunctionExpression(Expression &dexpr, substrait::Expression &sexpr, uint64_t col_offset);
9293
void TransformNotNullExpression(Expression &dexpr, substrait::Expression &sexpr, uint64_t col_offset);
9394
void TransformIsNullExpression(Expression &dexpr, substrait::Expression &sexpr, uint64_t col_offset);

src/to_substrait.cpp

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,29 @@ void DuckDBToSubstrait::TransformComparisonExpression(Expression &dexpr, substra
413413
*scalar_fun->mutable_output_type() = DuckToSubstraitType(dcomp.return_type);
414414
}
415415

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+
416439
void DuckDBToSubstrait::TransformConjunctionExpression(Expression &dexpr, substrait::Expression &sexpr,
417440
uint64_t col_offset) {
418441
auto &dconj = dexpr.Cast<BoundConjunctionExpression>();
@@ -537,6 +560,9 @@ void DuckDBToSubstrait::TransformExpr(Expression &dexpr, substrait::Expression &
537560
case ExpressionType::COMPARE_NOT_DISTINCT_FROM:
538561
TransformComparisonExpression(dexpr, sexpr);
539562
break;
563+
case ExpressionType::COMPARE_BETWEEN:
564+
TransformBetweenExpression(dexpr, sexpr);
565+
break;
540566
case ExpressionType::CONJUNCTION_AND:
541567
case ExpressionType::CONJUNCTION_OR:
542568
TransformConjunctionExpression(dexpr, sexpr, col_offset);
@@ -557,7 +583,7 @@ void DuckDBToSubstrait::TransformExpr(Expression &dexpr, substrait::Expression &
557583
TransformNotExpression(dexpr, sexpr, col_offset);
558584
break;
559585
default:
560-
throw InternalException(ExpressionTypeToString(dexpr.type));
586+
throw NotImplementedException(ExpressionTypeToString(dexpr.type));
561587
}
562588
}
563589

@@ -742,7 +768,7 @@ substrait::Expression *DuckDBToSubstrait::TransformJoinCond(const JoinCondition
742768
join_comparision = "lt";
743769
break;
744770
default:
745-
throw InternalException("Unsupported join comparison: " + ExpressionTypeToOperator(dcond.comparison));
771+
throw NotImplementedException("Unsupported join comparison: " + ExpressionTypeToOperator(dcond.comparison));
746772
}
747773
vector<::substrait::Type> args_types;
748774
auto scalar_fun = expr->mutable_scalar_function();
@@ -946,7 +972,7 @@ substrait::Rel *DuckDBToSubstrait::TransformComparisonJoin(LogicalOperator &dop)
946972
sjoin->set_type(substrait::JoinRel::JoinType::JoinRel_JoinType_JOIN_TYPE_OUTER);
947973
break;
948974
default:
949-
throw InternalException("Unsupported join type " + JoinTypeToString(djoin.join_type));
975+
throw NotImplementedException("Unsupported join type " + JoinTypeToString(djoin.join_type));
950976
}
951977
// somewhat odd semantics on our side
952978
if (djoin.left_projection_map.empty()) {
@@ -984,15 +1010,15 @@ substrait::Rel *DuckDBToSubstrait::TransformAggregateGroup(LogicalOperator &dop)
9841010
for (auto &dgrp : daggr.groups) {
9851011
if (dgrp->type != ExpressionType::BOUND_REF) {
9861012
// 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");
9881014
}
9891015
TransformExpr(*dgrp, *sgrp->add_grouping_expressions());
9901016
}
9911017
for (auto &dmeas : daggr.expressions) {
9921018
auto smeas = saggr->add_measures()->mutable_measure();
9931019
if (dmeas->type != ExpressionType::BOUND_AGGREGATE) {
9941020
// 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");
9961022
}
9971023
auto &daexpr = dmeas->Cast<BoundAggregateExpression>();
9981024

@@ -1422,7 +1448,7 @@ substrait::Rel *DuckDBToSubstrait::TransformOp(LogicalOperator &dop) {
14221448
case LogicalOperatorType::LOGICAL_DUMMY_SCAN:
14231449
return TransformDummyScan();
14241450
default:
1425-
throw InternalException(LogicalOperatorToString(dop.type));
1451+
throw NotImplementedException(LogicalOperatorToString(dop.type));
14261452
}
14271453
}
14281454

test/sql/test_between.test

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# name: test/sql/test_between.test
2+
# description: Test BETWEEN comparison
3+
# group: [sql]
4+
5+
require substrait
6+
7+
statement ok
8+
PRAGMA enable_verification
9+
10+
statement ok
11+
create table t as select * from range(100) as t(x)
12+
13+
statement ok
14+
CALL get_substrait('select * from t where x BETWEEN 4 AND 6;', enable_optimizer = false );

0 commit comments

Comments
 (0)