File tree Expand file tree Collapse file tree 4 files changed +16
-12
lines changed
partiql-eval/src/main/kotlin/org/partiql/eval/internal
partiql-planner/src/main/kotlin/org/partiql/planner/internal/transforms Expand file tree Collapse file tree 4 files changed +16
-12
lines changed Original file line number Diff line number Diff line change @@ -10,6 +10,7 @@ import org.partiql.eval.internal.operator.rel.RelJoinLeft
10
10
import org.partiql.eval.internal.operator.rel.RelJoinOuterFull
11
11
import org.partiql.eval.internal.operator.rel.RelJoinRight
12
12
import org.partiql.eval.internal.operator.rel.RelLimit
13
+ import org.partiql.eval.internal.operator.rel.RelOffset
13
14
import org.partiql.eval.internal.operator.rel.RelProject
14
15
import org.partiql.eval.internal.operator.rel.RelScan
15
16
import org.partiql.eval.internal.operator.rel.RelScanIndexed
@@ -216,7 +217,7 @@ internal class Compiler(
216
217
override fun visitRelOpOffset (node : Rel .Op .Offset , ctx : StaticType ? ): Operator {
217
218
val input = visitRel(node.input, ctx)
218
219
val offset = visitRex(node.offset, ctx)
219
- return RelLimit (input, offset)
220
+ return RelOffset (input, offset)
220
221
}
221
222
222
223
override fun visitRexOpTupleUnion (node : Rex .Op .TupleUnion , ctx : StaticType ? ): Operator {
Original file line number Diff line number Diff line change @@ -5,24 +5,25 @@ import org.partiql.eval.internal.Record
5
5
import org.partiql.eval.internal.operator.Operator
6
6
import org.partiql.value.NumericValue
7
7
import org.partiql.value.PartiQLValueExperimental
8
+ import java.math.BigInteger
8
9
9
10
@OptIn(PartiQLValueExperimental ::class )
10
11
internal class RelLimit (
11
12
private val input : Operator .Relation ,
12
13
private val limit : Operator .Expr ,
13
14
) : Operator.Relation {
14
15
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
17
18
18
19
override fun open () {
19
20
input.open()
20
- _seen = 0
21
+ _seen = BigInteger . ZERO
21
22
22
23
// TODO pass outer scope to limit expression
23
24
val l = limit.eval(Record .empty)
24
25
if (l is NumericValue <* >) {
25
- _limit = l.toInt64 ().value ? : 0L
26
+ _limit = l.toInt ().value!!
26
27
} else {
27
28
throw TypeCheckException ()
28
29
}
@@ -31,7 +32,7 @@ internal class RelLimit(
31
32
override fun next (): Record ? {
32
33
if (_seen < _limit ) {
33
34
val row = input.next() ? : return null
34
- _seen + = 1
35
+ _seen = _seen .add( BigInteger . ONE )
35
36
return row
36
37
}
37
38
return null
Original file line number Diff line number Diff line change @@ -5,6 +5,7 @@ import org.partiql.eval.internal.Record
5
5
import org.partiql.eval.internal.operator.Operator
6
6
import org.partiql.value.NumericValue
7
7
import org.partiql.value.PartiQLValueExperimental
8
+ import java.math.BigInteger
8
9
9
10
@OptIn(PartiQLValueExperimental ::class )
10
11
internal class RelOffset (
@@ -13,18 +14,18 @@ internal class RelOffset(
13
14
) : Operator.Relation {
14
15
15
16
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
18
19
19
20
override fun open () {
20
21
input.open()
21
22
init = false
22
- _seen = 0
23
+ _seen = BigInteger . ZERO
23
24
24
25
// TODO pass outer scope to offset expression
25
26
val o = offset.eval(Record .empty)
26
27
if (o is NumericValue <* >) {
27
- _offset = o.toInt64 ().value ? : 0L
28
+ _offset = o.toInt ().value!!
28
29
} else {
29
30
throw TypeCheckException ()
30
31
}
@@ -34,7 +35,7 @@ internal class RelOffset(
34
35
if (! init ) {
35
36
while (_seen < _offset ) {
36
37
input.next() ? : return null
37
- _seen + = 1
38
+ _seen = _seen .add( BigInteger . ONE )
38
39
}
39
40
init = true
40
41
}
Original file line number Diff line number Diff line change @@ -147,8 +147,9 @@ internal object RelConverter {
147
147
rel = convertHaving(rel, sel.having)
148
148
rel = convertSetOp(rel, sel.setOp)
149
149
rel = convertOrderBy(rel, sel.orderBy)
150
- rel = convertLimit(rel, sel. limit)
150
+ // offset should precede limit
151
151
rel = convertOffset(rel, sel.offset)
152
+ rel = convertLimit(rel, sel.limit)
152
153
rel = convertExclude(rel, sel.exclude)
153
154
// append SQL projection if present
154
155
rel = when (val projection = sel.select) {
You can’t perform that action at this time.
0 commit comments