diff --git a/cmd/prometheus/testdata/features.json b/cmd/prometheus/testdata/features.json
index aa9b4da0b0..78c6b5bdc8 100644
--- a/cmd/prometheus/testdata/features.json
+++ b/cmd/prometheus/testdata/features.json
@@ -73,6 +73,7 @@
"delta": true,
"deriv": true,
"double_exponential_smoothing": false,
+ "end": false,
"exp": true,
"first_over_time": false,
"floor": true,
@@ -105,6 +106,7 @@
"present_over_time": true,
"quantile_over_time": true,
"rad": true,
+ "range": false,
"rate": true,
"resets": true,
"round": true,
@@ -117,8 +119,10 @@
"sort_by_label_desc": false,
"sort_desc": true,
"sqrt": true,
+ "start": false,
"stddev_over_time": true,
"stdvar_over_time": true,
+ "step": false,
"sum_over_time": true,
"tan": true,
"tanh": true,
diff --git a/docs/querying/functions.md b/docs/querying/functions.md
index 43b05f3e6a..1deb690abe 100644
--- a/docs/querying/functions.md
+++ b/docs/querying/functions.md
@@ -173,6 +173,16 @@ entirely. For elements that contain a mix of float and histogram samples, only
the float samples are used as input, which is flagged by an info-level
annotation.
+## `end()`
+
+**This function has to be enabled via the [feature
+flag](../feature_flags.md#experimental-promql-functions)
+`--enable-feature=promql-experimental-functions`.**
+
+`end()` returns the end timestamp of the current query range evaluation as the
+number of seconds since January 1, 1970 UTC. For instant queries, this is equal
+to the evaluation timestamp.
+
## `double_exponential_smoothing()`
**This function has to be enabled via the [feature
@@ -729,6 +739,15 @@ ignored entirely. For elements that contain a mix of float and histogram
samples, only the float samples are used as input, which is flagged by an
info-level annotation.
+## `range()`
+
+**This function has to be enabled via the [feature
+flag](../feature_flags.md#experimental-promql-functions)
+`--enable-feature=promql-experimental-functions`.**
+
+`range()` returns the range duration of the current query range evaluation in
+seconds and is equivalent to `end() - start()`. For instant queries, this returns `0`.
+
## `rate()`
`rate(v range-vector)` calculates the per-second average rate of increase of the
@@ -841,6 +860,25 @@ Same as `sort_by_label`, but sorts in descending order.
`sqrt(v instant-vector)` calculates the square root of all float samples in
`v`. Histogram samples in the input vector are ignored silently.
+## `start()`
+
+**This function has to be enabled via the [feature
+flag](../feature_flags.md#experimental-promql-functions)
+`--enable-feature=promql-experimental-functions`.**
+
+`start()` returns the start timestamp of the current query range evaluation as the
+number of seconds since January 1, 1970 UTC. For instant queries, this is equal
+to the evaluation timestamp.
+
+## `step()`
+
+**This function has to be enabled via the [feature
+flag](../feature_flags.md#experimental-promql-functions)
+`--enable-feature=promql-experimental-functions`.**
+
+`step()` returns the query resolution step as the number of seconds. For instant
+queries, this returns `0`.
+
## `time()`
`time()` returns the number of seconds since January 1, 1970 UTC. Note that
diff --git a/promql/engine.go b/promql/engine.go
index feddc34393..c3fa917899 100644
--- a/promql/engine.go
+++ b/promql/engine.go
@@ -4229,12 +4229,61 @@ func unwrapParenExpr(e *parser.Expr) {
}
}
+// foldQueryContextFunctions rewrites calls to start(), end(), range(), and step() into
+// NumberLiteral nodes, since their values are constant for a given query execution.
+// This allows parent expressions to be correctly recognized as step-invariant by preprocessExprHelper.
+func foldQueryContextFunctions(expr parser.Expr, start, end time.Time, step time.Duration) parser.Expr {
+ if call, ok := expr.(*parser.Call); ok {
+ switch call.Func.Name {
+ case "start":
+ return &parser.NumberLiteral{Val: float64(timestamp.FromTime(start)) / 1000, PosRange: call.PosRange}
+ case "end":
+ return &parser.NumberLiteral{Val: float64(timestamp.FromTime(end)) / 1000, PosRange: call.PosRange}
+ case "range":
+ return &parser.NumberLiteral{Val: end.Sub(start).Seconds(), PosRange: call.PosRange}
+ case "step":
+ var val float64
+ if !start.Equal(end) {
+ val = step.Seconds()
+ }
+ return &parser.NumberLiteral{Val: val, PosRange: call.PosRange}
+ }
+ }
+ switch n := expr.(type) {
+ case *parser.BinaryExpr:
+ n.LHS = foldQueryContextFunctions(n.LHS, start, end, step)
+ n.RHS = foldQueryContextFunctions(n.RHS, start, end, step)
+ case *parser.Call:
+ for i := range n.Args {
+ n.Args[i] = foldQueryContextFunctions(n.Args[i], start, end, step)
+ }
+ case *parser.AggregateExpr:
+ n.Expr = foldQueryContextFunctions(n.Expr, start, end, step)
+ if n.Param != nil {
+ n.Param = foldQueryContextFunctions(n.Param, start, end, step)
+ }
+ case *parser.UnaryExpr:
+ n.Expr = foldQueryContextFunctions(n.Expr, start, end, step)
+ case *parser.ParenExpr:
+ n.Expr = foldQueryContextFunctions(n.Expr, start, end, step)
+ case *parser.SubqueryExpr:
+ n.Expr = foldQueryContextFunctions(n.Expr, start, end, step)
+ case *parser.MatrixSelector, *parser.VectorSelector, *parser.NumberLiteral, *parser.StringLiteral:
+ // Leaf nodes or nodes without foldable sub-expressions.
+ default:
+ panic(fmt.Sprintf("foldQueryContextFunctions: unhandled node type %T", expr))
+ }
+ return expr
+}
+
// PreprocessExpr wraps all possible step invariant parts of the given expression with
// StepInvariantExpr. It also resolves the preprocessors, evaluates duration expressions
// into their numeric values and removes superfluous parenthesis on parameters to functions and aggregations.
func PreprocessExpr(expr parser.Expr, start, end time.Time, step time.Duration) (parser.Expr, error) {
detectHistogramStatsDecoding(expr)
+ expr = foldQueryContextFunctions(expr, start, end, step)
+
if err := parser.Walk(&durationVisitor{step: step, queryRange: end.Sub(start)}, expr, nil); err != nil {
return nil, err
}
diff --git a/promql/functions.go b/promql/functions.go
index 546f94df12..924def7023 100644
--- a/promql/functions.go
+++ b/promql/functions.go
@@ -59,6 +59,13 @@ import (
// Scalar results should be returned as the value of a sample in a Vector.
type FunctionCall func(vectorVals []Vector, matrixVals Matrix, args parser.Expressions, enh *EvalNodeHelper) (Vector, annotations.Annotations)
+// funcQueryContext is a placeholder for start(), end(), range(), and step() functions.
+// These are folded into NumberLiteral nodes by foldQueryContextFunctions during query
+// preprocessing and must never reach the evaluator.
+func funcQueryContext(_ []Vector, _ Matrix, _ parser.Expressions, _ *EvalNodeHelper) (Vector, annotations.Annotations) {
+ panic("query context functions must be folded during preprocessing and must never be evaluated")
+}
+
// === time() float64 ===
func funcTime(_ []Vector, _ Matrix, _ parser.Expressions, enh *EvalNodeHelper) (Vector, annotations.Annotations) {
return Vector{Sample{
@@ -2174,6 +2181,7 @@ var FunctionCalls = map[string]FunctionCall{
"day_of_week": funcDayOfWeek,
"day_of_year": funcDayOfYear,
"deg": funcDeg,
+ "end": funcQueryContext,
"delta": funcDelta,
"deriv": funcDeriv,
"exp": funcExp,
@@ -2213,6 +2221,7 @@ var FunctionCalls = map[string]FunctionCall{
"present_over_time": funcPresentOverTime,
"quantile_over_time": funcQuantileOverTime,
"rad": funcRad,
+ "range": funcQueryContext,
"rate": funcRate,
"resets": funcResets,
"round": funcRound,
@@ -2224,6 +2233,8 @@ var FunctionCalls = map[string]FunctionCall{
"sort_desc": funcSortDesc,
"sort_by_label": funcSortByLabel,
"sort_by_label_desc": funcSortByLabelDesc,
+ "start": funcQueryContext,
+ "step": funcQueryContext,
"sqrt": funcSqrt,
"stddev_over_time": funcStddevOverTime,
"stdvar_over_time": funcStdvarOverTime,
@@ -2244,8 +2255,8 @@ var FunctionCalls = map[string]FunctionCall{
var AtModifierUnsafeFunctions = map[string]struct{}{
// Step invariant functions.
"days_in_month": {}, "day_of_month": {}, "day_of_week": {}, "day_of_year": {},
- "hour": {}, "minute": {}, "month": {}, "year": {},
- "predict_linear": {}, "time": {},
+ "end": {}, "hour": {}, "minute": {}, "month": {}, "year": {},
+ "predict_linear": {}, "range": {}, "start": {}, "step": {}, "time": {},
// Uses timestamp of the argument for the result,
// hence unsafe to use with @ modifier.
"timestamp": {},
diff --git a/promql/parser/functions.go b/promql/parser/functions.go
index 180a255ab0..6935260826 100644
--- a/promql/parser/functions.go
+++ b/promql/parser/functions.go
@@ -144,6 +144,12 @@ var Functions = map[string]*Function{
ArgTypes: []ValueType{ValueTypeVector},
ReturnType: ValueTypeVector,
},
+ "end": {
+ Name: "end",
+ ArgTypes: []ValueType{},
+ ReturnType: ValueTypeScalar,
+ Experimental: true,
+ },
"delta": {
Name: "delta",
ArgTypes: []ValueType{ValueTypeMatrix},
@@ -354,6 +360,12 @@ var Functions = map[string]*Function{
ArgTypes: []ValueType{ValueTypeVector},
ReturnType: ValueTypeVector,
},
+ "range": {
+ Name: "range",
+ ArgTypes: []ValueType{},
+ ReturnType: ValueTypeScalar,
+ Experimental: true,
+ },
"rate": {
Name: "rate",
ArgTypes: []ValueType{ValueTypeMatrix},
@@ -419,6 +431,18 @@ var Functions = map[string]*Function{
ArgTypes: []ValueType{ValueTypeVector},
ReturnType: ValueTypeVector,
},
+ "start": {
+ Name: "start",
+ ArgTypes: []ValueType{},
+ ReturnType: ValueTypeScalar,
+ Experimental: true,
+ },
+ "step": {
+ Name: "step",
+ ArgTypes: []ValueType{},
+ ReturnType: ValueTypeScalar,
+ Experimental: true,
+ },
"stddev_over_time": {
Name: "stddev_over_time",
ArgTypes: []ValueType{ValueTypeMatrix},
diff --git a/promql/parser/generated_parser.y b/promql/parser/generated_parser.y
index 4f821a5795..39dfa1f49f 100644
--- a/promql/parser/generated_parser.y
+++ b/promql/parser/generated_parser.y
@@ -472,6 +472,60 @@ function_call : IDENTIFIER function_call_body
},
}
}
+ | at_modifier_preprocessors function_call_body
+ {
+ fn, exist := getFunction($1.Val, yylex.(*parser).functions)
+ if !exist{
+ yylex.(*parser).addParseErrf($1.PositionRange(),"unknown function with name %q", $1.Val)
+ }
+ if fn != nil && fn.Experimental && !yylex.(*parser).options.EnableExperimentalFunctions {
+ yylex.(*parser).addParseErrf($1.PositionRange(),"function %q is not enabled", $1.Val)
+ }
+ $$ = &Call{
+ Func: fn,
+ Args: $2.(Expressions),
+ PosRange: posrange.PositionRange{
+ Start: $1.PositionRange().Start,
+ End: yylex.(*parser).lastClosing,
+ },
+ }
+ }
+ | STEP function_call_body
+ {
+ fn, exist := getFunction($1.Val, yylex.(*parser).functions)
+ if !exist{
+ yylex.(*parser).addParseErrf($1.PositionRange(),"unknown function with name %q", $1.Val)
+ }
+ if fn != nil && fn.Experimental && !yylex.(*parser).options.EnableExperimentalFunctions {
+ yylex.(*parser).addParseErrf($1.PositionRange(),"function %q is not enabled", $1.Val)
+ }
+ $$ = &Call{
+ Func: fn,
+ Args: $2.(Expressions),
+ PosRange: posrange.PositionRange{
+ Start: $1.PositionRange().Start,
+ End: yylex.(*parser).lastClosing,
+ },
+ }
+ }
+ | RANGE function_call_body
+ {
+ fn, exist := getFunction($1.Val, yylex.(*parser).functions)
+ if !exist{
+ yylex.(*parser).addParseErrf($1.PositionRange(),"unknown function with name %q", $1.Val)
+ }
+ if fn != nil && fn.Experimental && !yylex.(*parser).options.EnableExperimentalFunctions {
+ yylex.(*parser).addParseErrf($1.PositionRange(),"function %q is not enabled", $1.Val)
+ }
+ $$ = &Call{
+ Func: fn,
+ Args: $2.(Expressions),
+ PosRange: posrange.PositionRange{
+ Start: $1.PositionRange().Start,
+ End: yylex.(*parser).lastClosing,
+ },
+ }
+ }
;
function_call_body: LEFT_PAREN function_call_args RIGHT_PAREN
diff --git a/promql/parser/generated_parser.y.go b/promql/parser/generated_parser.y.go
index ba20e19145..bf96f73f5a 100644
--- a/promql/parser/generated_parser.y.go
+++ b/promql/parser/generated_parser.y.go
@@ -269,372 +269,396 @@ var yyExca = [...]int16{
1, -1,
-2, 0,
-1, 44,
- 1, 163,
- 10, 163,
- 24, 163,
+ 1, 166,
+ 10, 166,
+ 24, 166,
-2, 0,
- -1, 75,
- 2, 206,
- 15, 206,
- 81, 206,
- 92, 206,
- -2, 117,
-1, 76,
- 2, 207,
- 15, 207,
- 81, 207,
- 92, 207,
- -2, 118,
- -1, 77,
- 2, 208,
- 15, 208,
- 81, 208,
- 92, 208,
- -2, 120,
- -1, 78,
2, 209,
15, 209,
81, 209,
92, 209,
- -2, 121,
- -1, 79,
+ -2, 120,
+ -1, 77,
2, 210,
15, 210,
81, 210,
92, 210,
- -2, 125,
- -1, 80,
+ -2, 121,
+ -1, 78,
2, 211,
15, 211,
81, 211,
92, 211,
- -2, 130,
- -1, 81,
+ -2, 123,
+ -1, 79,
2, 212,
15, 212,
81, 212,
92, 212,
- -2, 132,
- -1, 82,
+ -2, 124,
+ -1, 80,
2, 213,
15, 213,
81, 213,
92, 213,
- -2, 134,
- -1, 83,
+ -2, 128,
+ -1, 81,
2, 214,
15, 214,
81, 214,
92, 214,
- -2, 135,
- -1, 84,
+ -2, 133,
+ -1, 82,
2, 215,
15, 215,
81, 215,
92, 215,
- -2, 136,
- -1, 85,
+ -2, 135,
+ -1, 83,
2, 216,
15, 216,
81, 216,
92, 216,
-2, 137,
- -1, 86,
+ -1, 84,
2, 217,
15, 217,
81, 217,
92, 217,
-2, 138,
- -1, 87,
+ -1, 85,
2, 218,
15, 218,
81, 218,
92, 218,
- -2, 142,
- -1, 88,
+ -2, 139,
+ -1, 86,
2, 219,
15, 219,
81, 219,
92, 219,
+ -2, 140,
+ -1, 87,
+ 2, 220,
+ 15, 220,
+ 81, 220,
+ 92, 220,
+ -2, 141,
+ -1, 88,
+ 2, 221,
+ 15, 221,
+ 81, 221,
+ 92, 221,
+ -2, 145,
+ -1, 89,
+ 2, 222,
+ 15, 222,
+ 81, 222,
+ 92, 222,
+ -2, 146,
+ -1, 90,
+ 15, 92,
-2, 143,
- -1, 142,
- 41, 290,
- 42, 290,
- 54, 290,
- 55, 290,
- 59, 290,
+ -1, 91,
+ 15, 93,
+ -2, 144,
+ -1, 150,
+ 41, 293,
+ 42, 293,
+ 54, 293,
+ 55, 293,
+ 59, 293,
-2, 22,
- -1, 262,
- 9, 275,
- 12, 275,
- 13, 275,
- 18, 275,
- 19, 275,
- 25, 275,
- 41, 275,
- 49, 275,
- 50, 275,
- 53, 275,
- 59, 275,
- 64, 275,
- 65, 275,
- 66, 275,
- 67, 275,
- 68, 275,
- 69, 275,
- 70, 275,
- 71, 275,
- 72, 275,
- 73, 275,
- 74, 275,
- 75, 275,
- 76, 275,
- 77, 275,
- 81, 275,
- 84, 275,
- 85, 275,
- 86, 275,
- 88, 275,
- 89, 275,
- 90, 275,
- 92, 275,
- 95, 275,
- 96, 275,
- 97, 275,
- 98, 275,
+ -1, 268,
+ 9, 278,
+ 12, 278,
+ 13, 278,
+ 18, 278,
+ 19, 278,
+ 25, 278,
+ 41, 278,
+ 49, 278,
+ 50, 278,
+ 53, 278,
+ 59, 278,
+ 64, 278,
+ 65, 278,
+ 66, 278,
+ 67, 278,
+ 68, 278,
+ 69, 278,
+ 70, 278,
+ 71, 278,
+ 72, 278,
+ 73, 278,
+ 74, 278,
+ 75, 278,
+ 76, 278,
+ 77, 278,
+ 81, 278,
+ 84, 278,
+ 85, 278,
+ 86, 278,
+ 88, 278,
+ 89, 278,
+ 90, 278,
+ 92, 278,
+ 95, 278,
+ 96, 278,
+ 97, 278,
+ 98, 278,
-2, 0,
- -1, 263,
- 9, 275,
- 12, 275,
- 13, 275,
- 18, 275,
- 19, 275,
- 25, 275,
- 41, 275,
- 49, 275,
- 50, 275,
- 53, 275,
- 59, 275,
- 64, 275,
- 65, 275,
- 66, 275,
- 67, 275,
- 68, 275,
- 69, 275,
- 70, 275,
- 71, 275,
- 72, 275,
- 73, 275,
- 74, 275,
- 75, 275,
- 76, 275,
- 77, 275,
- 81, 275,
- 84, 275,
- 85, 275,
- 86, 275,
- 88, 275,
- 89, 275,
- 90, 275,
- 92, 275,
- 95, 275,
- 96, 275,
- 97, 275,
- 98, 275,
+ -1, 269,
+ 9, 278,
+ 12, 278,
+ 13, 278,
+ 18, 278,
+ 19, 278,
+ 25, 278,
+ 41, 278,
+ 49, 278,
+ 50, 278,
+ 53, 278,
+ 59, 278,
+ 64, 278,
+ 65, 278,
+ 66, 278,
+ 67, 278,
+ 68, 278,
+ 69, 278,
+ 70, 278,
+ 71, 278,
+ 72, 278,
+ 73, 278,
+ 74, 278,
+ 75, 278,
+ 76, 278,
+ 77, 278,
+ 81, 278,
+ 84, 278,
+ 85, 278,
+ 86, 278,
+ 88, 278,
+ 89, 278,
+ 90, 278,
+ 92, 278,
+ 95, 278,
+ 96, 278,
+ 97, 278,
+ 98, 278,
-2, 0,
}
const yyPrivate = 57344
-const yyLast = 1241
+const yyLast = 1411
var yyAct = [...]int16{
- 61, 369, 194, 435, 357, 442, 437, 299, 251, 205,
- 98, 51, 149, 197, 73, 96, 235, 260, 375, 376,
- 134, 261, 68, 135, 133, 132, 449, 450, 451, 452,
- 418, 419, 198, 137, 136, 257, 258, 259, 262, 263,
- 165, 70, 126, 129, 131, 125, 432, 431, 397, 125,
- 348, 159, 236, 227, 237, 130, 128, 395, 395, 131,
- 127, 404, 464, 453, 421, 202, 457, 140, 420, 142,
- 6, 385, 103, 105, 106, 201, 107, 108, 109, 110,
- 111, 112, 113, 114, 115, 116, 117, 118, 138, 119,
- 120, 124, 104, 119, 239, 124, 46, 203, 436, 135,
- 126, 129, 151, 383, 382, 230, 238, 240, 229, 255,
- 136, 143, 370, 130, 128, 204, 380, 131, 127, 121,
- 123, 122, 190, 121, 123, 122, 207, 212, 213, 214,
- 215, 216, 217, 185, 379, 65, 189, 208, 208, 208,
- 208, 208, 208, 208, 186, 64, 378, 231, 209, 209,
- 209, 209, 209, 209, 209, 220, 223, 218, 208, 219,
- 347, 345, 145, 139, 65, 141, 351, 89, 241, 209,
- 243, 144, 426, 253, 64, 2, 3, 4, 5, 125,
- 349, 352, 291, 346, 344, 90, 249, 286, 247, 237,
- 202, 425, 254, 252, 290, 203, 443, 255, 281, 353,
- 201, 284, 289, 288, 287, 208, 103, 105, 137, 209,
- 286, 246, 245, 204, 160, 129, 209, 292, 293, 116,
- 117, 208, 203, 119, 120, 124, 104, 130, 128, 239,
- 146, 131, 209, 152, 226, 244, 222, 202, 91, 42,
- 204, 238, 240, 150, 151, 196, 343, 201, 7, 221,
- 415, 342, 202, 121, 123, 122, 100, 256, 414, 413,
- 371, 372, 201, 264, 265, 266, 267, 268, 269, 270,
- 271, 272, 273, 274, 275, 276, 277, 278, 279, 280,
- 373, 374, 377, 350, 203, 340, 381, 412, 99, 391,
- 384, 469, 158, 10, 390, 43, 207, 208, 97, 411,
- 339, 208, 204, 93, 202, 386, 242, 208, 209, 389,
- 468, 100, 209, 467, 201, 410, 471, 409, 209, 166,
- 167, 168, 169, 170, 171, 172, 173, 174, 175, 176,
- 177, 178, 179, 180, 181, 182, 203, 408, 199, 200,
- 470, 407, 393, 406, 405, 59, 296, 466, 403, 102,
- 295, 92, 1, 208, 204, 394, 396, 183, 398, 126,
- 129, 399, 400, 402, 209, 294, 126, 129, 152, 234,
- 401, 8, 130, 128, 233, 44, 131, 127, 150, 130,
- 128, 422, 416, 131, 127, 74, 148, 232, 388, 58,
- 99, 100, 208, 417, 155, 65, 57, 56, 428, 154,
- 97, 193, 55, 209, 430, 64, 434, 387, 95, 438,
- 439, 440, 153, 100, 424, 164, 445, 444, 447, 446,
- 455, 456, 157, 441, 156, 458, 54, 89, 69, 454,
- 53, 9, 9, 52, 302, 50, 208, 392, 459, 460,
- 429, 162, 224, 461, 315, 90, 463, 209, 126, 129,
- 321, 49, 163, 48, 427, 192, 191, 301, 465, 126,
- 129, 130, 128, 161, 47, 131, 127, 60, 250, 208,
- 472, 462, 130, 128, 354, 101, 131, 127, 248, 297,
- 209, 317, 318, 210, 211, 319, 94, 448, 195, 300,
- 62, 147, 0, 332, 0, 0, 303, 305, 307, 308,
- 309, 320, 322, 325, 326, 327, 328, 329, 333, 334,
- 0, 0, 304, 306, 310, 311, 312, 313, 314, 316,
- 323, 338, 337, 324, 302, 0, 423, 330, 331, 335,
- 336, 0, 228, 0, 315, 0, 0, 0, 0, 0,
- 321, 0, 0, 0, 298, 126, 129, 301, 0, 0,
- 0, 126, 129, 0, 0, 0, 0, 0, 130, 128,
- 0, 0, 131, 127, 130, 128, 0, 0, 131, 127,
- 0, 317, 318, 0, 0, 319, 0, 0, 0, 0,
- 0, 341, 0, 332, 0, 0, 303, 305, 307, 308,
- 309, 320, 322, 325, 326, 327, 328, 329, 333, 334,
- 0, 0, 304, 306, 310, 311, 312, 313, 314, 316,
- 323, 338, 337, 324, 0, 126, 129, 330, 331, 335,
- 336, 65, 0, 0, 63, 91, 0, 66, 130, 128,
- 25, 64, 131, 127, 225, 0, 0, 67, 0, 0,
+ 61, 377, 200, 445, 203, 447, 365, 307, 257, 211,
+ 452, 51, 101, 155, 74, 383, 99, 241, 428, 64,
+ 429, 396, 384, 134, 138, 71, 68, 136, 68, 204,
+ 171, 135, 199, 137, 199, 139, 67, 405, 67, 442,
+ 395, 459, 460, 461, 462, 73, 140, 266, 441, 68,
+ 359, 267, 128, 268, 269, 291, 407, 355, 92, 67,
+ 92, 263, 264, 265, 474, 360, 6, 356, 165, 208,
+ 148, 405, 150, 463, 68, 357, 93, 446, 93, 207,
+ 354, 92, 413, 361, 67, 431, 198, 197, 198, 197,
+ 209, 141, 142, 143, 145, 232, 122, 412, 127, 93,
+ 46, 209, 436, 430, 411, 348, 92, 157, 210, 198,
+ 197, 398, 138, 397, 216, 217, 216, 217, 151, 210,
+ 347, 435, 414, 139, 93, 196, 124, 126, 125, 213,
+ 218, 219, 220, 221, 222, 223, 191, 288, 289, 195,
+ 214, 214, 214, 214, 214, 214, 214, 201, 393, 391,
+ 192, 390, 261, 237, 215, 215, 215, 215, 215, 215,
+ 215, 226, 229, 224, 214, 147, 353, 149, 225, 212,
+ 259, 2, 3, 4, 5, 247, 68, 249, 215, 453,
+ 253, 68, 199, 228, 378, 132, 67, 94, 388, 352,
+ 387, 67, 190, 292, 251, 260, 227, 133, 131, 68,
+ 296, 134, 480, 252, 287, 199, 202, 290, 92, 67,
+ 476, 214, 386, 208, 298, 299, 292, 250, 215, 42,
+ 166, 129, 132, 207, 304, 215, 93, 214, 401, 129,
+ 132, 92, 479, 400, 133, 131, 198, 197, 134, 130,
+ 208, 215, 133, 131, 303, 209, 134, 130, 399, 93,
+ 207, 478, 157, 351, 477, 242, 297, 243, 295, 198,
+ 197, 294, 262, 210, 216, 217, 379, 380, 270, 271,
+ 272, 273, 274, 275, 276, 277, 278, 279, 280, 281,
+ 282, 283, 284, 285, 286, 385, 358, 193, 194, 381,
+ 382, 293, 389, 140, 152, 146, 392, 245, 144, 205,
+ 206, 7, 213, 214, 10, 243, 425, 214, 424, 244,
+ 246, 394, 255, 214, 96, 423, 208, 215, 422, 258,
+ 467, 215, 421, 261, 420, 419, 207, 215, 172, 173,
+ 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,
+ 184, 185, 186, 187, 188, 245, 434, 418, 209, 417,
+ 403, 416, 415, 164, 129, 132, 8, 244, 246, 439,
+ 44, 214, 404, 406, 158, 408, 210, 133, 131, 409,
+ 410, 134, 130, 208, 156, 215, 105, 43, 129, 132,
+ 129, 132, 350, 207, 302, 481, 1, 103, 301, 432,
+ 426, 133, 131, 133, 131, 134, 130, 134, 130, 189,
+ 214, 59, 75, 300, 427, 209, 58, 95, 438, 57,
+ 163, 240, 162, 440, 215, 102, 239, 433, 444, 448,
+ 449, 450, 161, 210, 451, 100, 455, 160, 457, 238,
+ 465, 466, 454, 248, 456, 468, 129, 132, 103, 464,
+ 159, 310, 56, 55, 402, 170, 214, 469, 470, 133,
+ 131, 323, 471, 134, 130, 54, 473, 329, 236, 72,
+ 215, 437, 9, 9, 309, 53, 52, 50, 475, 129,
+ 132, 168, 230, 49, 169, 48, 167, 129, 132, 214,
+ 482, 47, 133, 131, 60, 256, 134, 130, 325, 326,
+ 133, 131, 327, 215, 134, 130, 472, 362, 349, 104,
+ 340, 254, 305, 311, 313, 315, 316, 317, 328, 330,
+ 333, 334, 335, 336, 337, 341, 342, 97, 458, 312,
+ 314, 318, 319, 320, 321, 322, 324, 331, 346, 345,
+ 332, 310, 129, 132, 338, 339, 343, 344, 308, 62,
+ 153, 323, 0, 0, 0, 133, 131, 329, 364, 134,
+ 130, 306, 0, 0, 309, 363, 0, 0, 0, 367,
+ 368, 366, 373, 375, 372, 374, 369, 370, 371, 376,
+ 0, 0, 0, 0, 0, 0, 0, 0, 325, 326,
+ 0, 0, 327, 0, 0, 0, 0, 0, 0, 0,
+ 340, 0, 0, 311, 313, 315, 316, 317, 328, 330,
+ 333, 334, 335, 336, 337, 341, 342, 0, 0, 312,
+ 314, 318, 319, 320, 321, 322, 324, 331, 346, 345,
+ 332, 0, 0, 0, 338, 339, 343, 344, 68, 0,
+ 0, 63, 94, 0, 69, 443, 0, 25, 67, 0,
+ 0, 234, 0, 0, 70, 0, 367, 368, 366, 373,
+ 375, 372, 374, 369, 370, 371, 376, 158, 0, 0,
+ 92, 0, 0, 0, 0, 0, 0, 156, 21, 22,
+ 0, 0, 23, 0, 0, 154, 0, 0, 93, 0,
+ 103, 0, 0, 76, 77, 78, 79, 80, 81, 82,
+ 83, 84, 85, 86, 87, 88, 89, 0, 0, 0,
+ 13, 0, 102, 16, 17, 18, 0, 27, 41, 40,
+ 0, 33, 100, 0, 90, 91, 65, 66, 68, 0,
+ 98, 63, 94, 0, 69, 103, 0, 25, 67, 0,
+ 0, 233, 0, 0, 70, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 89, 0, 0, 0, 0, 0, 0,
- 0, 21, 22, 0, 0, 23, 0, 0, 0, 0,
- 0, 90, 0, 0, 0, 0, 75, 76, 77, 78,
- 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
- 0, 0, 0, 13, 0, 0, 16, 17, 18, 0,
- 27, 41, 40, 0, 33, 0, 0, 34, 35, 71,
- 72, 65, 45, 0, 63, 91, 0, 66, 356, 0,
- 25, 64, 0, 0, 0, 355, 0, 67, 0, 359,
- 360, 358, 365, 367, 364, 366, 361, 362, 363, 368,
- 0, 0, 0, 89, 0, 0, 0, 0, 0, 0,
- 0, 21, 22, 0, 0, 23, 0, 0, 0, 0,
- 0, 90, 0, 0, 0, 0, 75, 76, 77, 78,
- 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
- 0, 0, 0, 13, 0, 0, 16, 17, 18, 0,
- 27, 41, 40, 0, 33, 0, 0, 34, 35, 71,
- 72, 65, 0, 0, 63, 91, 0, 66, 433, 0,
- 25, 64, 0, 0, 0, 0, 0, 67, 0, 359,
- 360, 358, 365, 367, 364, 366, 361, 362, 363, 368,
- 0, 0, 0, 89, 0, 0, 206, 0, 0, 0,
- 0, 21, 22, 65, 0, 23, 0, 0, 0, 193,
- 0, 90, 0, 64, 0, 0, 75, 76, 77, 78,
- 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
- 0, 0, 0, 13, 0, 89, 16, 17, 18, 0,
- 27, 41, 40, 0, 33, 20, 91, 34, 35, 71,
- 72, 25, 0, 90, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 192, 191, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 184, 0, 0,
- 0, 0, 21, 22, 65, 0, 23, 0, 0, 0,
- 193, 210, 211, 0, 64, 0, 0, 11, 12, 14,
- 15, 19, 24, 26, 28, 29, 30, 31, 32, 36,
- 37, 0, 0, 0, 13, 0, 89, 16, 17, 18,
- 0, 27, 41, 40, 0, 33, 20, 42, 34, 35,
- 38, 39, 25, 0, 90, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 192, 191, 0, 0, 0, 0,
+ 92, 0, 0, 0, 0, 0, 0, 0, 21, 22,
+ 0, 0, 23, 0, 0, 0, 0, 0, 93, 0,
+ 0, 0, 0, 76, 77, 78, 79, 80, 81, 82,
+ 83, 84, 85, 86, 87, 88, 89, 0, 0, 0,
+ 13, 0, 0, 16, 17, 18, 0, 27, 41, 40,
+ 0, 33, 0, 0, 90, 91, 65, 66, 68, 0,
+ 0, 63, 94, 0, 69, 0, 0, 25, 67, 0,
+ 0, 231, 0, 0, 70, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 21, 22, 0, 0, 23, 0, 0,
- 0, 0, 187, 188, 0, 0, 0, 0, 11, 12,
- 14, 15, 19, 24, 26, 28, 29, 30, 31, 32,
- 36, 37, 125, 0, 0, 13, 0, 0, 16, 17,
- 18, 0, 27, 41, 40, 0, 33, 0, 0, 34,
- 35, 38, 39, 125, 0, 0, 0, 0, 0, 103,
- 105, 106, 0, 107, 108, 109, 110, 111, 112, 113,
- 114, 115, 116, 117, 118, 0, 119, 120, 124, 104,
- 103, 105, 106, 0, 107, 108, 109, 110, 111, 0,
- 113, 114, 115, 116, 117, 118, 0, 119, 120, 124,
- 104, 0, 0, 125, 0, 0, 121, 123, 122, 0,
- 65, 0, 0, 0, 0, 0, 193, 0, 125, 0,
- 64, 0, 0, 0, 0, 0, 0, 121, 123, 122,
- 103, 105, 106, 0, 107, 108, 109, 110, 0, 0,
- 113, 114, 89, 116, 117, 118, 105, 119, 120, 124,
- 104, 65, 0, 0, 0, 0, 0, 285, 116, 117,
- 90, 64, 119, 0, 124, 104, 0, 0, 0, 0,
- 192, 191, 0, 0, 0, 0, 0, 121, 123, 122,
- 0, 0, 0, 89, 0, 0, 0, 0, 0, 0,
- 0, 0, 121, 123, 122, 0, 0, 0, 210, 211,
- 0, 90, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 192, 191, 0, 0, 0, 0, 0, 0, 0,
+ 92, 0, 0, 0, 0, 0, 0, 0, 21, 22,
+ 0, 0, 23, 0, 0, 0, 0, 0, 93, 0,
+ 0, 0, 0, 76, 77, 78, 79, 80, 81, 82,
+ 83, 84, 85, 86, 87, 88, 89, 0, 0, 0,
+ 13, 0, 0, 16, 17, 18, 0, 27, 41, 40,
+ 0, 33, 0, 0, 90, 91, 65, 66, 68, 45,
+ 0, 63, 94, 0, 69, 0, 0, 25, 67, 0,
+ 0, 0, 0, 0, 70, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 282,
- 283,
+ 92, 0, 0, 0, 0, 0, 0, 0, 21, 22,
+ 0, 0, 23, 0, 0, 0, 0, 0, 93, 0,
+ 0, 0, 0, 76, 77, 78, 79, 80, 81, 82,
+ 83, 84, 85, 86, 87, 88, 89, 0, 0, 0,
+ 13, 0, 0, 16, 17, 18, 0, 27, 41, 40,
+ 0, 33, 0, 0, 90, 91, 65, 66, 68, 0,
+ 0, 63, 94, 0, 69, 0, 0, 25, 67, 0,
+ 0, 0, 0, 0, 70, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 92, 0, 0, 0, 0, 0, 0, 0, 21, 22,
+ 0, 0, 23, 0, 0, 0, 0, 0, 93, 0,
+ 0, 0, 128, 76, 77, 78, 79, 80, 81, 82,
+ 83, 84, 85, 86, 87, 88, 89, 0, 0, 0,
+ 13, 0, 0, 16, 17, 18, 0, 27, 41, 40,
+ 108, 33, 20, 94, 90, 91, 65, 66, 25, 0,
+ 0, 0, 119, 120, 0, 0, 122, 0, 127, 107,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,
+ 22, 0, 0, 23, 0, 0, 124, 126, 125, 0,
+ 0, 0, 0, 0, 11, 12, 14, 15, 19, 24,
+ 26, 28, 29, 30, 31, 32, 36, 37, 0, 0,
+ 0, 13, 0, 0, 16, 17, 18, 0, 27, 41,
+ 40, 0, 33, 20, 42, 34, 35, 38, 39, 25,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 21, 22, 0, 0, 23, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 11, 12, 14, 15, 19,
+ 24, 26, 28, 29, 30, 31, 32, 36, 37, 0,
+ 128, 0, 13, 0, 0, 16, 17, 18, 235, 27,
+ 41, 40, 0, 33, 0, 0, 34, 35, 38, 39,
+ 0, 128, 0, 0, 0, 0, 0, 106, 108, 109,
+ 0, 110, 111, 112, 113, 114, 115, 116, 117, 118,
+ 119, 120, 121, 0, 122, 123, 127, 107, 106, 108,
+ 109, 0, 110, 111, 112, 113, 114, 115, 116, 117,
+ 118, 119, 120, 121, 0, 122, 123, 127, 107, 0,
+ 0, 128, 0, 0, 124, 126, 125, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 128, 0, 0, 124, 126, 125, 106, 108,
+ 109, 0, 110, 111, 112, 113, 114, 0, 116, 117,
+ 118, 119, 120, 121, 128, 122, 123, 127, 107, 106,
+ 108, 109, 0, 110, 111, 112, 113, 0, 0, 116,
+ 117, 0, 119, 120, 121, 0, 122, 123, 127, 107,
+ 0, 106, 108, 0, 0, 124, 126, 125, 0, 0,
+ 0, 0, 0, 0, 119, 120, 0, 0, 122, 123,
+ 127, 107, 0, 0, 0, 0, 124, 126, 125, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 124, 126,
+ 125,
}
var yyPact = [...]int16{
- 68, 238, 954, 954, 702, 873, -1000, -1000, -1000, 226,
+ 64, 291, 1141, 1141, 889, 1060, -1000, -1000, -1000, 206,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
- -1000, -1000, 388, -1000, 347, -1000, 1018, -1000, -1000, -1000,
+ -1000, -1000, 700, -1000, 374, -1000, 1227, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
- -1000, 1, 18, 193, -1000, -1000, 792, -1000, 792, 225,
- -1000, 156, 147, 215, -1000, -1000, -1000, -1000, -1000, -1000,
+ -1000, 428, 31, 278, 278, 283, 280, -1000, -1000, 979,
+ -1000, 979, 174, -1000, 279, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
- -1000, 366, -1000, -1000, 392, -1000, -1000, 420, 288, -1000,
- -1000, 27, -1000, -40, -40, -40, -40, -40, -40, -40,
- -40, -40, -40, -40, -40, -40, -40, -40, -40, -40,
- -40, 915, -1000, -1000, 243, 834, 1101, 1101, 1101, 1101,
- 1101, 1101, 193, -58, -1000, 234, 234, 612, -1000, 31,
- 510, 35, -14, -1000, 86, 83, 1101, 367, -1000, -1000,
- 50, 185, -1000, -1000, 286, -1000, 210, -1000, 186, 181,
- 792, -1000, -49, -70, -44, -1000, 792, 792, 792, 792,
- 792, 792, 792, 792, 792, 792, 792, 792, 792, 792,
- 792, 792, 792, -1000, -1000, -1000, 1142, 189, 188, 187,
- 1, -1000, -1000, 1101, -1000, 167, -1000, -1000, -1000, -1000,
- -1000, -1000, -1000, 228, 228, 344, -1000, 1, -1000, 1101,
- 156, 147, 173, 173, -14, -14, -14, -14, -1000, -1000,
- -1000, 522, -1000, -1000, 278, -1000, 1018, -1000, -1000, -1000,
- -1000, 574, -1000, 231, -1000, 159, -1000, -1000, -1000, -1000,
- -1000, 158, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 24,
- 154, 140, -1000, -1000, -1000, 701, 1104, 97, 97, 97,
- 234, 234, 234, 234, 35, 35, 165, 165, 165, 165,
- 165, 1089, 1039, 165, 165, 1089, 35, 35, 165, 35,
- 1104, -1000, 131, 119, 101, 1101, -14, 82, 81, 1101,
- 510, 49, -1000, -1000, -1000, 386, -1000, 287, -1000, -1000,
+ -1000, -1000, -1000, -1000, 655, -1000, -1000, 420, -1000, -1000,
+ 408, 349, -1000, -1000, 44, -1000, -50, -50, -50, -50,
+ -50, -50, -50, -50, -50, -50, -50, -50, -50, -50,
+ -50, -50, -50, -50, 190, -1000, -1000, 204, 167, 17,
+ 17, 17, 17, 17, 17, 278, -57, -1000, 181, 181,
+ 799, -1000, -1000, -1000, 709, -1000, 619, 1206, 436, 38,
+ -35, -1000, 17, 409, -1000, -1000, 253, 301, -1000, -1000,
+ 413, -1000, 192, -1000, 178, 307, 979, -1000, -23, -40,
+ -29, -1000, 979, 979, 979, 979, 979, 979, 979, 979,
+ 979, 979, 979, 979, 979, 979, 979, 979, 979, -1000,
+ -1000, -1000, 40, 276, 246, 243, 428, -1000, -1000, 17,
+ -1000, 241, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 231,
+ 231, 382, -1000, 428, -1000, 17, 229, 209, 143, 143,
+ -35, -35, -35, -35, -1000, -1000, -1000, 529, -1000, -1000,
+ 98, -1000, 1227, -1000, -1000, -1000, -1000, 491, -1000, 362,
+ -1000, 164, -1000, -1000, -1000, -1000, -1000, 55, -1000, -1000,
+ -1000, -1000, -1000, -1000, -1000, 41, 49, 24, -1000, -1000,
+ -1000, 531, 1028, 169, 169, 169, 181, 181, 181, 181,
+ 38, 38, 1320, 1320, 1320, 1320, 1320, 1298, 1277, 1320,
+ 1320, 1298, 38, 38, 1320, 38, 1028, -1000, 197, 175,
+ 173, 17, -35, 129, 127, 17, 436, 126, -1000, -1000,
+ -1000, 19, -1000, 91, 89, 226, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
- -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
- 792, 1101, -1000, -1000, -1000, -1000, -1000, -1000, 38, 38,
- 22, 38, 93, 93, 346, 44, -1000, -1000, 338, 337,
- 335, 331, 311, 309, 293, 281, 253, 252, 244, -1000,
- 126, -56, -54, -1000, -1000, -1000, -1000, -1000, 46, 42,
- 1101, 504, -1000, -1000, 407, -1000, 170, -1000, -1000, -1000,
- 432, -1000, 1018, 418, -1000, -1000, -1000, 38, -1000, 21,
- 20, 791, -1000, -1000, -1000, 39, 56, 56, 56, 228,
- 182, 182, 39, 182, 39, -75, 41, 155, 97, 97,
- -1000, -1000, 59, -1000, 1101, -1000, -1000, -1000, -1000, -1000,
- -1000, 38, 38, -1000, -1000, -1000, 38, -1000, -1000, -1000,
- -1000, -1000, -1000, 56, -1000, -1000, -1000, -1000, -1000, -1000,
- -1000, -1000, -1000, -1000, 40, -1000, -1000, 1101, 325, -1000,
- -1000, -1000, 289, -1000, -1000, 318, -1000, 295, -1000, -1000,
+ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 979, 17,
+ -1000, -1000, -1000, -1000, -1000, -1000, 52, 52, 30, 52,
+ 136, 136, 80, 105, -1000, -1000, 346, 345, 343, 341,
+ 319, 318, 316, 312, 309, 302, 300, -1000, 65, -68,
+ -65, -1000, -1000, -1000, -1000, -1000, 81, 63, 17, 395,
+ -1000, -1000, 339, -1000, 100, -1000, -1000, -1000, -1000, -1000,
+ 439, -1000, 1227, 337, -1000, -1000, -1000, 52, -1000, 22,
+ 13, 618, -1000, -1000, -1000, 18, 60, 60, 60, 231,
+ 165, 165, 18, 165, 18, -60, 51, 172, 169, 169,
+ -1000, -1000, 313, -1000, 17, -1000, -1000, -1000, -1000, -1000,
+ -1000, 52, 52, -1000, -1000, -1000, 52, -1000, -1000, -1000,
+ -1000, -1000, -1000, 60, -1000, -1000, -1000, -1000, -1000, -1000,
+ -1000, -1000, -1000, -1000, 42, -1000, -1000, 17, 188, -1000,
+ -1000, -1000, 230, -1000, -1000, 180, -1000, 364, -1000, -1000,
-1000, -1000, -1000,
}
var yyPgo = [...]int16{
- 0, 491, 12, 490, 7, 16, 489, 428, 22, 488,
- 10, 487, 14, 293, 371, 486, 15, 479, 19, 18,
- 478, 475, 8, 474, 4, 5, 471, 3, 6, 13,
- 468, 32, 2, 467, 464, 25, 214, 463, 453, 452,
- 96, 451, 442, 24, 441, 1, 41, 435, 11, 433,
- 430, 426, 415, 402, 397, 396, 389, 345, 0, 385,
- 9, 357, 352, 295,
+ 0, 540, 13, 539, 7, 17, 538, 459, 25, 19,
+ 12, 518, 14, 304, 356, 517, 16, 502, 22, 15,
+ 501, 499, 8, 497, 6, 10, 496, 3, 5, 4,
+ 485, 29, 2, 484, 481, 31, 220, 476, 475, 474,
+ 95, 473, 472, 27, 471, 1, 45, 467, 11, 466,
+ 465, 455, 445, 443, 442, 409, 406, 401, 0, 402,
+ 9, 399, 386, 377,
}
var yyR1 = [...]int8{
@@ -645,30 +669,30 @@ var yyR1 = [...]int8{
38, 38, 38, 38, 38, 38, 38, 36, 39, 39,
52, 52, 44, 44, 44, 44, 37, 37, 37, 37,
37, 37, 18, 18, 18, 18, 17, 17, 17, 4,
- 4, 4, 45, 45, 41, 43, 43, 42, 42, 42,
- 53, 60, 49, 49, 50, 51, 33, 33, 33, 9,
- 9, 47, 55, 55, 55, 55, 55, 55, 56, 57,
- 57, 57, 46, 46, 46, 1, 1, 1, 2, 2,
- 2, 2, 2, 2, 2, 14, 14, 7, 7, 7,
+ 4, 4, 45, 45, 41, 41, 41, 41, 43, 43,
+ 42, 42, 42, 53, 60, 49, 49, 50, 51, 33,
+ 33, 33, 9, 9, 47, 55, 55, 55, 55, 55,
+ 55, 56, 57, 57, 57, 46, 46, 46, 1, 1,
+ 1, 2, 2, 2, 2, 2, 2, 2, 14, 14,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 13, 13,
- 13, 13, 15, 15, 15, 16, 16, 16, 16, 16,
- 16, 16, 63, 21, 21, 21, 21, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 30, 30, 30, 22,
- 22, 22, 22, 23, 23, 23, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 25, 25, 26,
- 26, 26, 11, 11, 11, 11, 3, 3, 3, 3,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 13, 13, 13, 13, 15, 15, 15, 16, 16,
+ 16, 16, 16, 16, 16, 63, 21, 21, 21, 21,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 30,
+ 30, 30, 22, 22, 22, 22, 23, 23, 23, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 25, 25, 26, 26, 26, 11, 11, 11, 11, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 8, 8, 5, 5,
- 5, 5, 48, 48, 29, 29, 31, 31, 32, 32,
- 28, 27, 27, 54, 10, 19, 19, 61, 61, 61,
- 61, 61, 61, 61, 61, 61, 61, 12, 12, 58,
- 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
- 58, 59,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 8,
+ 8, 5, 5, 5, 5, 48, 48, 29, 29, 31,
+ 31, 32, 32, 28, 27, 27, 54, 10, 19, 19,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 12, 12, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 59,
}
var yyR2 = [...]int8{
@@ -679,30 +703,30 @@ var yyR2 = [...]int8{
4, 4, 4, 4, 4, 4, 4, 1, 0, 1,
3, 3, 1, 1, 3, 3, 1, 3, 3, 3,
5, 5, 3, 4, 2, 1, 3, 1, 2, 1,
- 1, 1, 3, 4, 2, 3, 2, 3, 1, 2,
- 3, 1, 3, 3, 2, 2, 3, 5, 3, 1,
- 1, 4, 6, 5, 6, 5, 4, 3, 2, 2,
- 1, 1, 3, 4, 2, 3, 1, 2, 3, 3,
- 1, 3, 3, 2, 1, 2, 1, 1, 1, 1,
+ 1, 1, 3, 4, 2, 2, 2, 2, 3, 2,
+ 3, 1, 2, 3, 1, 3, 3, 2, 2, 3,
+ 5, 3, 1, 1, 4, 6, 5, 6, 5, 4,
+ 3, 2, 2, 1, 1, 3, 4, 2, 3, 1,
+ 2, 3, 3, 1, 3, 3, 2, 1, 2, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 3, 4,
- 2, 0, 3, 1, 2, 3, 3, 1, 3, 3,
- 2, 1, 2, 0, 3, 2, 1, 1, 3, 1,
- 3, 4, 1, 3, 5, 5, 1, 1, 1, 4,
- 3, 3, 2, 3, 1, 2, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 4, 3, 3,
- 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 3, 4, 2, 0, 3, 1, 2, 3, 3,
+ 1, 3, 3, 2, 1, 2, 0, 3, 2, 1,
+ 1, 3, 1, 3, 4, 1, 3, 5, 5, 1,
+ 1, 1, 4, 3, 3, 2, 3, 1, 2, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 3, 3, 1, 2, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 2, 2, 1, 1,
- 1, 2, 1, 1, 1, 0, 1, 1, 2, 3,
- 3, 4, 4, 6, 7, 4, 1, 1, 1, 1,
- 2, 3, 3, 3, 3, 3, 3, 3, 3, 6,
- 1, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+ 2, 1, 1, 1, 2, 1, 1, 1, 0, 1,
+ 1, 2, 3, 3, 4, 4, 6, 7, 4, 1,
+ 1, 1, 1, 2, 3, 3, 3, 3, 3, 3,
+ 3, 3, 6, 1, 3,
}
var yyChk = [...]int16{
@@ -712,39 +736,40 @@ var yyChk = [...]int16{
73, 74, 75, 92, 95, 96, 76, 77, 97, 98,
90, 89, 13, -63, -14, 10, -40, -34, -38, -41,
-47, -48, -49, -50, -51, -53, -54, -55, -56, -57,
- -33, -58, -3, 12, 19, 9, 15, 25, -8, -7,
- -46, 97, 98, -12, -59, 64, 65, 66, 67, 68,
- 69, 70, 71, 72, 73, 74, 75, 76, 77, 41,
- 59, 13, -57, -13, -15, 20, -16, 12, -10, 2,
- 25, -21, 2, 41, 61, 42, 43, 45, 46, 47,
- 48, 49, 50, 51, 52, 53, 54, 55, 56, 58,
- 59, 88, 90, 89, 60, 14, 41, 59, 55, 42,
- 54, 58, -35, -43, 2, 81, 92, 15, -43, -40,
- -58, -40, -58, -46, 15, 15, 15, -1, 20, -2,
- 12, -10, 2, 20, 7, 2, 4, 2, 4, 24,
- -36, -37, -44, -39, -52, 80, -36, -36, -36, -36,
- -36, -36, -36, -36, -36, -36, -36, -36, -36, -36,
- -36, -36, -36, -61, 2, -48, -8, 97, 98, -12,
- -58, 70, 69, 15, -32, -9, 2, -29, -31, 95,
- 96, 19, 9, 41, 59, -60, 2, -58, -48, -8,
- 97, 98, -58, -58, -58, -58, -58, -58, -43, -35,
- -18, 15, 2, -18, -42, 22, -40, 22, 22, 22,
- 22, -58, 20, 7, 2, -5, 2, 4, 56, 44,
- 57, -5, 20, -16, 25, 2, 25, 2, -20, 5,
- -30, -22, 12, -29, -31, 16, -40, 84, 85, 86,
- 87, 91, 82, 83, -40, -40, -40, -40, -40, -40,
+ -33, -58, -3, 12, -9, 97, 98, 19, 9, 15,
+ 25, -8, -7, -46, -12, -59, 64, 65, 66, 67,
+ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ 95, 96, 41, 59, 13, -57, -13, -15, 20, -16,
+ 12, -10, 2, 25, -21, 2, 41, 61, 42, 43,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, 58, 59, 88, 90, 89, 60, 14, 41,
+ 59, 55, 42, 54, 58, -35, -43, 2, 81, 92,
+ 15, -43, -43, -43, 15, -43, 15, -40, -58, -40,
+ -58, -46, 15, -1, 20, -2, 12, -10, 2, 20,
+ 7, 2, 4, 2, 4, 24, -36, -37, -44, -39,
+ -52, 80, -36, -36, -36, -36, -36, -36, -36, -36,
+ -36, -36, -36, -36, -36, -36, -36, -36, -36, -61,
+ 2, -48, -8, 97, 98, -12, -58, 70, 69, 15,
+ -32, -9, 2, -29, -31, 95, 96, 19, 9, 41,
+ 59, -60, 2, -58, -48, -8, 97, 98, -58, -58,
+ -58, -58, -58, -58, -43, -35, -18, 15, 2, -18,
+ -42, 22, -40, 22, 22, 22, 22, -58, 20, 7,
+ 2, -5, 2, 4, 56, 44, 57, -5, 20, -16,
+ 25, 2, 25, 2, -20, 5, -30, -22, 12, -29,
+ -31, 16, -40, 84, 85, 86, 87, 91, 82, 83,
-40, -40, -40, -40, -40, -40, -40, -40, -40, -40,
- -40, -48, 97, 98, -12, 15, -58, 15, 15, 15,
- -58, 15, -29, -29, 21, 6, 2, -17, 22, -4,
- -6, 25, 2, 64, 80, 65, 81, 66, 67, 68,
- 82, 83, 84, 85, 86, 12, 87, 49, 50, 53,
- 69, 18, 70, 88, 91, 71, 72, 73, 74, 75,
- 95, 96, 61, 76, 77, 97, 98, 90, 89, 22,
- 7, 7, 20, -2, 25, 2, 25, 2, 26, 26,
- -31, 26, 41, 59, -23, 24, 17, -24, 30, 28,
- 29, 35, 36, 37, 33, 31, 34, 32, 38, -45,
- 15, -45, -45, -18, -18, -19, -18, -19, 15, 15,
- 15, -58, 22, 22, -58, 22, -60, 21, 2, 22,
+ -40, -40, -40, -40, -40, -40, -40, -48, 97, 98,
+ -12, 15, -58, 15, 15, 15, -58, 15, -29, -29,
+ 21, 6, 2, 15, 15, -17, 22, -4, -6, 25,
+ 2, 64, 80, 65, 81, 66, 67, 68, 82, 83,
+ 84, 85, 86, 12, 87, 49, 50, 53, 69, 18,
+ 70, 88, 91, 71, 72, 73, 74, 75, 95, 96,
+ 61, 76, 77, 97, 98, 90, 89, 22, 7, 7,
+ 20, -2, 25, 2, 25, 2, 26, 26, -31, 26,
+ 41, 59, -23, 24, 17, -24, 30, 28, 29, 35,
+ 36, 37, 33, 31, 34, 32, 38, -45, 15, -45,
+ -45, -18, -18, -19, -18, -19, 15, 15, 15, -58,
+ 22, 22, -58, 22, -60, 21, 2, 22, 22, 22,
7, 2, -40, -58, -28, 19, -28, 26, -28, -22,
-22, 24, 17, 2, 17, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, -48, -8, 86, 85,
@@ -757,54 +782,55 @@ var yyChk = [...]int16{
}
var yyDef = [...]int16{
- 0, -2, 151, 151, 0, 0, 7, 6, 1, 151,
- 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
- 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
- 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,
- 146, 147, 0, 2, -2, 3, 4, 8, 9, 10,
+ 0, -2, 154, 154, 0, 0, 7, 6, 1, 154,
+ 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, 132, 133, 134, 135, 136, 137, 138,
+ 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,
+ 149, 150, 0, 2, -2, 3, 4, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
- 21, 22, 0, 126, 262, 263, 0, 273, 0, 100,
- 101, 144, 145, 0, 300, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, 256,
- 257, 0, 5, 115, 0, 150, 153, 0, 157, 161,
- 274, 162, 166, 48, 48, 48, 48, 48, 48, 48,
+ 21, 22, 0, 129, 0, 147, 148, 265, 266, 0,
+ 276, 0, 103, 104, 0, 303, -2, -2, -2, -2,
+ -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+ -2, -2, 259, 260, 0, 5, 118, 0, 153, 156,
+ 0, 160, 164, 277, 165, 169, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 0, 84, 85, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 25, 26, 0, 0, 0, 74, 0,
- 22, 98, -2, 99, 0, 0, 0, 0, 104, 106,
- 0, 110, 114, 148, 0, 154, 0, 160, 0, 165,
- 0, 47, 56, 52, 53, 49, 0, 0, 0, 0,
+ 48, 48, 48, 48, 0, 87, 88, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 25, 26, 0, 0,
+ 0, 74, 75, 76, 0, 77, 0, 0, 22, 101,
+ -2, 102, 0, 0, 107, 109, 0, 113, 117, 151,
+ 0, 157, 0, 163, 0, 168, 0, 47, 56, 52,
+ 53, 49, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 85,
+ 86, 280, 0, 0, 0, 0, 289, 290, 291, 0,
+ 89, 0, 91, 271, 272, 92, 93, 267, 268, 0,
+ 0, 0, 100, 84, 292, 0, 0, 0, 294, 295,
+ 296, 297, 298, 299, 23, 24, 27, 0, 65, 28,
+ 0, 79, 81, 79, 79, 83, 304, 0, 105, 0,
+ 110, 0, 116, 261, 262, 263, 264, 0, 152, 155,
+ 158, 161, 159, 162, 167, 170, 172, 175, 179, 180,
+ 181, 0, 29, 0, 0, 0, 0, 0, -2, -2,
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 281, 0, 0,
+ 0, 0, 293, 0, 0, 0, 0, 0, 269, 270,
+ 94, 0, 99, 0, 0, 0, 64, 67, 69, 70,
+ 71, 223, 224, 225, 226, 227, 228, 229, 230, 231,
+ 232, 233, 234, 235, 236, 237, 238, 239, 240, 241,
+ 242, 243, 244, 245, 246, 247, 248, 249, 250, 251,
+ 252, 253, 254, 255, 256, 257, 258, 78, 82, 0,
+ 106, 108, 111, 115, 112, 114, 0, 0, 0, 0,
+ 0, 0, 0, 0, 185, 187, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 57, 0, 58,
+ 59, 50, 51, 54, 279, 55, 0, 0, 0, 0,
+ 282, 283, 0, 90, 0, 96, 98, 300, 301, 62,
+ 0, 68, 80, 0, 171, 273, 173, 0, 176, 0,
+ 0, 0, 183, 188, 184, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 82, 83, 277, 0, 0, 0, 0,
- 286, 287, 288, 0, 86, 0, 88, 268, 269, 89,
- 90, 264, 265, 0, 0, 0, 97, 81, 289, 0,
- 0, 0, 291, 292, 293, 294, 295, 296, 23, 24,
- 27, 0, 65, 28, 0, 76, 78, 80, 301, 297,
- 298, 0, 102, 0, 107, 0, 113, 258, 259, 260,
- 261, 0, 149, 152, 155, 158, 156, 159, 164, 167,
- 169, 172, 176, 177, 178, 0, 29, 0, 0, 0,
- 0, 0, -2, -2, 30, 31, 32, 33, 34, 35,
- 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
- 46, 278, 0, 0, 0, 0, 290, 0, 0, 0,
- 0, 0, 266, 267, 91, 0, 96, 0, 64, 67,
- 69, 70, 71, 220, 221, 222, 223, 224, 225, 226,
- 227, 228, 229, 230, 231, 232, 233, 234, 235, 236,
- 237, 238, 239, 240, 241, 242, 243, 244, 245, 246,
- 247, 248, 249, 250, 251, 252, 253, 254, 255, 75,
- 79, 0, 103, 105, 108, 112, 109, 111, 0, 0,
- 0, 0, 0, 0, 0, 0, 182, 184, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 57,
- 0, 58, 59, 50, 51, 54, 276, 55, 0, 0,
- 0, 0, 279, 280, 0, 87, 0, 93, 95, 62,
- 0, 68, 77, 0, 168, 270, 170, 0, 173, 0,
- 0, 0, 180, 185, 181, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 281, 282, 0, 285, 0, 92, 94, 63, 66, 299,
- 171, 0, 0, 179, 183, 186, 0, 272, 187, 188,
- 189, 190, 191, 0, 192, 193, 194, 195, 196, 202,
- 203, 204, 205, 72, 0, 60, 61, 0, 0, 174,
- 175, 271, 0, 200, 73, 0, 283, 0, 198, 201,
- 284, 197, 199,
+ 284, 285, 0, 288, 0, 95, 97, 63, 66, 302,
+ 174, 0, 0, 182, 186, 189, 0, 275, 190, 191,
+ 192, 193, 194, 0, 195, 196, 197, 198, 199, 205,
+ 206, 207, 208, 72, 0, 60, 61, 0, 0, 177,
+ 178, 274, 0, 203, 73, 0, 286, 0, 201, 204,
+ 287, 200, 202,
}
var yyTok1 = [...]int8{
@@ -1493,37 +1519,94 @@ yydefault:
}
}
case 75:
- yyDollar = yyS[yypt-3 : yypt+1]
+ yyDollar = yyS[yypt-2 : yypt+1]
{
- yyVAL.node = yyDollar[2].node
+ fn, exist := getFunction(yyDollar[1].item.Val, yylex.(*parser).functions)
+ if !exist {
+ yylex.(*parser).addParseErrf(yyDollar[1].item.PositionRange(), "unknown function with name %q", yyDollar[1].item.Val)
+ }
+ if fn != nil && fn.Experimental && !yylex.(*parser).options.EnableExperimentalFunctions {
+ yylex.(*parser).addParseErrf(yyDollar[1].item.PositionRange(), "function %q is not enabled", yyDollar[1].item.Val)
+ }
+ yyVAL.node = &Call{
+ Func: fn,
+ Args: yyDollar[2].node.(Expressions),
+ PosRange: posrange.PositionRange{
+ Start: yyDollar[1].item.PositionRange().Start,
+ End: yylex.(*parser).lastClosing,
+ },
+ }
}
case 76:
yyDollar = yyS[yypt-2 : yypt+1]
{
- yyVAL.node = Expressions{}
+ fn, exist := getFunction(yyDollar[1].item.Val, yylex.(*parser).functions)
+ if !exist {
+ yylex.(*parser).addParseErrf(yyDollar[1].item.PositionRange(), "unknown function with name %q", yyDollar[1].item.Val)
+ }
+ if fn != nil && fn.Experimental && !yylex.(*parser).options.EnableExperimentalFunctions {
+ yylex.(*parser).addParseErrf(yyDollar[1].item.PositionRange(), "function %q is not enabled", yyDollar[1].item.Val)
+ }
+ yyVAL.node = &Call{
+ Func: fn,
+ Args: yyDollar[2].node.(Expressions),
+ PosRange: posrange.PositionRange{
+ Start: yyDollar[1].item.PositionRange().Start,
+ End: yylex.(*parser).lastClosing,
+ },
+ }
}
case 77:
+ yyDollar = yyS[yypt-2 : yypt+1]
+ {
+ fn, exist := getFunction(yyDollar[1].item.Val, yylex.(*parser).functions)
+ if !exist {
+ yylex.(*parser).addParseErrf(yyDollar[1].item.PositionRange(), "unknown function with name %q", yyDollar[1].item.Val)
+ }
+ if fn != nil && fn.Experimental && !yylex.(*parser).options.EnableExperimentalFunctions {
+ yylex.(*parser).addParseErrf(yyDollar[1].item.PositionRange(), "function %q is not enabled", yyDollar[1].item.Val)
+ }
+ yyVAL.node = &Call{
+ Func: fn,
+ Args: yyDollar[2].node.(Expressions),
+ PosRange: posrange.PositionRange{
+ Start: yyDollar[1].item.PositionRange().Start,
+ End: yylex.(*parser).lastClosing,
+ },
+ }
+ }
+ case 78:
+ yyDollar = yyS[yypt-3 : yypt+1]
+ {
+ yyVAL.node = yyDollar[2].node
+ }
+ case 79:
+ yyDollar = yyS[yypt-2 : yypt+1]
+ {
+ yyVAL.node = Expressions{}
+ }
+ case 80:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.node = append(yyDollar[1].node.(Expressions), yyDollar[3].node.(Expr))
}
- case 78:
+ case 81:
yyDollar = yyS[yypt-1 : yypt+1]
{
yyVAL.node = Expressions{yyDollar[1].node.(Expr)}
}
- case 79:
+ case 82:
yyDollar = yyS[yypt-2 : yypt+1]
{
yylex.(*parser).addParseErrf(yyDollar[2].item.PositionRange(), "trailing commas not allowed in function call args")
yyVAL.node = yyDollar[1].node
}
- case 80:
+ case 83:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.node = &ParenExpr{Expr: yyDollar[2].node.(Expr), PosRange: mergeRanges(&yyDollar[1].item, &yyDollar[3].item)}
}
- case 81:
+ case 84:
yyDollar = yyS[yypt-1 : yypt+1]
{
if numLit, ok := yyDollar[1].node.(*NumberLiteral); ok {
@@ -1537,7 +1620,7 @@ yydefault:
}
yyVAL.node = yyDollar[1].node
}
- case 82:
+ case 85:
yyDollar = yyS[yypt-3 : yypt+1]
{
if numLit, ok := yyDollar[3].node.(*NumberLiteral); ok {
@@ -1548,41 +1631,41 @@ yydefault:
yylex.(*parser).addOffsetExpr(yyDollar[1].node, yyDollar[3].node.(*DurationExpr))
yyVAL.node = yyDollar[1].node
}
- case 83:
+ case 86:
yyDollar = yyS[yypt-3 : yypt+1]
{
yylex.(*parser).unexpected("offset", "number, duration, step(), or range()")
yyVAL.node = yyDollar[1].node
}
- case 84:
+ case 87:
yyDollar = yyS[yypt-2 : yypt+1]
{
yylex.(*parser).setAnchored(yyDollar[1].node)
}
- case 85:
+ case 88:
yyDollar = yyS[yypt-2 : yypt+1]
{
yylex.(*parser).setSmoothed(yyDollar[1].node)
}
- case 86:
+ case 89:
yyDollar = yyS[yypt-3 : yypt+1]
{
yylex.(*parser).setTimestamp(yyDollar[1].node, yyDollar[3].float)
yyVAL.node = yyDollar[1].node
}
- case 87:
+ case 90:
yyDollar = yyS[yypt-5 : yypt+1]
{
yylex.(*parser).setAtModifierPreprocessor(yyDollar[1].node, yyDollar[3].item)
yyVAL.node = yyDollar[1].node
}
- case 88:
+ case 91:
yyDollar = yyS[yypt-3 : yypt+1]
{
yylex.(*parser).unexpected("@", "timestamp")
yyVAL.node = yyDollar[1].node
}
- case 91:
+ case 94:
yyDollar = yyS[yypt-4 : yypt+1]
{
var errMsg string
@@ -1612,7 +1695,7 @@ yydefault:
EndPos: yylex.(*parser).lastClosing,
}
}
- case 92:
+ case 95:
yyDollar = yyS[yypt-6 : yypt+1]
{
var rangeNl time.Duration
@@ -1634,7 +1717,7 @@ yydefault:
EndPos: yyDollar[6].item.Pos + 1,
}
}
- case 93:
+ case 96:
yyDollar = yyS[yypt-5 : yypt+1]
{
var rangeNl time.Duration
@@ -1649,31 +1732,31 @@ yydefault:
EndPos: yyDollar[5].item.Pos + 1,
}
}
- case 94:
+ case 97:
yyDollar = yyS[yypt-6 : yypt+1]
{
yylex.(*parser).unexpected("subquery selector", "\"]\"")
yyVAL.node = yyDollar[1].node
}
- case 95:
+ case 98:
yyDollar = yyS[yypt-5 : yypt+1]
{
yylex.(*parser).unexpected("subquery selector", "number, duration, step(), range(), or \"]\"")
yyVAL.node = yyDollar[1].node
}
- case 96:
+ case 99:
yyDollar = yyS[yypt-4 : yypt+1]
{
yylex.(*parser).unexpected("subquery or range", "\":\" or \"]\"")
yyVAL.node = yyDollar[1].node
}
- case 97:
+ case 100:
yyDollar = yyS[yypt-3 : yypt+1]
{
yylex.(*parser).unexpected("subquery or range selector", "number, duration, step(), or range()")
yyVAL.node = yyDollar[1].node
}
- case 98:
+ case 101:
yyDollar = yyS[yypt-2 : yypt+1]
{
if nl, ok := yyDollar[2].node.(*NumberLiteral); ok {
@@ -1686,7 +1769,7 @@ yydefault:
yyVAL.node = &UnaryExpr{Op: yyDollar[1].item.Typ, Expr: yyDollar[2].node.(Expr), StartPos: yyDollar[1].item.Pos}
}
}
- case 99:
+ case 102:
yyDollar = yyS[yypt-2 : yypt+1]
{
vs := yyDollar[2].node.(*VectorSelector)
@@ -1695,7 +1778,7 @@ yydefault:
yylex.(*parser).assembleVectorSelector(vs)
yyVAL.node = vs
}
- case 100:
+ case 103:
yyDollar = yyS[yypt-1 : yypt+1]
{
vs := &VectorSelector{
@@ -1706,14 +1789,14 @@ yydefault:
yylex.(*parser).assembleVectorSelector(vs)
yyVAL.node = vs
}
- case 101:
+ case 104:
yyDollar = yyS[yypt-1 : yypt+1]
{
vs := yyDollar[1].node.(*VectorSelector)
yylex.(*parser).assembleVectorSelector(vs)
yyVAL.node = vs
}
- case 102:
+ case 105:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.node = &VectorSelector{
@@ -1721,7 +1804,7 @@ yydefault:
PosRange: mergeRanges(&yyDollar[1].item, &yyDollar[3].item),
}
}
- case 103:
+ case 106:
yyDollar = yyS[yypt-4 : yypt+1]
{
yyVAL.node = &VectorSelector{
@@ -1729,7 +1812,7 @@ yydefault:
PosRange: mergeRanges(&yyDollar[1].item, &yyDollar[4].item),
}
}
- case 104:
+ case 107:
yyDollar = yyS[yypt-2 : yypt+1]
{
yyVAL.node = &VectorSelector{
@@ -1737,7 +1820,7 @@ yydefault:
PosRange: mergeRanges(&yyDollar[1].item, &yyDollar[2].item),
}
}
- case 105:
+ case 108:
yyDollar = yyS[yypt-3 : yypt+1]
{
if yyDollar[1].matchers != nil {
@@ -1746,144 +1829,144 @@ yydefault:
yyVAL.matchers = yyDollar[1].matchers
}
}
- case 106:
+ case 109:
yyDollar = yyS[yypt-1 : yypt+1]
{
yyVAL.matchers = []*labels.Matcher{yyDollar[1].matcher}
}
- case 107:
+ case 110:
yyDollar = yyS[yypt-2 : yypt+1]
{
yylex.(*parser).unexpected("label matching", "\",\" or \"}\"")
yyVAL.matchers = yyDollar[1].matchers
}
- case 108:
- yyDollar = yyS[yypt-3 : yypt+1]
- {
- yyVAL.matcher = yylex.(*parser).newLabelMatcher(yyDollar[1].item, yyDollar[2].item, yyDollar[3].item)
- }
- case 109:
- yyDollar = yyS[yypt-3 : yypt+1]
- {
- yyVAL.matcher = yylex.(*parser).newLabelMatcher(yyDollar[1].item, yyDollar[2].item, yyDollar[3].item)
- }
- case 110:
- yyDollar = yyS[yypt-1 : yypt+1]
- {
- yyVAL.matcher = yylex.(*parser).newMetricNameMatcher(yyDollar[1].item)
- }
case 111:
yyDollar = yyS[yypt-3 : yypt+1]
{
- yylex.(*parser).unexpected("label matching", "string")
- yyVAL.matcher = nil
+ yyVAL.matcher = yylex.(*parser).newLabelMatcher(yyDollar[1].item, yyDollar[2].item, yyDollar[3].item)
}
case 112:
+ yyDollar = yyS[yypt-3 : yypt+1]
+ {
+ yyVAL.matcher = yylex.(*parser).newLabelMatcher(yyDollar[1].item, yyDollar[2].item, yyDollar[3].item)
+ }
+ case 113:
+ yyDollar = yyS[yypt-1 : yypt+1]
+ {
+ yyVAL.matcher = yylex.(*parser).newMetricNameMatcher(yyDollar[1].item)
+ }
+ case 114:
yyDollar = yyS[yypt-3 : yypt+1]
{
yylex.(*parser).unexpected("label matching", "string")
yyVAL.matcher = nil
}
- case 113:
+ case 115:
+ yyDollar = yyS[yypt-3 : yypt+1]
+ {
+ yylex.(*parser).unexpected("label matching", "string")
+ yyVAL.matcher = nil
+ }
+ case 116:
yyDollar = yyS[yypt-2 : yypt+1]
{
yylex.(*parser).unexpected("label matching", "label matching operator")
yyVAL.matcher = nil
}
- case 114:
+ case 117:
yyDollar = yyS[yypt-1 : yypt+1]
{
yylex.(*parser).unexpected("label matching", "identifier or \"}\"")
yyVAL.matcher = nil
}
- case 115:
+ case 118:
yyDollar = yyS[yypt-2 : yypt+1]
{
b := labels.NewBuilder(yyDollar[2].labels)
b.Set(labels.MetricName, yyDollar[1].item.Val)
yyVAL.labels = b.Labels()
}
- case 116:
+ case 119:
yyDollar = yyS[yypt-1 : yypt+1]
{
yyVAL.labels = yyDollar[1].labels
}
- case 148:
+ case 151:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.labels = labels.New(yyDollar[2].lblList...)
}
- case 149:
+ case 152:
yyDollar = yyS[yypt-4 : yypt+1]
{
yyVAL.labels = labels.New(yyDollar[2].lblList...)
}
- case 150:
+ case 153:
yyDollar = yyS[yypt-2 : yypt+1]
{
yyVAL.labels = labels.New()
}
- case 151:
+ case 154:
yyDollar = yyS[yypt-0 : yypt+1]
{
yyVAL.labels = labels.New()
}
- case 152:
+ case 155:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.lblList = append(yyDollar[1].lblList, yyDollar[3].label)
}
- case 153:
+ case 156:
yyDollar = yyS[yypt-1 : yypt+1]
{
yyVAL.lblList = []labels.Label{yyDollar[1].label}
}
- case 154:
+ case 157:
yyDollar = yyS[yypt-2 : yypt+1]
{
yylex.(*parser).unexpected("label set", "\",\" or \"}\"")
yyVAL.lblList = yyDollar[1].lblList
}
- case 155:
- yyDollar = yyS[yypt-3 : yypt+1]
- {
- yyVAL.label = labels.Label{Name: yyDollar[1].item.Val, Value: yylex.(*parser).unquoteString(yyDollar[3].item.Val)}
- }
- case 156:
- yyDollar = yyS[yypt-3 : yypt+1]
- {
- yyVAL.label = labels.Label{Name: yyDollar[1].item.Val, Value: yylex.(*parser).unquoteString(yyDollar[3].item.Val)}
- }
- case 157:
- yyDollar = yyS[yypt-1 : yypt+1]
- {
- yyVAL.label = labels.Label{Name: labels.MetricName, Value: yyDollar[1].item.Val}
- }
case 158:
yyDollar = yyS[yypt-3 : yypt+1]
{
- yylex.(*parser).unexpected("label set", "string")
- yyVAL.label = labels.Label{}
+ yyVAL.label = labels.Label{Name: yyDollar[1].item.Val, Value: yylex.(*parser).unquoteString(yyDollar[3].item.Val)}
}
case 159:
+ yyDollar = yyS[yypt-3 : yypt+1]
+ {
+ yyVAL.label = labels.Label{Name: yyDollar[1].item.Val, Value: yylex.(*parser).unquoteString(yyDollar[3].item.Val)}
+ }
+ case 160:
+ yyDollar = yyS[yypt-1 : yypt+1]
+ {
+ yyVAL.label = labels.Label{Name: labels.MetricName, Value: yyDollar[1].item.Val}
+ }
+ case 161:
yyDollar = yyS[yypt-3 : yypt+1]
{
yylex.(*parser).unexpected("label set", "string")
yyVAL.label = labels.Label{}
}
- case 160:
+ case 162:
+ yyDollar = yyS[yypt-3 : yypt+1]
+ {
+ yylex.(*parser).unexpected("label set", "string")
+ yyVAL.label = labels.Label{}
+ }
+ case 163:
yyDollar = yyS[yypt-2 : yypt+1]
{
yylex.(*parser).unexpected("label set", "\"=\"")
yyVAL.label = labels.Label{}
}
- case 161:
+ case 164:
yyDollar = yyS[yypt-1 : yypt+1]
{
yylex.(*parser).unexpected("label set", "identifier or \"}\"")
yyVAL.label = labels.Label{}
}
- case 162:
+ case 165:
yyDollar = yyS[yypt-2 : yypt+1]
{
yylex.(*parser).generatedParserResult = &seriesDescription{
@@ -1891,33 +1974,33 @@ yydefault:
values: yyDollar[2].series,
}
}
- case 163:
+ case 166:
yyDollar = yyS[yypt-0 : yypt+1]
{
yyVAL.series = []SequenceValue{}
}
- case 164:
+ case 167:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.series = append(yyDollar[1].series, yyDollar[3].series...)
}
- case 165:
+ case 168:
yyDollar = yyS[yypt-2 : yypt+1]
{
yyVAL.series = yyDollar[1].series
}
- case 166:
+ case 169:
yyDollar = yyS[yypt-1 : yypt+1]
{
yylex.(*parser).unexpected("series values", "")
yyVAL.series = nil
}
- case 167:
+ case 170:
yyDollar = yyS[yypt-1 : yypt+1]
{
yyVAL.series = []SequenceValue{{Omitted: true}}
}
- case 168:
+ case 171:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.series = []SequenceValue{}
@@ -1925,12 +2008,12 @@ yydefault:
yyVAL.series = append(yyVAL.series, SequenceValue{Omitted: true})
}
}
- case 169:
+ case 172:
yyDollar = yyS[yypt-1 : yypt+1]
{
yyVAL.series = []SequenceValue{{Value: yyDollar[1].float}}
}
- case 170:
+ case 173:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.series = []SequenceValue{}
@@ -1939,7 +2022,7 @@ yydefault:
yyVAL.series = append(yyVAL.series, SequenceValue{Value: yyDollar[1].float})
}
}
- case 171:
+ case 174:
yyDollar = yyS[yypt-4 : yypt+1]
{
yyVAL.series = []SequenceValue{}
@@ -1949,12 +2032,12 @@ yydefault:
yyDollar[1].float += yyDollar[2].float
}
}
- case 172:
+ case 175:
yyDollar = yyS[yypt-1 : yypt+1]
{
yyVAL.series = []SequenceValue{yylex.(*parser).newHistogramSequenceValue(yyDollar[1].histogram)}
}
- case 173:
+ case 176:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.series = []SequenceValue{}
@@ -1965,7 +2048,7 @@ yydefault:
//$1 += $2
}
}
- case 174:
+ case 177:
yyDollar = yyS[yypt-5 : yypt+1]
{
val, err := yylex.(*parser).histogramsIncreaseSeries(yyDollar[1].histogram, yyDollar[3].histogram, yyDollar[5].uint)
@@ -1974,7 +2057,7 @@ yydefault:
}
yyVAL.series = val
}
- case 175:
+ case 178:
yyDollar = yyS[yypt-5 : yypt+1]
{
val, err := yylex.(*parser).histogramsDecreaseSeries(yyDollar[1].histogram, yyDollar[3].histogram, yyDollar[5].uint)
@@ -1983,7 +2066,7 @@ yydefault:
}
yyVAL.series = val
}
- case 176:
+ case 179:
yyDollar = yyS[yypt-1 : yypt+1]
{
if yyDollar[1].item.Val != "stale" {
@@ -1991,130 +2074,130 @@ yydefault:
}
yyVAL.float = math.Float64frombits(value.StaleNaN)
}
- case 179:
+ case 182:
yyDollar = yyS[yypt-4 : yypt+1]
{
yyVAL.histogram = yylex.(*parser).buildHistogramFromMap(&yyDollar[2].descriptors)
}
- case 180:
+ case 183:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.histogram = yylex.(*parser).buildHistogramFromMap(&yyDollar[2].descriptors)
}
- case 181:
- yyDollar = yyS[yypt-3 : yypt+1]
- {
- m := yylex.(*parser).newMap()
- yyVAL.histogram = yylex.(*parser).buildHistogramFromMap(&m)
- }
- case 182:
- yyDollar = yyS[yypt-2 : yypt+1]
- {
- m := yylex.(*parser).newMap()
- yyVAL.histogram = yylex.(*parser).buildHistogramFromMap(&m)
- }
- case 183:
- yyDollar = yyS[yypt-3 : yypt+1]
- {
- yyVAL.descriptors = *(yylex.(*parser).mergeMaps(&yyDollar[1].descriptors, &yyDollar[3].descriptors))
- }
case 184:
- yyDollar = yyS[yypt-1 : yypt+1]
+ yyDollar = yyS[yypt-3 : yypt+1]
{
- yyVAL.descriptors = yyDollar[1].descriptors
+ m := yylex.(*parser).newMap()
+ yyVAL.histogram = yylex.(*parser).buildHistogramFromMap(&m)
}
case 185:
yyDollar = yyS[yypt-2 : yypt+1]
{
- yylex.(*parser).unexpected("histogram description", "histogram description key, e.g. buckets:[5 10 7]")
+ m := yylex.(*parser).newMap()
+ yyVAL.histogram = yylex.(*parser).buildHistogramFromMap(&m)
}
case 186:
yyDollar = yyS[yypt-3 : yypt+1]
{
- yyVAL.descriptors = yylex.(*parser).newMap()
- yyVAL.descriptors["schema"] = yyDollar[3].int
+ yyVAL.descriptors = *(yylex.(*parser).mergeMaps(&yyDollar[1].descriptors, &yyDollar[3].descriptors))
}
case 187:
- yyDollar = yyS[yypt-3 : yypt+1]
+ yyDollar = yyS[yypt-1 : yypt+1]
{
- yyVAL.descriptors = yylex.(*parser).newMap()
- yyVAL.descriptors["sum"] = yyDollar[3].float
+ yyVAL.descriptors = yyDollar[1].descriptors
}
case 188:
- yyDollar = yyS[yypt-3 : yypt+1]
+ yyDollar = yyS[yypt-2 : yypt+1]
{
- yyVAL.descriptors = yylex.(*parser).newMap()
- yyVAL.descriptors["count"] = yyDollar[3].float
+ yylex.(*parser).unexpected("histogram description", "histogram description key, e.g. buckets:[5 10 7]")
}
case 189:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.descriptors = yylex.(*parser).newMap()
- yyVAL.descriptors["z_bucket"] = yyDollar[3].float
+ yyVAL.descriptors["schema"] = yyDollar[3].int
}
case 190:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.descriptors = yylex.(*parser).newMap()
- yyVAL.descriptors["z_bucket_w"] = yyDollar[3].float
+ yyVAL.descriptors["sum"] = yyDollar[3].float
}
case 191:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.descriptors = yylex.(*parser).newMap()
- yyVAL.descriptors["custom_values"] = yyDollar[3].bucket_set
+ yyVAL.descriptors["count"] = yyDollar[3].float
}
case 192:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.descriptors = yylex.(*parser).newMap()
- yyVAL.descriptors["buckets"] = yyDollar[3].bucket_set
+ yyVAL.descriptors["z_bucket"] = yyDollar[3].float
}
case 193:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.descriptors = yylex.(*parser).newMap()
- yyVAL.descriptors["offset"] = yyDollar[3].int
+ yyVAL.descriptors["z_bucket_w"] = yyDollar[3].float
}
case 194:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.descriptors = yylex.(*parser).newMap()
- yyVAL.descriptors["n_buckets"] = yyDollar[3].bucket_set
+ yyVAL.descriptors["custom_values"] = yyDollar[3].bucket_set
}
case 195:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.descriptors = yylex.(*parser).newMap()
- yyVAL.descriptors["n_offset"] = yyDollar[3].int
+ yyVAL.descriptors["buckets"] = yyDollar[3].bucket_set
}
case 196:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.descriptors = yylex.(*parser).newMap()
- yyVAL.descriptors["counter_reset_hint"] = yyDollar[3].item
+ yyVAL.descriptors["offset"] = yyDollar[3].int
}
case 197:
- yyDollar = yyS[yypt-4 : yypt+1]
+ yyDollar = yyS[yypt-3 : yypt+1]
{
- yyVAL.bucket_set = yyDollar[2].bucket_set
+ yyVAL.descriptors = yylex.(*parser).newMap()
+ yyVAL.descriptors["n_buckets"] = yyDollar[3].bucket_set
}
case 198:
yyDollar = yyS[yypt-3 : yypt+1]
{
- yyVAL.bucket_set = yyDollar[2].bucket_set
+ yyVAL.descriptors = yylex.(*parser).newMap()
+ yyVAL.descriptors["n_offset"] = yyDollar[3].int
}
case 199:
yyDollar = yyS[yypt-3 : yypt+1]
{
- yyVAL.bucket_set = append(yyDollar[1].bucket_set, yyDollar[3].float)
+ yyVAL.descriptors = yylex.(*parser).newMap()
+ yyVAL.descriptors["counter_reset_hint"] = yyDollar[3].item
}
case 200:
+ yyDollar = yyS[yypt-4 : yypt+1]
+ {
+ yyVAL.bucket_set = yyDollar[2].bucket_set
+ }
+ case 201:
+ yyDollar = yyS[yypt-3 : yypt+1]
+ {
+ yyVAL.bucket_set = yyDollar[2].bucket_set
+ }
+ case 202:
+ yyDollar = yyS[yypt-3 : yypt+1]
+ {
+ yyVAL.bucket_set = append(yyDollar[1].bucket_set, yyDollar[3].float)
+ }
+ case 203:
yyDollar = yyS[yypt-1 : yypt+1]
{
yyVAL.bucket_set = []float64{yyDollar[1].float}
}
- case 262:
+ case 265:
yyDollar = yyS[yypt-1 : yypt+1]
{
yyVAL.node = &NumberLiteral{
@@ -2122,7 +2205,7 @@ yydefault:
PosRange: yyDollar[1].item.PositionRange(),
}
}
- case 263:
+ case 266:
yyDollar = yyS[yypt-1 : yypt+1]
{
var err error
@@ -2137,12 +2220,12 @@ yydefault:
Duration: true,
}
}
- case 264:
+ case 267:
yyDollar = yyS[yypt-1 : yypt+1]
{
yyVAL.float = yylex.(*parser).number(yyDollar[1].item.Val)
}
- case 265:
+ case 268:
yyDollar = yyS[yypt-1 : yypt+1]
{
var err error
@@ -2153,17 +2236,17 @@ yydefault:
}
yyVAL.float = dur.Seconds()
}
- case 266:
+ case 269:
yyDollar = yyS[yypt-2 : yypt+1]
{
yyVAL.float = yyDollar[2].float
}
- case 267:
+ case 270:
yyDollar = yyS[yypt-2 : yypt+1]
{
yyVAL.float = -yyDollar[2].float
}
- case 270:
+ case 273:
yyDollar = yyS[yypt-1 : yypt+1]
{
var err error
@@ -2172,17 +2255,17 @@ yydefault:
yylex.(*parser).addParseErrf(yyDollar[1].item.PositionRange(), "invalid repetition in series values: %s", err)
}
}
- case 271:
+ case 274:
yyDollar = yyS[yypt-2 : yypt+1]
{
yyVAL.int = -int64(yyDollar[2].uint)
}
- case 272:
+ case 275:
yyDollar = yyS[yypt-1 : yypt+1]
{
yyVAL.int = int64(yyDollar[1].uint)
}
- case 273:
+ case 276:
yyDollar = yyS[yypt-1 : yypt+1]
{
yyVAL.node = &StringLiteral{
@@ -2190,7 +2273,7 @@ yydefault:
PosRange: yyDollar[1].item.PositionRange(),
}
}
- case 274:
+ case 277:
yyDollar = yyS[yypt-1 : yypt+1]
{
yyVAL.item = Item{
@@ -2199,12 +2282,12 @@ yydefault:
Val: yylex.(*parser).unquoteString(yyDollar[1].item.Val),
}
}
- case 275:
+ case 278:
yyDollar = yyS[yypt-0 : yypt+1]
{
yyVAL.strings = nil
}
- case 277:
+ case 280:
yyDollar = yyS[yypt-1 : yypt+1]
{
nl := yyDollar[1].node.(*NumberLiteral)
@@ -2215,7 +2298,7 @@ yydefault:
}
yyVAL.node = nl
}
- case 278:
+ case 281:
yyDollar = yyS[yypt-2 : yypt+1]
{
nl := yyDollar[2].node.(*NumberLiteral)
@@ -2230,7 +2313,7 @@ yydefault:
nl.PosRange.Start = yyDollar[1].item.Pos
yyVAL.node = nl
}
- case 279:
+ case 282:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.node = &DurationExpr{
@@ -2239,7 +2322,7 @@ yydefault:
EndPos: yyDollar[3].item.PositionRange().End,
}
}
- case 280:
+ case 283:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.node = &DurationExpr{
@@ -2248,7 +2331,7 @@ yydefault:
EndPos: yyDollar[3].item.PositionRange().End,
}
}
- case 281:
+ case 284:
yyDollar = yyS[yypt-4 : yypt+1]
{
yyVAL.node = &DurationExpr{
@@ -2261,7 +2344,7 @@ yydefault:
StartPos: yyDollar[1].item.Pos,
}
}
- case 282:
+ case 285:
yyDollar = yyS[yypt-4 : yypt+1]
{
yyVAL.node = &DurationExpr{
@@ -2274,7 +2357,7 @@ yydefault:
StartPos: yyDollar[1].item.Pos,
}
}
- case 283:
+ case 286:
yyDollar = yyS[yypt-6 : yypt+1]
{
yyVAL.node = &DurationExpr{
@@ -2285,7 +2368,7 @@ yydefault:
RHS: yyDollar[5].node.(Expr),
}
}
- case 284:
+ case 287:
yyDollar = yyS[yypt-7 : yypt+1]
{
yyVAL.node = &DurationExpr{
@@ -2301,7 +2384,7 @@ yydefault:
},
}
}
- case 285:
+ case 288:
yyDollar = yyS[yypt-4 : yypt+1]
{
de := yyDollar[3].node.(*DurationExpr)
@@ -2316,7 +2399,7 @@ yydefault:
}
yyVAL.node = yyDollar[3].node
}
- case 289:
+ case 292:
yyDollar = yyS[yypt-1 : yypt+1]
{
nl := yyDollar[1].node.(*NumberLiteral)
@@ -2327,7 +2410,7 @@ yydefault:
}
yyVAL.node = nl
}
- case 290:
+ case 293:
yyDollar = yyS[yypt-2 : yypt+1]
{
switch expr := yyDollar[2].node.(type) {
@@ -2360,25 +2443,25 @@ yydefault:
break
}
}
- case 291:
+ case 294:
yyDollar = yyS[yypt-3 : yypt+1]
{
yylex.(*parser).experimentalDurationExpr(yyDollar[1].node.(Expr))
yyVAL.node = &DurationExpr{Op: ADD, LHS: yyDollar[1].node.(Expr), RHS: yyDollar[3].node.(Expr)}
}
- case 292:
+ case 295:
yyDollar = yyS[yypt-3 : yypt+1]
{
yylex.(*parser).experimentalDurationExpr(yyDollar[1].node.(Expr))
yyVAL.node = &DurationExpr{Op: SUB, LHS: yyDollar[1].node.(Expr), RHS: yyDollar[3].node.(Expr)}
}
- case 293:
+ case 296:
yyDollar = yyS[yypt-3 : yypt+1]
{
yylex.(*parser).experimentalDurationExpr(yyDollar[1].node.(Expr))
yyVAL.node = &DurationExpr{Op: MUL, LHS: yyDollar[1].node.(Expr), RHS: yyDollar[3].node.(Expr)}
}
- case 294:
+ case 297:
yyDollar = yyS[yypt-3 : yypt+1]
{
yylex.(*parser).experimentalDurationExpr(yyDollar[1].node.(Expr))
@@ -2389,7 +2472,7 @@ yydefault:
}
yyVAL.node = &DurationExpr{Op: DIV, LHS: yyDollar[1].node.(Expr), RHS: yyDollar[3].node.(Expr)}
}
- case 295:
+ case 298:
yyDollar = yyS[yypt-3 : yypt+1]
{
yylex.(*parser).experimentalDurationExpr(yyDollar[1].node.(Expr))
@@ -2400,13 +2483,13 @@ yydefault:
}
yyVAL.node = &DurationExpr{Op: MOD, LHS: yyDollar[1].node.(Expr), RHS: yyDollar[3].node.(Expr)}
}
- case 296:
+ case 299:
yyDollar = yyS[yypt-3 : yypt+1]
{
yylex.(*parser).experimentalDurationExpr(yyDollar[1].node.(Expr))
yyVAL.node = &DurationExpr{Op: POW, LHS: yyDollar[1].node.(Expr), RHS: yyDollar[3].node.(Expr)}
}
- case 297:
+ case 300:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.node = &DurationExpr{
@@ -2415,7 +2498,7 @@ yydefault:
EndPos: yyDollar[3].item.PositionRange().End,
}
}
- case 298:
+ case 301:
yyDollar = yyS[yypt-3 : yypt+1]
{
yyVAL.node = &DurationExpr{
@@ -2424,7 +2507,7 @@ yydefault:
EndPos: yyDollar[3].item.PositionRange().End,
}
}
- case 299:
+ case 302:
yyDollar = yyS[yypt-6 : yypt+1]
{
yyVAL.node = &DurationExpr{
@@ -2435,7 +2518,7 @@ yydefault:
RHS: yyDollar[5].node.(Expr),
}
}
- case 301:
+ case 304:
yyDollar = yyS[yypt-3 : yypt+1]
{
yylex.(*parser).experimentalDurationExpr(yyDollar[2].node.(Expr))
diff --git a/promql/parser/parse_test.go b/promql/parser/parse_test.go
index f5b2e2dff0..691eaa6896 100644
--- a/promql/parser/parse_test.go
+++ b/promql/parser/parse_test.go
@@ -4212,23 +4212,23 @@ var testExpr = []struct {
},
{
input: `start()`,
- fail: true,
- errors: ParseErrors{
- ParseErr{
- PositionRange: posrange.PositionRange{Start: 5, End: 6},
- Err: errors.New(`unexpected "("`),
- Query: `start()`,
+ expected: &Call{
+ Func: MustGetFunction("start"),
+ Args: Expressions{},
+ PosRange: posrange.PositionRange{
+ Start: 0,
+ End: 7,
},
},
},
{
input: `end()`,
- fail: true,
- errors: ParseErrors{
- ParseErr{
- PositionRange: posrange.PositionRange{Start: 3, End: 4},
- Err: errors.New(`unexpected "("`),
- Query: `end()`,
+ expected: &Call{
+ Func: MustGetFunction("end"),
+ Args: Expressions{},
+ PosRange: posrange.PositionRange{
+ Start: 0,
+ End: 5,
},
},
},
diff --git a/promql/promqltest/test.go b/promql/promqltest/test.go
index cc02a5b40f..2e7b47f103 100644
--- a/promql/promqltest/test.go
+++ b/promql/promqltest/test.go
@@ -1579,10 +1579,14 @@ type atModifierTestCase struct {
evalTime time.Time
}
-// parserForBuiltinTests is the parser used when parsing expressions in the
-// built-in test framework (e.g. atModifierTestCases). It must match the Parser
-// used by NewTestEngine so that expressions parse consistently.
-var parserForBuiltinTests = parser.NewParser(TestParserOpts)
+var (
+ // parserForBuiltinTests is the parser used when parsing expressions in the
+ // built-in test framework (e.g. atModifierTestCases). It must match the Parser
+ // used by NewTestEngine so that expressions parse consistently.
+ parserForBuiltinTests = parser.NewParser(TestParserOpts)
+ // reQueryContextFuncs matches start(), end(), range(), and step() calls, which depend on query context.
+ reQueryContextFuncs = regexp.MustCompile(`(start|end|range|step)\(\)`)
+)
func atModifierTestCases(exprStr string, evalTime time.Time) ([]atModifierTestCase, error) {
expr, err := parserForBuiltinTests.ParseExpr(exprStr)
@@ -1794,8 +1798,8 @@ func (t *test) runInstantQuery(iq atModifierTestCase, cmd *evalCmd, engine promq
// Check query returns same result in range mode,
// by checking against the middle step.
- // Skip this check for queries containing range() since it would resolve differently.
- if strings.Contains(iq.expr, "range()") {
+ // Skip this check for queries containing range(), step(), start(), or end() since they would resolve differently.
+ if reQueryContextFuncs.MatchString(iq.expr) {
return nil
}
q, err = engine.NewRangeQuery(t.context, t.storage, nil, iq.expr, iq.evalTime.Add(-time.Minute), iq.evalTime.Add(time.Minute), time.Minute)
diff --git a/promql/promqltest/testdata/functions.test b/promql/promqltest/testdata/functions.test
index 7bc4bcb624..08dff3e80b 100644
--- a/promql/promqltest/testdata/functions.test
+++ b/promql/promqltest/testdata/functions.test
@@ -2049,3 +2049,141 @@ eval_fail instant at 0 label_replace(overlap, "idx", "same", "idx", ".*")
# Test label_join failure with overlapping timestamps (same labelset at same time).
eval_fail instant at 0 label_join(overlap, "idx", ",", "label", "label")
+
+# Tests for step() and range() functions.
+clear
+
+# Test step() function in range queries.
+eval range from 0 to 10s step 5s step()
+ {} 5 5 5
+
+eval range from 0 to 20s step 10s step()
+ {} 10 10 10
+
+eval range from 0 to 30s step 15s step()
+ {} 15 15 15
+
+# Test range() function in range queries.
+eval range from 0 to 30s step 10s range()
+ {} 30 30 30 30
+
+eval range from 0s to 60s step 20s range()
+ {} 60 60 60 60
+
+eval range from 10s to 50s step 10s range()
+ {} 40 40 40 40 40
+
+# Test step() function in instant queries.
+eval instant at 0s step()
+ 0
+
+# Test range() function in instant queries.
+eval instant at 0s range()
+ 0
+
+eval instant at 100s range()
+ 0
+
+# Test step() and range() in expressions.
+eval range from 0 to 10s step 5s vector(step())
+ {} 5 5 5
+
+eval range from 0 to 20s step 10s vector(range())
+ {} 20 20 20
+
+# Test step() and range() with arithmetic.
+load 1s
+ metric 1 2 3 4 5
+
+eval range from 0s to 4s step 1s metric * step()
+ {} 1 2 3 4 5
+
+eval range from 0s to 2s step 1s metric + range()
+ {} 3 4 5
+
+# Test that step() returns the step value, not evaluation timestamp.
+eval range from 100s to 110s step 5s step()
+ {} 5 5 5
+
+# Test that range() returns the query range, not evaluation timestamp.
+eval range from 100s to 130s step 10s range()
+ {} 30 30 30 30
+
+
+# Tests for start() and end() functions.
+
+# Test start() function in range queries.
+eval range from 0 to 30s step 10s start()
+ {} 0 0 0 0
+
+eval range from 100s to 130s step 10s start()
+ {} 100 100 100 100
+
+eval range from 50s to 60s step 5s start()
+ {} 50 50 50
+
+# Test end() function in range queries.
+eval range from 0 to 30s step 10s end()
+ {} 30 30 30 30
+
+eval range from 100s to 140s step 10s end()
+ {} 140 140 140 140 140
+
+eval range from 20s to 50s step 10s end()
+ {} 50 50 50 50
+
+# Test start() function in instant queries (start == end).
+eval instant at 0s start()
+ 0
+
+eval instant at 100s start()
+ 100
+
+# Test end() function in instant queries (start == end).
+eval instant at 0s end()
+ 0
+
+eval instant at 50s end()
+ 50
+
+# Test start() and end() in expressions.
+eval range from 0 to 20s step 10s vector(start())
+ {} 0 0 0
+
+eval range from 10s to 30s step 10s vector(end())
+ {} 30 30 30
+
+# Test that start() and end() return query boundaries, not evaluation timestamps.
+eval range from 100s to 130s step 10s start()
+ {} 100 100 100 100
+
+eval range from 100s to 130s step 10s end()
+ {} 130 130 130 130
+
+# Test start() and end() with arithmetic.
+eval range from 10s to 20s step 5s end() - start()
+ {} 10 10 10
+
+eval range from 0s to 30s step 10s (end() + start()) / 2
+ {} 15 15 15 15
+
+# Test combination with step() and range().
+eval range from 0s to 20s step 10s start() + range()
+ {} 20 20 20
+
+eval range from 10s to 50s step 10s end() - range()
+ {} 10 10 10 10 10
+
+
+# Test start() and end() with @ modifier in selector context.
+# Range queries with @ start() and @ end() work correctly.
+load 1s
+ metric_for_at 1 2 3 4 5 6 7 8 9 10
+
+# For range query from 0s to 9s: start()=0, end()=9
+# metric_for_at @ 0 = 1, metric_for_at @ 9 = 10
+eval range from 0s to 9s step 3s metric_for_at @ start()
+ {__name__="metric_for_at"} 1 1 1 1
+
+eval range from 1s to 9s step 2s metric_for_at @ end()
+ {__name__="metric_for_at"} 10 10 10 10 10
diff --git a/web/ui/mantine-ui/src/promql/functionDocs.tsx b/web/ui/mantine-ui/src/promql/functionDocs.tsx
index 890235fa85..aff27f8dc9 100644
--- a/web/ui/mantine-ui/src/promql/functionDocs.tsx
+++ b/web/ui/mantine-ui/src/promql/functionDocs.tsx
@@ -1102,6 +1102,22 @@ const funcDocs: Record
+
+ This function has to be enabled via the{" "}
+ feature flag
+ --enable-feature=promql-experimental-functions.
+
+
+ end() returns the end timestamp of the current query range evaluation as the number of seconds
+ since January 1, 1970 UTC. For instant queries, this is equal to the evaluation timestamp.
+
@@ -2818,6 +2834,22 @@ const funcDocs: Record
+
+ This function has to be enabled via the{" "}
+ feature flag
+
+
@@ -3120,6 +3152,22 @@ const funcDocs: Record
+
+ This function has to be enabled via the{" "}
+ feature flag
+
+
@@ -3340,6 +3388,22 @@ const funcDocs: Record
+
+ This function has to be enabled via the{" "}
+ feature flag
+
+
diff --git a/web/ui/mantine-ui/src/promql/functionSignatures.ts b/web/ui/mantine-ui/src/promql/functionSignatures.ts
index 837a271dce..0f5d838999 100644
--- a/web/ui/mantine-ui/src/promql/functionSignatures.ts
+++ b/web/ui/mantine-ui/src/promql/functionSignatures.ts
@@ -52,6 +52,7 @@ export const functionSignatures: Record--enable-feature=promql-experimental-functions.
+
+ range() returns the range duration of the current query range evaluation in seconds and is
+ equivalent to end() - start(). For instant queries, this returns 0.
+ --enable-feature=promql-experimental-functions.
+
+ start() returns the start timestamp of the current query range evaluation as the number of seconds
+ since January 1, 1970 UTC. For instant queries, this is equal to the evaluation timestamp.
+ --enable-feature=promql-experimental-functions.
+
+ step() returns the query resolution step as the number of seconds. For instant queries, this
+ returns 0.
+