Merge pull request #598 from prometheus/binop-special-float-values

Fix special value handling in division and modulo.
This commit is contained in:
Julius Volz 2015-03-16 14:52:45 +01:00
commit 60c7748a17
2 changed files with 44 additions and 10 deletions

View file

@ -637,15 +637,12 @@ func evalScalarBinop(opType BinOpType,
case Mul: case Mul:
return lhs * rhs return lhs * rhs
case Div: case Div:
if rhs != 0 { return lhs / rhs
return lhs / rhs
}
return clientmodel.SampleValue(math.Inf(int(rhs)))
case Mod: case Mod:
if rhs != 0 { if rhs != 0 {
return clientmodel.SampleValue(int(lhs) % int(rhs)) return clientmodel.SampleValue(int(lhs) % int(rhs))
} }
return clientmodel.SampleValue(math.Inf(int(rhs))) return clientmodel.SampleValue(math.NaN())
case EQ: case EQ:
if lhs == rhs { if lhs == rhs {
return 1 return 1
@ -691,15 +688,12 @@ func evalVectorBinop(opType BinOpType,
case Mul: case Mul:
return lhs * rhs, true return lhs * rhs, true
case Div: case Div:
if rhs != 0 { return lhs / rhs, true
return lhs / rhs, true
}
return clientmodel.SampleValue(math.Inf(int(rhs))), true
case Mod: case Mod:
if rhs != 0 { if rhs != 0 {
return clientmodel.SampleValue(int(lhs) % int(rhs)), true return clientmodel.SampleValue(int(lhs) % int(rhs)), true
} }
return clientmodel.SampleValue(math.Inf(int(rhs))), true return clientmodel.SampleValue(math.NaN()), true
case EQ: case EQ:
if lhs == rhs { if lhs == rhs {
return lhs, true return lhs, true

View file

@ -1157,6 +1157,46 @@ func TestExpressions(t *testing.T) {
expr: `999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999`, expr: `999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999`,
output: []string{`scalar: +Inf @[%v]`}, 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) storage, closer := newTestStorage(t)