diff --git a/rules/ast/ast.go b/rules/ast/ast.go index 0eeb3aae4..49d1e54e9 100644 --- a/rules/ast/ast.go +++ b/rules/ast/ast.go @@ -637,15 +637,12 @@ func evalScalarBinop(opType BinOpType, case Mul: return lhs * rhs case Div: - if rhs != 0 { - return lhs / rhs - } - return clientmodel.SampleValue(math.Inf(int(rhs))) + return lhs / rhs case Mod: if rhs != 0 { return clientmodel.SampleValue(int(lhs) % int(rhs)) } - return clientmodel.SampleValue(math.Inf(int(rhs))) + return clientmodel.SampleValue(math.NaN()) case EQ: if lhs == rhs { return 1 @@ -691,15 +688,12 @@ func evalVectorBinop(opType BinOpType, case Mul: return lhs * rhs, true case Div: - if rhs != 0 { - return lhs / rhs, true - } - return clientmodel.SampleValue(math.Inf(int(rhs))), true + return lhs / rhs, true case Mod: if rhs != 0 { return clientmodel.SampleValue(int(lhs) % int(rhs)), true } - return clientmodel.SampleValue(math.Inf(int(rhs))), true + return clientmodel.SampleValue(math.NaN()), true case EQ: if lhs == rhs { return lhs, true diff --git a/rules/rules_test.go b/rules/rules_test.go index 14fc46161..baecc50b7 100644 --- a/rules/rules_test.go +++ b/rules/rules_test.go @@ -1157,6 +1157,46 @@ func TestExpressions(t *testing.T) { expr: `999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999`, output: []string{`scalar: +Inf @[%v]`}, }, + { + expr: `1 / 0`, + output: []string{`scalar: +Inf @[%v]`}, + }, + { + expr: `-1 / 0`, + output: []string{`scalar: -Inf @[%v]`}, + }, + { + expr: `0 / 0`, + output: []string{`scalar: NaN @[%v]`}, + }, + { + expr: `1 % 0`, + output: []string{`scalar: NaN @[%v]`}, + }, + { + expr: `http_requests{group="canary", instance="0", job="api-server"} / 0`, + output: []string{ + `{group="canary", instance="0", job="api-server"} => +Inf @[%v]`, + }, + }, + { + expr: `-1 * http_requests{group="canary", instance="0", job="api-server"} / 0`, + output: []string{ + `{group="canary", instance="0", job="api-server"} => -Inf @[%v]`, + }, + }, + { + expr: `0 * http_requests{group="canary", instance="0", job="api-server"} / 0`, + output: []string{ + `{group="canary", instance="0", job="api-server"} => NaN @[%v]`, + }, + }, + { + expr: `0 * http_requests{group="canary", instance="0", job="api-server"} % 0`, + output: []string{ + `{group="canary", instance="0", job="api-server"} => NaN @[%v]`, + }, + }, } storage, closer := newTestStorage(t)