|
18 | 18 |
|
19 | 19 | import static com.amazon.opendistroforelasticsearch.sql.sql.antlr.parser.OpenDistroSQLParser.GroupByElementContext;
|
20 | 20 | import static com.amazon.opendistroforelasticsearch.sql.sql.antlr.parser.OpenDistroSQLParser.OrderByElementContext;
|
| 21 | +import static com.amazon.opendistroforelasticsearch.sql.sql.antlr.parser.OpenDistroSQLParser.SelectClauseContext; |
21 | 22 | import static com.amazon.opendistroforelasticsearch.sql.sql.antlr.parser.OpenDistroSQLParser.SelectElementContext;
|
22 | 23 | import static com.amazon.opendistroforelasticsearch.sql.sql.antlr.parser.OpenDistroSQLParser.SubqueryAsRelationContext;
|
23 | 24 | import static com.amazon.opendistroforelasticsearch.sql.sql.parser.ParserUtils.getTextInQuery;
|
|
34 | 35 | import com.amazon.opendistroforelasticsearch.sql.exception.SemanticCheckException;
|
35 | 36 | import com.amazon.opendistroforelasticsearch.sql.sql.antlr.parser.OpenDistroSQLParser.AggregateFunctionCallContext;
|
36 | 37 | import com.amazon.opendistroforelasticsearch.sql.sql.antlr.parser.OpenDistroSQLParser.QuerySpecificationContext;
|
| 38 | +import com.amazon.opendistroforelasticsearch.sql.sql.antlr.parser.OpenDistroSQLParser.SelectSpecContext; |
37 | 39 | import com.amazon.opendistroforelasticsearch.sql.sql.antlr.parser.OpenDistroSQLParserBaseVisitor;
|
38 | 40 | import com.amazon.opendistroforelasticsearch.sql.sql.parser.AstExpressionBuilder;
|
39 | 41 | import java.util.ArrayList;
|
@@ -181,6 +183,17 @@ public Void visitSubqueryAsRelation(SubqueryAsRelationContext ctx) {
|
181 | 183 | return null;
|
182 | 184 | }
|
183 | 185 |
|
| 186 | + @Override |
| 187 | + public Void visitSelectClause(SelectClauseContext ctx) { |
| 188 | + super.visitSelectClause(ctx); |
| 189 | + |
| 190 | + // SELECT DISTINCT is an equivalent and special form of GROUP BY |
| 191 | + if (isDistinct(ctx.selectSpec())) { |
| 192 | + groupByItems.addAll(selectItems); |
| 193 | + } |
| 194 | + return null; |
| 195 | + } |
| 196 | + |
184 | 197 | @Override
|
185 | 198 | public Void visitSelectElement(SelectElementContext ctx) {
|
186 | 199 | UnresolvedExpression expr = visitAstExpression(ctx.expression());
|
@@ -215,6 +228,10 @@ public Void visitAggregateFunctionCall(AggregateFunctionCallContext ctx) {
|
215 | 228 | return super.visitAggregateFunctionCall(ctx);
|
216 | 229 | }
|
217 | 230 |
|
| 231 | + private boolean isDistinct(SelectSpecContext ctx) { |
| 232 | + return (ctx != null) && (ctx.DISTINCT() != null); |
| 233 | + } |
| 234 | + |
218 | 235 | private SortOrder visitSortOrder(Token ctx) {
|
219 | 236 | if (ctx == null) {
|
220 | 237 | return null;
|
|
0 commit comments