Skip to content

Commit 213b9cd

Browse files
authored
Merge pull request #100 from pdet/upgrade
Implement new fetchrel definitions and remove R CI
2 parents b09b2c4 + a4f08ec commit 213b9cd

File tree

4 files changed

+40
-92
lines changed

4 files changed

+40
-92
lines changed

.github/workflows/r.yml

Lines changed: 0 additions & 77 deletions
This file was deleted.

src/from_substrait.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,10 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformCrossProductOp(const substrait:
416416

417417
shared_ptr<Relation> SubstraitToDuckDB::TransformFetchOp(const substrait::Rel &sop) {
418418
auto &slimit = sop.fetch();
419-
return make_shared_ptr<LimitRelation>(TransformOp(slimit.input()), slimit.count(), slimit.offset());
419+
idx_t limit, offset;
420+
limit = slimit.count() == -1 ? NumericLimits<idx_t>::Maximum() : slimit.count();
421+
offset = slimit.offset();
422+
return make_shared_ptr<LimitRelation>(TransformOp(slimit.input()), limit, offset);
420423
}
421424

422425
shared_ptr<Relation> SubstraitToDuckDB::TransformFilterOp(const substrait::Rel &sop) {

src/to_substrait.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -808,34 +808,35 @@ substrait::Rel *DuckDBToSubstrait::TransformTopN(LogicalOperator &dop) {
808808
}
809809

810810
substrait::Rel *DuckDBToSubstrait::TransformLimit(LogicalOperator &dop) {
811-
auto &dlimit = (LogicalLimit &)dop;
812-
auto res = new substrait::Rel();
813-
auto stopn = res->mutable_fetch();
814-
stopn->set_allocated_input(TransformOp(*dop.children[0]));
815-
816-
idx_t limit_val;
817-
idx_t offset_val;
818-
811+
auto &dlimit = dop.Cast<LogicalLimit>();
812+
// figure out limit and offset of this node
813+
int32_t limit_val;
814+
int32_t offset_val;
819815
switch (dlimit.limit_val.Type()) {
820816
case LimitNodeType::CONSTANT_VALUE:
821-
limit_val = dlimit.limit_val.GetConstantValue();
817+
limit_val = static_cast<int32_t>(dlimit.limit_val.GetConstantValue());
822818
break;
823819
case LimitNodeType::UNSET:
824-
limit_val = 2ULL << 62ULL;
820+
limit_val = -1;
825821
break;
826822
default:
827823
throw InternalException("Unsupported limit value type");
828824
}
829825
switch (dlimit.offset_val.Type()) {
830826
case LimitNodeType::CONSTANT_VALUE:
831-
offset_val = dlimit.offset_val.GetConstantValue();
827+
offset_val = static_cast<int32_t>(dlimit.offset_val.GetConstantValue());
832828
break;
833829
case LimitNodeType::UNSET:
834830
offset_val = 0;
835831
break;
836832
default:
837833
throw InternalException("Unsupported offset value type");
838834
}
835+
836+
auto res = new substrait::Rel();
837+
auto stopn = res->mutable_fetch();
838+
stopn->set_allocated_input(TransformOp(*dop.children[0]));
839+
839840
stopn->set_offset(offset_val);
840841
stopn->set_count(limit_val);
841842
return res;
@@ -1190,7 +1191,7 @@ substrait::Rel *DuckDBToSubstrait::TransformDummyScan() {
11901191

11911192
substrait::Rel *DuckDBToSubstrait::TransformGet(LogicalOperator &dop) {
11921193
auto get_rel = new substrait::Rel();
1193-
auto &dget = (LogicalGet &)dop;
1194+
auto &dget = dop.Cast<LogicalGet>();
11941195

11951196
if (!dget.function.get_bind_info) {
11961197
throw NotImplementedException("This Scanner Type can't be used in substrait because a get bind info "
@@ -1205,8 +1206,8 @@ substrait::Rel *DuckDBToSubstrait::TransformGet(LogicalOperator &dop) {
12051206
CreateConjunction(dget.table_filters.filters, [&](std::pair<const idx_t, unique_ptr<TableFilter>> &in) {
12061207
auto col_idx = in.first;
12071208
auto return_type = dget.returned_types[col_idx];
1208-
auto &filter = *in.second;
1209-
return TransformFilter(col_idx, return_type, filter, return_type);
1209+
auto &inside_filter = *in.second;
1210+
return TransformFilter(col_idx, return_type, inside_filter, return_type);
12101211
});
12111212
sget->set_allocated_filter(filter);
12121213
}

test/sql/test_limit.test

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# name: test/sql/test_limit.test
2+
# description: Test limit and offset operations
3+
# group: [sql]
4+
5+
require substrait
6+
7+
statement ok
8+
PRAGMA enable_verification
9+
10+
statement ok
11+
create table t as FROM range(10);
12+
13+
statement ok
14+
CALL get_substrait('select * from t limit 5');
15+
16+
statement ok
17+
CALL get_substrait('select * from t offset 1');
18+
19+
statement ok
20+
CALL get_substrait('select * from t offset 1 limit 5');
21+

0 commit comments

Comments
 (0)