This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch lmh/fixWhere in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit b4e28c676ce79d2f480e19e0ffc77f4c18163f66 Author: Minghui Liu <[email protected]> AuthorDate: Thu Dec 8 16:03:14 2022 +0800 add output type check for WHERE & HAVING clause --- .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 38 ++++++++++++++++++---- 1 file changed, 32 insertions(+), 6 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 aff917599b..81910ef650 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 @@ -569,8 +569,13 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> Expression havingExpression = ExpressionUtils.constructQueryFilter( conJunctions.stream().distinct().collect(Collectors.toList())); - analyzeExpression(analysis, havingExpression); - + TSDataType outputType = analyzeExpression(analysis, havingExpression); + if (outputType != TSDataType.BOOLEAN) { + throw new SemanticException( + String.format( + "The output type of the expression in HAVING clause should be BOOLEAN, actual data type: %s.", + outputType)); + } analysis.setHavingExpression(havingExpression); } @@ -610,7 +615,13 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> } havingExpression = ExpressionUtils.constructQueryFilter(new ArrayList<>(conJunctions)); - analyzeExpression(analysis, havingExpression); + TSDataType outputType = analyzeExpression(analysis, havingExpression); + if (outputType != TSDataType.BOOLEAN) { + throw new SemanticException( + String.format( + "The output type of the expression in HAVING clause should be BOOLEAN, actual data type: %s.", + outputType)); + } analysis.setHavingExpression(havingExpression); } @@ -962,8 +973,16 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> } throw e; } + + TSDataType outputType = analyzeExpression(analysis, whereExpression); + if (outputType != TSDataType.BOOLEAN) { + throw new SemanticException( + String.format( + "The output type of the expression in WHERE clause should be BOOLEAN, actual data type: %s.", + outputType)); + } + deviceToWhereExpression.put(devicePath.getFullPath(), whereExpression); - analyzeExpression(analysis, whereExpression); } analysis.setDeviceToWhereExpression(deviceToWhereExpression); } @@ -982,7 +1001,13 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> Expression whereExpression = ExpressionUtils.constructQueryFilter( conJunctions.stream().distinct().collect(Collectors.toList())); - analyzeExpression(analysis, whereExpression); + TSDataType outputType = analyzeExpression(analysis, whereExpression); + if (outputType != TSDataType.BOOLEAN) { + throw new SemanticException( + String.format( + "The output type of the expression in WHERE clause should be BOOLEAN, actual data type: %s.", + outputType)); + } analysis.setWhereExpression(whereExpression); } @@ -1093,8 +1118,9 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> analysis.setMergeOrderParameter(new OrderByParameter(queryStatement.getSortItemList())); } - private void analyzeExpression(Analysis analysis, Expression expression) { + private TSDataType analyzeExpression(Analysis analysis, Expression expression) { ExpressionTypeAnalyzer.analyzeExpression(analysis, expression); + return analysis.getType(expression); } private void analyzeGroupBy(Analysis analysis, QueryStatement queryStatement) {
