Skip to content

Commit 9dd2b6c

Browse files
committed
limit offset
1 parent 8f3c7f2 commit 9dd2b6c

File tree

4 files changed

+16
-12
lines changed

4 files changed

+16
-12
lines changed

partiql-eval/src/main/kotlin/org/partiql/eval/internal/Compiler.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.partiql.eval.internal.operator.rel.RelJoinLeft
1010
import org.partiql.eval.internal.operator.rel.RelJoinOuterFull
1111
import org.partiql.eval.internal.operator.rel.RelJoinRight
1212
import org.partiql.eval.internal.operator.rel.RelLimit
13+
import org.partiql.eval.internal.operator.rel.RelOffset
1314
import org.partiql.eval.internal.operator.rel.RelProject
1415
import org.partiql.eval.internal.operator.rel.RelScan
1516
import org.partiql.eval.internal.operator.rel.RelScanIndexed
@@ -216,7 +217,7 @@ internal class Compiler(
216217
override fun visitRelOpOffset(node: Rel.Op.Offset, ctx: StaticType?): Operator {
217218
val input = visitRel(node.input, ctx)
218219
val offset = visitRex(node.offset, ctx)
219-
return RelLimit(input, offset)
220+
return RelOffset(input, offset)
220221
}
221222

222223
override fun visitRexOpTupleUnion(node: Rex.Op.TupleUnion, ctx: StaticType?): Operator {

partiql-eval/src/main/kotlin/org/partiql/eval/internal/operator/rel/RelLimit.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,25 @@ import org.partiql.eval.internal.Record
55
import org.partiql.eval.internal.operator.Operator
66
import org.partiql.value.NumericValue
77
import org.partiql.value.PartiQLValueExperimental
8+
import java.math.BigInteger
89

910
@OptIn(PartiQLValueExperimental::class)
1011
internal class RelLimit(
1112
private val input: Operator.Relation,
1213
private val limit: Operator.Expr,
1314
) : Operator.Relation {
1415

15-
private var _seen: Long = 0
16-
private var _limit: Long = 0
16+
private var _seen: BigInteger = BigInteger.ZERO
17+
private var _limit: BigInteger = BigInteger.ZERO
1718

1819
override fun open() {
1920
input.open()
20-
_seen = 0
21+
_seen = BigInteger.ZERO
2122

2223
// TODO pass outer scope to limit expression
2324
val l = limit.eval(Record.empty)
2425
if (l is NumericValue<*>) {
25-
_limit = l.toInt64().value ?: 0L
26+
_limit = l.toInt().value!!
2627
} else {
2728
throw TypeCheckException()
2829
}
@@ -31,7 +32,7 @@ internal class RelLimit(
3132
override fun next(): Record? {
3233
if (_seen < _limit) {
3334
val row = input.next() ?: return null
34-
_seen += 1
35+
_seen = _seen.add(BigInteger.ONE)
3536
return row
3637
}
3738
return null

partiql-eval/src/main/kotlin/org/partiql/eval/internal/operator/rel/RelOffset.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import org.partiql.eval.internal.Record
55
import org.partiql.eval.internal.operator.Operator
66
import org.partiql.value.NumericValue
77
import org.partiql.value.PartiQLValueExperimental
8+
import java.math.BigInteger
89

910
@OptIn(PartiQLValueExperimental::class)
1011
internal class RelOffset(
@@ -13,18 +14,18 @@ internal class RelOffset(
1314
) : Operator.Relation {
1415

1516
private var init = false
16-
private var _seen: Long = 0
17-
private var _offset: Long = 0
17+
private var _seen: BigInteger = BigInteger.ZERO
18+
private var _offset: BigInteger = BigInteger.ZERO
1819

1920
override fun open() {
2021
input.open()
2122
init = false
22-
_seen = 0
23+
_seen = BigInteger.ZERO
2324

2425
// TODO pass outer scope to offset expression
2526
val o = offset.eval(Record.empty)
2627
if (o is NumericValue<*>) {
27-
_offset = o.toInt64().value ?: 0L
28+
_offset = o.toInt().value!!
2829
} else {
2930
throw TypeCheckException()
3031
}
@@ -34,7 +35,7 @@ internal class RelOffset(
3435
if (!init) {
3536
while (_seen < _offset) {
3637
input.next() ?: return null
37-
_seen += 1
38+
_seen = _seen.add(BigInteger.ONE)
3839
}
3940
init = true
4041
}

partiql-planner/src/main/kotlin/org/partiql/planner/internal/transforms/RelConverter.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,9 @@ internal object RelConverter {
147147
rel = convertHaving(rel, sel.having)
148148
rel = convertSetOp(rel, sel.setOp)
149149
rel = convertOrderBy(rel, sel.orderBy)
150-
rel = convertLimit(rel, sel.limit)
150+
// offset should precede limit
151151
rel = convertOffset(rel, sel.offset)
152+
rel = convertLimit(rel, sel.limit)
152153
rel = convertExclude(rel, sel.exclude)
153154
// append SQL projection if present
154155
rel = when (val projection = sel.select) {

0 commit comments

Comments
 (0)