diff --git a/src/promql/src/planner.rs b/src/promql/src/planner.rs index bf761dca43..bf8c8eeb6c 100644 --- a/src/promql/src/planner.rs +++ b/src/promql/src/planner.rs @@ -98,6 +98,16 @@ impl PromPlannerContext { ..Default::default() } } + + /// Reset all planner states + fn reset(&mut self) { + self.table_name = None; + self.time_index_column = None; + self.field_columns = vec![]; + self.tag_columns = vec![]; + self.field_column_matcher = None; + self.range = None; + } } pub struct PromPlanner { @@ -473,6 +483,9 @@ impl PromPlanner { /// Extract metric name from `__name__` matcher and set it into [PromPlannerContext]. /// Returns a new [Matchers] that doesn't contains metric name matcher. /// + /// Each call to this function means new selector is started. Thus the context will be reset + /// at first. + /// /// Name rule: /// - if `name` is some, then the matchers MUST NOT contains `__name__` matcher. /// - if `name` is none, then the matchers MAY contains NONE OR MULTIPLE `__name__` matchers. @@ -481,6 +494,7 @@ impl PromPlanner { label_matchers: &Matchers, name: &Option, ) -> Result { + self.ctx.reset(); let metric_name; if let Some(name) = name.clone() { metric_name = Some(name); @@ -600,7 +614,14 @@ impl PromPlanner { let _ = result_set.remove(&col); } - self.ctx.field_columns = result_set.iter().cloned().collect(); + // mask the field columns in context using computed result set + self.ctx.field_columns = self + .ctx + .field_columns + .drain(..) + .filter(|col| result_set.contains(col)) + .collect(); + let exprs = result_set .into_iter() .map(|col| DfExpr::Column(col.into())) diff --git a/tests/cases/standalone/common/tql/binary_operator.result b/tests/cases/standalone/common/tql/binary_operator.result index bce78de11c..4f0a022c48 100644 --- a/tests/cases/standalone/common/tql/binary_operator.result +++ b/tests/cases/standalone/common/tql/binary_operator.result @@ -37,3 +37,52 @@ drop table data; Affected Rows: 1 +-- Binary operator on table with multiple field columns +create table data (ts timestamp time index, val1 double, val2 double, val3 double); + +Affected Rows: 0 + +insert into data values (0, 1, 100, 10000), (10000, 2, 200, 20000), (20000, 3, 300, 30000); + +Affected Rows: 3 + +-- SQLNESS SORT_RESULT 3 1 +tql eval (0, 30, '10s'), data / data; + ++---------------------+-----------------------+-----------------------+-----------------------+ +| ts | data.val1 / data.val1 | data.val2 / data.val2 | data.val3 / data.val3 | ++---------------------+-----------------------+-----------------------+-----------------------+ +| 1970-01-01T00:00:00 | 1.0 | 1.0 | 1.0 | +| 1970-01-01T00:00:10 | 1.0 | 1.0 | 1.0 | +| 1970-01-01T00:00:20 | 1.0 | 1.0 | 1.0 | +| 1970-01-01T00:00:30 | 1.0 | 1.0 | 1.0 | ++---------------------+-----------------------+-----------------------+-----------------------+ + +-- SQLNESS SORT_RESULT 3 1 +tql eval (0, 30, '10s'), data{__field__="val1"} + data{__field__="val2"}; + ++---------------------+-----------------------+ +| ts | data.val1 + data.val2 | ++---------------------+-----------------------+ +| 1970-01-01T00:00:00 | 101.0 | +| 1970-01-01T00:00:10 | 202.0 | +| 1970-01-01T00:00:20 | 303.0 | +| 1970-01-01T00:00:30 | 303.0 | ++---------------------+-----------------------+ + +-- SQLNESS SORT_RESULT 3 1 +tql eval (0, 30, '10s'), data{__field__="val1", __field__="val2"} + data{__field__="val2", __field__="val3"}; + ++---------------------+-----------------------+-----------------------+ +| ts | data.val1 + data.val2 | data.val2 + data.val3 | ++---------------------+-----------------------+-----------------------+ +| 1970-01-01T00:00:00 | 101.0 | 10100.0 | +| 1970-01-01T00:00:10 | 202.0 | 20200.0 | +| 1970-01-01T00:00:20 | 303.0 | 30300.0 | +| 1970-01-01T00:00:30 | 303.0 | 30300.0 | ++---------------------+-----------------------+-----------------------+ + +drop table data; + +Affected Rows: 1 + diff --git a/tests/cases/standalone/common/tql/binary_operator.sql b/tests/cases/standalone/common/tql/binary_operator.sql index 82c2682fbf..2b749711ad 100644 --- a/tests/cases/standalone/common/tql/binary_operator.sql +++ b/tests/cases/standalone/common/tql/binary_operator.sql @@ -9,3 +9,20 @@ tql eval (0, 30, '10s'), data + (1 < bool 2); tql eval (0, 30, '10s'), data + (1 > bool 2); drop table data; + +-- Binary operator on table with multiple field columns + +create table data (ts timestamp time index, val1 double, val2 double, val3 double); + +insert into data values (0, 1, 100, 10000), (10000, 2, 200, 20000), (20000, 3, 300, 30000); + +-- SQLNESS SORT_RESULT 3 1 +tql eval (0, 30, '10s'), data / data; + +-- SQLNESS SORT_RESULT 3 1 +tql eval (0, 30, '10s'), data{__field__="val1"} + data{__field__="val2"}; + +-- SQLNESS SORT_RESULT 3 1 +tql eval (0, 30, '10s'), data{__field__="val1", __field__="val2"} + data{__field__="val2", __field__="val3"}; + +drop table data;