diff --git a/src/query/src/promql/planner.rs b/src/query/src/promql/planner.rs index c043085987..f233f75080 100644 --- a/src/query/src/promql/planner.rs +++ b/src/query/src/promql/planner.rs @@ -2418,6 +2418,7 @@ impl PromPlanner { // step 4: update context self.ctx.time_index_column = Some(left_time_index_column); self.ctx.tag_columns = all_tags.into_iter().collect(); + self.ctx.field_columns = vec![left_field_col.to_string()]; Ok(result) } @@ -3343,6 +3344,41 @@ mod test { } } + #[tokio::test] + async fn test_nested_binary_op() { + let mut eval_stmt = EvalStmt { + expr: PromExpr::NumberLiteral(NumberLiteral { val: 1.0 }), + start: UNIX_EPOCH, + end: UNIX_EPOCH + .checked_add(Duration::from_secs(100_000)) + .unwrap(), + interval: Duration::from_secs(5), + lookback_delta: Duration::from_secs(1), + }; + + let case = r#"sum(rate(nginx_ingress_controller_requests{job=~".*"}[2m])) - + ( + sum(rate(nginx_ingress_controller_requests{namespace=~".*"}[2m])) + or + vector(0) + )"#; + + let prom_expr = parser::parse(case).unwrap(); + eval_stmt.expr = prom_expr; + let table_provider = build_test_table_provider_with_fields( + &[( + DEFAULT_SCHEMA_NAME.to_string(), + "nginx_ingress_controller_requests".to_string(), + )], + &["namespace", "job"], + ) + .await; + // Should be ok + let _ = PromPlanner::stmt_to_plan(table_provider, &eval_stmt, &build_session_state()) + .await + .unwrap(); + } + #[tokio::test] async fn value_matcher() { // template diff --git a/tests/cases/standalone/common/promql/set_operation.result b/tests/cases/standalone/common/promql/set_operation.result index dcb259369c..8181578261 100644 --- a/tests/cases/standalone/common/promql/set_operation.result +++ b/tests/cases/standalone/common/promql/set_operation.result @@ -457,6 +457,26 @@ tql eval (0, 2000, '400') t2 or on(job) t1; | 1970-01-01T00:33:20 | 0.0 | | +---------------------+----------------+-----+ +-- SQLNESS SORT_RESULT 3 1 +tql eval (0, 2000, '400') sum(t1{job="a"}); + ++---------------------+------------------------+ +| ts | sum(t1.greptime_value) | ++---------------------+------------------------+ +| 1970-01-01T00:00:00 | 1.0 | +| 1970-01-01T00:20:00 | 3.0 | ++---------------------+------------------------+ + +-- SQLNESS SORT_RESULT 3 1 +tql eval (0, 2000, '400') sum(t1{job="a"}) - sum(t1{job="e"} or vector(1)); + ++---------------------+-----------------------------------------------------+ +| ts | t1.sum(t1.greptime_value) - .sum(t1.greptime_value) | ++---------------------+-----------------------------------------------------+ +| 1970-01-01T00:00:00 | 0.0 | +| 1970-01-01T00:20:00 | 2.0 | ++---------------------+-----------------------------------------------------+ + drop table t1; Affected Rows: 0 diff --git a/tests/cases/standalone/common/promql/set_operation.sql b/tests/cases/standalone/common/promql/set_operation.sql index ff213c4512..fe337bbdf2 100644 --- a/tests/cases/standalone/common/promql/set_operation.sql +++ b/tests/cases/standalone/common/promql/set_operation.sql @@ -203,6 +203,12 @@ tql eval (0, 2000, '400') t2 or on () t1; -- SQLNESS SORT_RESULT 3 1 tql eval (0, 2000, '400') t2 or on(job) t1; +-- SQLNESS SORT_RESULT 3 1 +tql eval (0, 2000, '400') sum(t1{job="a"}); + +-- SQLNESS SORT_RESULT 3 1 +tql eval (0, 2000, '400') sum(t1{job="a"}) - sum(t1{job="e"} or vector(1)); + drop table t1; drop table t2;