fix: Aggregate subqueries with push-down `GROUP BY tags`

pull/24376/head
Stuart Carnie 2023-05-12 16:53:16 +10:00
parent 87dca540a7
commit f4a19fc6c1
No known key found for this signature in database
GPG Key ID: 848D9C9718D78B4F
3 changed files with 35 additions and 15 deletions

View File

@ -542,7 +542,7 @@ SELECT * FROM (SELECT cpu AS foo, usage_idle FROM cpu) GROUP BY cpu;
-- group by should be pushed to subquery, resulting in COUNTs that are grouped
-- TODO(sgc): Fix this
-- SELECT * FROM (SELECT COUNT(usage_idle) FROM cpu) GROUP BY cpu;
SELECT * FROM (SELECT COUNT(usage_idle) FROM cpu) GROUP BY cpu;
SELECT * FROM (SELECT usage_idle FROM cpu GROUP BY cpu) GROUP BY cpu;

View File

@ -2749,6 +2749,28 @@ tags: cpu=cpu1
| 2022-10-31T02:00:00 | cpu1 | 1.98 |
| 2022-10-31T02:00:10 | cpu1 | 1.99 |
+---------------------+------+------------+
-- InfluxQL: SELECT * FROM (SELECT COUNT(usage_idle) FROM cpu) GROUP BY cpu;
name: cpu
tags: cpu=cpu-total
+---------------------+-------+
| time | count |
+---------------------+-------+
| 1970-01-01T00:00:00 | 2 |
+---------------------+-------+
name: cpu
tags: cpu=cpu0
+---------------------+-------+
| time | count |
+---------------------+-------+
| 1970-01-01T00:00:00 | 2 |
+---------------------+-------+
name: cpu
tags: cpu=cpu1
+---------------------+-------+
| time | count |
+---------------------+-------+
| 1970-01-01T00:00:00 | 2 |
+---------------------+-------+
-- InfluxQL: SELECT * FROM (SELECT usage_idle FROM cpu GROUP BY cpu) GROUP BY cpu;
name: cpu
tags: cpu=cpu-total

View File

@ -747,22 +747,20 @@ impl<'a> InfluxQLToLogicalPlan<'a> {
vec![]
};
if let Some(group_by) = ctx.group_by {
if group_by.time_dimension().is_some() {
// Include the GROUP BY TIME(..) expression
group_by_exprs.push(select_exprs[time_column_index].clone());
}
let schema = ds.schema(self.s)?;
group_by_exprs.extend(group_by_tag_set.iter().filter_map(|name| {
if let Some(InfluxColumnType::Tag) = schema.field_type_by_name(name) {
Some(name.as_expr())
} else {
None
}
}));
if ctx.group_by.and_then(|v| v.time_dimension()).is_some() {
// Include the GROUP BY TIME(..) expression
group_by_exprs.push(select_exprs[time_column_index].clone());
}
let schema = ds.schema(self.s)?;
group_by_exprs.extend(group_by_tag_set.iter().filter_map(|name| {
if let Some(InfluxColumnType::Tag) = schema.field_type_by_name(name) {
Some(name.as_expr())
} else {
None
}
}));
group_by_exprs
};