in iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java [1436:1574]
public Statement visitSelectStatement(IoTDBSqlParser.SelectStatementContext ctx) {
QueryStatement queryStatement = new QueryStatement();
// parse SELECT & FROM
queryStatement.setSelectComponent(parseSelectClause(ctx.selectClause(), queryStatement));
queryStatement.setFromComponent(parseFromClause(ctx.fromClause()));
// parse INTO
if (ctx.intoClause() != null) {
queryStatement.setIntoComponent(parseIntoClause(ctx.intoClause()));
}
// parse WHERE
if (ctx.whereClause() != null) {
queryStatement.setWhereCondition(parseWhereClause(ctx.whereClause()));
}
// parse GROUP BY
if (ctx.groupByClause() != null) {
Set<String> groupByKeys = new HashSet<>();
List<IoTDBSqlParser.GroupByAttributeClauseContext> groupByAttributes =
ctx.groupByClause().groupByAttributeClause();
for (IoTDBSqlParser.GroupByAttributeClauseContext groupByAttribute : groupByAttributes) {
if (groupByAttribute.TIME() != null || groupByAttribute.interval != null) {
if (groupByKeys.contains("COMMON")) {
throw new SemanticException(GROUP_BY_COMMON_ONLY_ONE_MSG);
}
groupByKeys.add("COMMON");
queryStatement.setGroupByTimeComponent(parseGroupByTimeClause(groupByAttribute));
} else if (groupByAttribute.LEVEL() != null) {
if (groupByKeys.contains("LEVEL")) {
throw new SemanticException("duplicated group by key: LEVEL");
}
groupByKeys.add("LEVEL");
queryStatement.setGroupByLevelComponent(parseGroupByLevelClause(groupByAttribute));
} else if (groupByAttribute.TAGS() != null) {
if (groupByKeys.contains("TAGS")) {
throw new SemanticException("duplicated group by key: TAGS");
}
groupByKeys.add("TAGS");
queryStatement.setGroupByTagComponent(parseGroupByTagClause(groupByAttribute));
} else if (groupByAttribute.VARIATION() != null) {
if (groupByKeys.contains("COMMON")) {
throw new SemanticException(GROUP_BY_COMMON_ONLY_ONE_MSG);
}
groupByKeys.add("COMMON");
queryStatement.setGroupByComponent(
parseGroupByClause(groupByAttribute, WindowType.VARIATION_WINDOW));
} else if (groupByAttribute.CONDITION() != null) {
if (groupByKeys.contains("COMMON")) {
throw new SemanticException(GROUP_BY_COMMON_ONLY_ONE_MSG);
}
groupByKeys.add("COMMON");
queryStatement.setGroupByComponent(
parseGroupByClause(groupByAttribute, WindowType.CONDITION_WINDOW));
} else if (groupByAttribute.SESSION() != null) {
if (groupByKeys.contains("COMMON")) {
throw new SemanticException(GROUP_BY_COMMON_ONLY_ONE_MSG);
}
groupByKeys.add("COMMON");
queryStatement.setGroupByComponent(
parseGroupByClause(groupByAttribute, WindowType.SESSION_WINDOW));
} else if (groupByAttribute.COUNT() != null) {
if (groupByKeys.contains("COMMON")) {
throw new SemanticException(GROUP_BY_COMMON_ONLY_ONE_MSG);
}
groupByKeys.add("COMMON");
queryStatement.setGroupByComponent(
parseGroupByClause(groupByAttribute, WindowType.COUNT_WINDOW));
} else {
throw new SemanticException("Unknown GROUP BY type.");
}
}
}
// parse HAVING
if (ctx.havingClause() != null) {
queryStatement.setHavingCondition(parseHavingClause(ctx.havingClause()));
}
// parse ORDER BY
if (ctx.orderByClause() != null) {
queryStatement.setOrderByComponent(
parseOrderByClause(
ctx.orderByClause(),
ImmutableSet.of(OrderByKey.TIME, OrderByKey.DEVICE, OrderByKey.TIMESERIES)));
}
// parse FILL
if (ctx.fillClause() != null) {
queryStatement.setFillComponent(parseFillClause(ctx.fillClause()));
}
// parse ALIGN BY
if (ctx.alignByClause() != null) {
queryStatement.setResultSetFormat(parseAlignBy(ctx.alignByClause()));
}
if (ctx.paginationClause() != null) {
// parse SLIMIT & SOFFSET
if (ctx.paginationClause().seriesPaginationClause() != null) {
if (ctx.paginationClause().seriesPaginationClause().slimitClause() != null) {
queryStatement.setSeriesLimit(
parseSLimitClause(ctx.paginationClause().seriesPaginationClause().slimitClause()));
}
if (ctx.paginationClause().seriesPaginationClause().soffsetClause() != null) {
queryStatement.setSeriesOffset(
parseSOffsetClause(ctx.paginationClause().seriesPaginationClause().soffsetClause()));
}
}
// parse LIMIT & OFFSET
if (ctx.paginationClause().rowPaginationClause() != null) {
if (ctx.paginationClause().rowPaginationClause().limitClause() != null) {
queryStatement.setRowLimit(
parseLimitClause(ctx.paginationClause().rowPaginationClause().limitClause()));
}
if (ctx.paginationClause().rowPaginationClause().offsetClause() != null) {
queryStatement.setRowOffset(
parseOffsetClause(ctx.paginationClause().rowPaginationClause().offsetClause()));
}
if (canPushDownLimitOffsetToGroupByTime(queryStatement)) {
pushDownLimitOffsetToTimeParameter(queryStatement, zoneId);
}
}
}
queryStatement.setUseWildcard(useWildcard);
queryStatement.setLastLevelUseWildcard(lastLevelUseWildcard);
return queryStatement;
}