From 9517f9183301d66d60619b28a336c126e7b73143 Mon Sep 17 00:00:00 2001 From: subham sarkar Date: Thu, 18 Feb 2021 23:45:17 +0530 Subject: [PATCH 1/2] Fix double dot range for invalid input. --- optimizer/const_range.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/optimizer/const_range.go b/optimizer/const_range.go index 50723b6b4..5205aa14f 100644 --- a/optimizer/const_range.go +++ b/optimizer/const_range.go @@ -14,6 +14,14 @@ func (*constRange) Exit(node *Node) { if min, ok := n.Left.(*IntegerNode); ok { if max, ok := n.Right.(*IntegerNode); ok { size := max.Value - min.Value + 1 + // In case the max < min, patch empty slice + // as max must be greater than equal to min. + if size < 1 { + Patch(node, &ConstantNode{ + Value: make([]int, 0), + }) + return + } // In this case array is too big. Skip generation, // and wait for memory budget detection on runtime. if size > 1e6 { From 147df3ca6dcc177507080ad0eb67086944dfada1 Mon Sep 17 00:00:00 2001 From: subham sarkar Date: Fri, 26 Feb 2021 20:20:26 +0530 Subject: [PATCH 2/2] Fix a corner case and add test case. --- expr_test.go | 8 ++++++++ vm/runtime.go | 3 +++ 2 files changed, 11 insertions(+) diff --git a/expr_test.go b/expr_test.go index 9da5fb49d..57a0b4f35 100644 --- a/expr_test.go +++ b/expr_test.go @@ -812,6 +812,14 @@ func TestExpr(t *testing.T) { `1 + 2 + Three`, 6, }, + { + `4 in 5..1`, + false, + }, + { + `4..0`, + []int{}, + }, { `MapArg({foo: "bar"})`, "bar", diff --git a/vm/runtime.go b/vm/runtime.go index 2dd11ac94..c010fd3a6 100644 --- a/vm/runtime.go +++ b/vm/runtime.go @@ -220,6 +220,9 @@ func exponent(a, b interface{}) float64 { func makeRange(min, max int) []int { size := max - min + 1 + if size <= 0 { + return []int{} + } rng := make([]int, size) for i := range rng { rng[i] = min + i