Skip to content

Commit 867a10a

Browse files
committed
SQL: prevent duplicate generation for repeated aggs (#33252)
Prevent generation of duplicate aggs caused by repetitive functions, leading to invalid query. Fix #30287 (cherry picked from commit 83c3d7a) (cherry picked from commit 61e0ce7)
1 parent 4a548b0 commit 867a10a

File tree

2 files changed

+12
-1
lines changed
  • x-pack
    • plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg
    • qa/sql/src/main/resources

2 files changed

+12
-1
lines changed

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/agg/Aggs.java

+3
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ public Aggs addGroups(Collection<GroupByKey> groups) {
112112
}
113113

114114
public Aggs addAgg(LeafAgg agg) {
115+
if (metricAggs.contains(agg)) {
116+
return this;
117+
}
115118
return new Aggs(groups, combine(metricAggs, agg), pipelineAggs);
116119
}
117120

x-pack/qa/sql/src/main/resources/agg.sql-spec

+9-1
Original file line numberDiff line numberDiff line change
@@ -394,4 +394,12 @@ SELECT MIN(salary) min, MAX(salary) max, gender g, languages l, COUNT(*) c FROM
394394
aggMultiWithHavingOnCount
395395
SELECT MIN(salary) min, MAX(salary) max, gender g, COUNT(*) c FROM "test_emp" WHERE languages > 0 GROUP BY g HAVING c > 40 ORDER BY gender;
396396
aggMultiGroupByMultiWithHavingOnCount
397-
SELECT MIN(salary) min, MAX(salary) max, gender g, languages l, COUNT(*) c FROM "test_emp" WHERE languages > 0 GROUP BY g, languages HAVING c > 40 ORDER BY gender, languages;
397+
SELECT MIN(salary) min, MAX(salary) max, gender g, languages l, COUNT(*) c FROM "test_emp" WHERE languages > 0 GROUP BY g, languages HAVING c > 40 ORDER BY gender, languages;
398+
399+
// repetion of same aggs to check whether the generated query contains duplicates or not
400+
aggRepeatFunctionAcrossFields
401+
SELECT MIN(emp_no) AS a, 1 + MIN(emp_no) AS b, ABS(MIN(emp_no)) AS c FROM test_emp;
402+
aggRepeatFunctionBetweenSelectAndHaving
403+
SELECT gender, COUNT(DISTINCT languages) AS c FROM test_emp GROUP BY gender HAVING count(DISTINCT languages) > 0 ORDER BY gender;
404+
405+

0 commit comments

Comments
 (0)