Skip to content

Commit a190ea3

Browse files
authored
Fixing optimized numbers.range builtin reversed range bug (#7230)
Signed-off-by: Johan Fylling <[email protected]>
1 parent 9a7d920 commit a190ea3

File tree

5 files changed

+72
-2
lines changed

5 files changed

+72
-2
lines changed

v1/test/cases/testdata/v0/numbersrange/test-numbersrange-0258.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,20 @@ cases:
1919
- -1
2020
- -2
2121
- -3
22+
- note: numbersrange/descending (cheap optimization)
23+
query: data.generated.p = x
24+
modules:
25+
- |
26+
package generated
27+
28+
p := __local0__ {
29+
numbers.range(5, 2, __local1__)
30+
__local0__ = __local1__
31+
}
32+
data: {}
33+
want_result:
34+
- x:
35+
- 5
36+
- 4
37+
- 3
38+
- 2

v1/test/cases/testdata/v0/numbersrangestep/test-numbersrangestep.yaml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,21 @@ cases:
3434
- -6
3535
- -8
3636
- -10
37+
- note: numbersrangestep/descending (cheap optimization)
38+
query: data.test.p = x
39+
modules:
40+
- |
41+
package test
42+
43+
p = num {
44+
num := numbers.range_step(10, 3, 2)
45+
}
46+
want_result:
47+
- x:
48+
- 10
49+
- 8
50+
- 6
51+
- 4
3752
- note: numbersrangestep/negative
3853
query: data.test.p = x
3954
modules:

v1/test/cases/testdata/v1/numbersrange/test-numbersrange-0258.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,20 @@ cases:
1919
- -1
2020
- -2
2121
- -3
22+
- note: numbersrange/descending (cheap optimization)
23+
query: data.generated.p = x
24+
modules:
25+
- |
26+
package generated
27+
28+
p := __local0__ if {
29+
numbers.range(5, 2, __local1__)
30+
__local0__ = __local1__
31+
}
32+
data: {}
33+
want_result:
34+
- x:
35+
- 5
36+
- 4
37+
- 3
38+
- 2

v1/test/cases/testdata/v1/numbersrangestep/test-numbersrangestep.yaml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,21 @@ cases:
3434
- -6
3535
- -8
3636
- -10
37+
- note: numbersrangestep/descending (cheap optimization)
38+
query: data.test.p = x
39+
modules:
40+
- |
41+
package test
42+
43+
p = num if {
44+
num := numbers.range_step(10, 3, 2)
45+
}
46+
want_result:
47+
- x:
48+
- 10
49+
- 8
50+
- 6
51+
- 4
3752
- note: numbersrangestep/negative
3853
query: data.test.p = x
3954
modules:

v1/topdown/numbers.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,14 @@ func generateCheapRange(operands []*ast.Term, iter func(*ast.Term) error) error
107107

108108
terms := make([]*ast.Term, 0, y+1)
109109

110-
for i := x; i <= y; i += step {
111-
terms = append(terms, ast.InternedIntNumberTerm(i))
110+
if x <= y {
111+
for i := x; i <= y; i += step {
112+
terms = append(terms, ast.InternedIntNumberTerm(i))
113+
}
114+
} else {
115+
for i := x; i >= y; i -= step {
116+
terms = append(terms, ast.InternedIntNumberTerm(i))
117+
}
112118
}
113119

114120
return iter(ast.ArrayTerm(terms...))

0 commit comments

Comments
 (0)