From d2f3f2e24d3b5cc0df97189c119f535ddf7f2610 Mon Sep 17 00:00:00 2001 From: yihong Date: Wed, 22 Jan 2025 10:51:12 +0800 Subject: [PATCH] fix: vector function for PromQL need to ignore the time index also (#5398) * fix: vector function for PromQL need to ignore the time index also close #5392 Signed-off-by: yihong0618 * fix: do not affect scalar function Signed-off-by: yihong0618 * fix: betteer name for it Signed-off-by: yihong0618 --------- Signed-off-by: yihong0618 --- src/query/src/promql/planner.rs | 13 +++++++++++-- .../common/promql/set_operation.result | 17 +++++++++++++++++ .../standalone/common/promql/set_operation.sql | 4 ++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/query/src/promql/planner.rs b/src/query/src/promql/planner.rs index bfdfb5981ae1..48a88a2cb55f 100644 --- a/src/query/src/promql/planner.rs +++ b/src/query/src/promql/planner.rs @@ -409,6 +409,10 @@ impl PromPlanner { } } let mut field_columns = left_field_columns.iter().zip(right_field_columns.iter()); + let has_special_vector_function = (left_field_columns.len() == 1 + && left_field_columns[0] == GREPTIME_VALUE) + || (right_field_columns.len() == 1 && right_field_columns[0] == GREPTIME_VALUE); + let join_plan = self.join_on_non_field_columns( left_input, right_input, @@ -417,6 +421,7 @@ impl PromPlanner { // if left plan or right plan tag is empty, means case like `scalar(...) + host` or `host + scalar(...)` // under this case we only join on time index left_context.tag_columns.is_empty() || right_context.tag_columns.is_empty(), + has_special_vector_function, )?; let join_plan_schema = join_plan.schema().clone(); @@ -2003,6 +2008,7 @@ impl PromPlanner { left_table_ref: TableReference, right_table_ref: TableReference, only_join_time_index: bool, + has_special_vector_function: bool, ) -> Result { let mut tag_columns = if only_join_time_index { vec![] @@ -2014,9 +2020,12 @@ impl PromPlanner { .collect::>() }; - // push time index column if it exist + // push time index column if it exists if let Some(time_index_column) = &self.ctx.time_index_column { - tag_columns.push(Column::from_name(time_index_column)); + // issue #5392 if is special vector function + if !has_special_vector_function { + tag_columns.push(Column::from_name(time_index_column)); + } } let right = LogicalPlanBuilder::from(right) diff --git a/tests/cases/standalone/common/promql/set_operation.result b/tests/cases/standalone/common/promql/set_operation.result index 230ee5b566bc..605582e19543 100644 --- a/tests/cases/standalone/common/promql/set_operation.result +++ b/tests/cases/standalone/common/promql/set_operation.result @@ -311,6 +311,23 @@ tql eval (3000, 3000, '1s') http_requests AND IGNORING (g, instance, job) vector | 1970-01-01T00:50:00 | app | 1 | production | 600.0 | +---------------------+-----+----------+------------+----------------+ +-- https://github.com/GreptimeTeam/greptimedb/issues/5392 +-- SQLNESS SORT_RESULT 3 1 +tql eval (3000, 3000, '1s') vector(1) * http_requests; + ++-----+----------+------------+---------------------+------------------------------------------------+ +| job | instance | g | ts | .greptime_value * http_requests.greptime_value | ++-----+----------+------------+---------------------+------------------------------------------------+ +| api | 0 | canary | 1970-01-01T00:50:00 | 300.0 | +| api | 0 | production | 1970-01-01T00:50:00 | 100.0 | +| api | 1 | canary | 1970-01-01T00:50:00 | 400.0 | +| api | 1 | production | 1970-01-01T00:50:00 | 200.0 | +| app | 0 | canary | 1970-01-01T00:50:00 | 700.0 | +| app | 0 | production | 1970-01-01T00:50:00 | 500.0 | +| app | 1 | canary | 1970-01-01T00:50:00 | 800.0 | +| app | 1 | production | 1970-01-01T00:50:00 | 600.0 | ++-----+----------+------------+---------------------+------------------------------------------------+ + drop table http_requests; Affected Rows: 0 diff --git a/tests/cases/standalone/common/promql/set_operation.sql b/tests/cases/standalone/common/promql/set_operation.sql index a386ca96c40a..87189323fdad 100644 --- a/tests/cases/standalone/common/promql/set_operation.sql +++ b/tests/cases/standalone/common/promql/set_operation.sql @@ -165,6 +165,10 @@ tql eval (3000, 3000, '1s') http_requests AND ON (dummy) vector(1); -- SQLNESS SORT_RESULT 3 1 tql eval (3000, 3000, '1s') http_requests AND IGNORING (g, instance, job) vector(1); +-- https://github.com/GreptimeTeam/greptimedb/issues/5392 +-- SQLNESS SORT_RESULT 3 1 +tql eval (3000, 3000, '1s') vector(1) * http_requests; + drop table http_requests; drop table cpu_count;