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 = {

), + end: ( + <> +

+ + 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. +

+ + ), exp: ( <>

@@ -2818,6 +2834,22 @@ const funcDocs: Record = { ), + range: ( + <> +

+ + This function has to be enabled via the{" "} + feature flag + --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: ( <>

@@ -3120,6 +3152,22 @@ const funcDocs: Record = {

), + start: ( + <> +

+ + This function has to be enabled via the{" "} + feature flag + --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. +

+ + ), stddev_over_time: ( <>

@@ -3340,6 +3388,22 @@ const funcDocs: Record = {

), + step: ( + <> +

+ + This function has to be enabled via the{" "} + feature flag + --enable-feature=promql-experimental-functions. + +

+ +

+ step() returns the query resolution step as the number of seconds. For instant queries, this + returns 0. +

+ + ), sum_over_time: ( <>

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 = { variadic: 0, returnType: valueType.vector, }, + end: { name: "end", argTypes: [], variadic: 0, returnType: valueType.scalar }, exp: { name: "exp", argTypes: [valueType.vector], variadic: 0, returnType: valueType.vector }, first_over_time: { name: "first_over_time", argTypes: [valueType.matrix], variadic: 0, returnType: valueType.vector }, floor: { name: "floor", argTypes: [valueType.vector], variadic: 0, returnType: valueType.vector }, @@ -134,6 +135,7 @@ export const functionSignatures: Record = { returnType: valueType.vector, }, rad: { name: "rad", argTypes: [valueType.vector], variadic: 0, returnType: valueType.vector }, + range: { name: "range", argTypes: [], variadic: 0, returnType: valueType.scalar }, rate: { name: "rate", argTypes: [valueType.matrix], variadic: 0, returnType: valueType.vector }, resets: { name: "resets", argTypes: [valueType.matrix], variadic: 0, returnType: valueType.vector }, round: { name: "round", argTypes: [valueType.vector, valueType.scalar], variadic: 1, returnType: valueType.vector }, @@ -156,6 +158,7 @@ export const functionSignatures: Record = { }, sort_desc: { name: "sort_desc", argTypes: [valueType.vector], variadic: 0, returnType: valueType.vector }, sqrt: { name: "sqrt", argTypes: [valueType.vector], variadic: 0, returnType: valueType.vector }, + start: { name: "start", argTypes: [], variadic: 0, returnType: valueType.scalar }, stddev_over_time: { name: "stddev_over_time", argTypes: [valueType.matrix], @@ -168,6 +171,7 @@ export const functionSignatures: Record = { variadic: 0, returnType: valueType.vector, }, + step: { name: "step", argTypes: [], variadic: 0, returnType: valueType.scalar }, sum_over_time: { name: "sum_over_time", argTypes: [valueType.matrix], variadic: 0, returnType: valueType.vector }, tan: { name: "tan", argTypes: [valueType.vector], variadic: 0, returnType: valueType.vector }, tanh: { name: "tanh", argTypes: [valueType.vector], variadic: 0, returnType: valueType.vector },