This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch lmh/FixAliasBug in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 6eb159741d0524a2ea44ae01223965b88db936c6 Author: liuminghui233 <[email protected]> AuthorDate: Sun Apr 9 21:57:51 2023 +0800 fix --- .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 20 ++++++++++++-------- .../db/mpp/plan/analyze/ConcatPathRewriter.java | 8 -------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java index 939417253c..cad032697d 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java @@ -432,26 +432,23 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> private Map<Integer, List<Pair<Expression, String>>> analyzeSelect( Analysis analysis, QueryStatement queryStatement, ISchemaTree schemaTree) { Map<Integer, List<Pair<Expression, String>>> outputExpressionMap = new HashMap<>(); + boolean isGroupByLevel = queryStatement.isGroupByLevel(); ColumnPaginationController paginationController = new ColumnPaginationController( queryStatement.getSeriesLimit(), queryStatement.getSeriesOffset(), queryStatement.isLastQuery() || isGroupByLevel); + + Set<String> aliasSet = new HashSet<>(); + int columnIndex = 0; for (ResultColumn resultColumn : queryStatement.getSelectComponent().getResultColumns()) { List<Pair<Expression, String>> outputExpressions = new ArrayList<>(); + boolean hasAlias = resultColumn.hasAlias(); List<Expression> resultExpressions = ExpressionAnalyzer.removeWildcardInExpression(resultColumn.getExpression(), schemaTree); - if (hasAlias - && !queryStatement.isGroupByLevel() - && !queryStatement.isGroupByTag() - && resultExpressions.size() > 1) { - throw new SemanticException( - String.format( - "alias '%s' can only be matched with one time series", resultColumn.getAlias())); - } for (Expression expression : resultExpressions) { if (paginationController.hasCurOffset()) { paginationController.consumeOffset(); @@ -472,6 +469,13 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> ? expression.getExpressionString() : null; alias = hasAlias ? resultColumn.getAlias() : alias; + if (hasAlias) { + if (aliasSet.contains(alias)) { + throw new SemanticException( + String.format("alias '%s' can only be matched with one time series", alias)); + } + aliasSet.add(alias); + } analyzeExpression(analysis, expressionWithoutAlias); outputExpressions.add(new Pair<>(expressionWithoutAlias, alias)); } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ConcatPathRewriter.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ConcatPathRewriter.java index e5ffd54285..1dca937376 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ConcatPathRewriter.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ConcatPathRewriter.java @@ -20,7 +20,6 @@ package org.apache.iotdb.db.mpp.plan.analyze; import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.commons.path.PathPatternTree; -import org.apache.iotdb.db.exception.sql.SemanticException; import org.apache.iotdb.db.exception.sql.StatementAnalyzeException; import org.apache.iotdb.db.mpp.plan.expression.Expression; import org.apache.iotdb.db.mpp.plan.statement.Statement; @@ -105,16 +104,9 @@ public class ConcatPathRewriter { // resultColumns after concat List<ResultColumn> resultColumns = new ArrayList<>(); for (ResultColumn resultColumn : selectComponent.getResultColumns()) { - boolean needAliasCheck = resultColumn.hasAlias() && !isGroupByLevel; List<Expression> resultExpressions = ExpressionAnalyzer.concatExpressionWithSuffixPaths( resultColumn.getExpression(), prefixPaths, patternTree); - if (needAliasCheck && resultExpressions.size() > 1) { - throw new SemanticException( - String.format( - "alias '%s' can only be matched with one time series", resultColumn.getAlias())); - } - for (Expression resultExpression : resultExpressions) { resultColumns.add( new ResultColumn(
