promql: fix parsing ambiguity for serial repetitions

This commit is contained in:
Fabian Reinartz 2015-06-04 18:21:24 +02:00
parent f344ecba59
commit 319068a7a6
2 changed files with 14 additions and 5 deletions

View File

@ -666,7 +666,8 @@ func lexNumberOrDuration(l *lexer) stateFn {
// not necessarily a valid number. This case is caught by the parser.
func (l *lexer) scanNumber() bool {
digits := "0123456789"
if l.accept("0") && l.accept("xX") {
// Disallow hexal in series descriptions as the syntax is ambiguous.
if !l.seriesDesc && l.accept("0") && l.accept("xX") {
digits = "0123456789abcdefABCDEF"
}
l.acceptRun(digits)
@ -677,11 +678,12 @@ func (l *lexer) scanNumber() bool {
l.accept("+-")
l.acceptRun("0123456789")
}
// Next thing must not be alphanumeric.
if isAlphaNumeric(l.peek()) && !l.seriesDesc {
return false
// Next thing must not be alphanumeric unless it's the times token
// for series repetitions.
if r := l.peek(); (l.seriesDesc && r == 'x') || !isAlphaNumeric(r) {
return true
}
return true
return false
}
// lexIdentifier scans an alphanumeric identifier. The next character

View File

@ -1274,6 +1274,13 @@ var testSeries = []struct {
"a": "b",
},
expectedValues: newSeq(1, 2, 3, -7, -17, -27, -37),
}, {
input: `my_metric{a="b"} 1 2 3-0x4`,
expectedMetric: clientmodel.Metric{
clientmodel.MetricNameLabel: "my_metric",
"a": "b",
},
expectedValues: newSeq(1, 2, 3, 3, 3, 3, 3),
}, {
input: `my_metric{a="b"} 1 3 _ 5 _x4`,
expectedMetric: clientmodel.Metric{