mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-05-15 12:30:38 +00:00
fix: promql planner should clear its states on each selector (#2247)
* reset planner status on selector Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * add sqlness test Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * add empty line Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * sort result Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * mask fields to keep ordering Signed-off-by: Ruihang Xia <waynestxia@gmail.com> --------- Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
This commit is contained in:
@@ -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<String>,
|
||||
) -> Result<Matchers> {
|
||||
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()))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user