This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch SelectIntoBug in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 27d6ff2ef5bad467c248f810163089075901dc78 Author: JackieTien97 <[email protected]> AuthorDate: Thu Aug 15 12:12:17 2024 +0800 Fix select into bug while using alias --- .../iotdb/db/it/selectinto/IoTDBSelectIntoIT.java | 21 +++++++++++++++++++++ .../db/queryengine/plan/analyze/AnalyzeVisitor.java | 17 ++++++++++++++--- .../apache/iotdb/db/utils/constant/SqlConstant.java | 3 +++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/selectinto/IoTDBSelectIntoIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/selectinto/IoTDBSelectIntoIT.java index 87be3ade269..f6dde78db7f 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/selectinto/IoTDBSelectIntoIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/selectinto/IoTDBSelectIntoIT.java @@ -570,6 +570,27 @@ public class IoTDBSelectIntoIT { queryRetArray); } + @Test + public void testAliasAlignByDevice() { + String[] intoRetArray = + new String[] { + "root.sg.d1,s1,root.sg_abd_alias.d1.k1,10,", + }; + resultSetEqualTest( + "select s1 as k1 " + "into root.sg_abd_alias.d1(::) from root.sg.d1 align by device;", + selectIntoAlignByDeviceHeader, + intoRetArray); + + intoRetArray = + new String[] { + "k1,root.sg_abd_alias.d2.k1,10,", + }; + resultSetEqualTest( + "select s1 as k1 " + "into root.sg_abd_alias.d2(::) from root.sg.d1;", + selectIntoHeader, + intoRetArray); + } + // -------------------------------------- CHECK EXCEPTION ------------------------------------- @Test diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java index 81c7ef4fd8a..226bd1ded87 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java @@ -207,6 +207,7 @@ import static org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushD import static org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.pushDownLimitOffsetInGroupByTimeForDevice; import static org.apache.iotdb.db.schemaengine.schemaregion.view.visitor.GetSourcePathsVisitor.getSourcePaths; import static org.apache.iotdb.db.utils.constant.SqlConstant.COUNT_TIME_HEADER; +import static org.apache.iotdb.db.utils.constant.SqlConstant.ROOT_DOT; /** This visitor is used to analyze each type of Statement and returns the {@link Analysis}. */ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> { @@ -2170,13 +2171,15 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> PartialPath targetDevice = constructTargetDevice(sourceDevice, deviceTemplate); deviceViewIntoPathDescriptor.specifyDeviceAlignment(targetDevice.toString(), isAlignedDevice); - for (Expression sourceColumn : sourceColumns) { + for (Pair<Expression, String> pair : outputExpressions) { + Expression sourceColumn = pair.left; String measurementTemplate = intoDeviceMeasurementIterator.getMeasurementTemplate(); String targetMeasurement; if (sourceColumn instanceof TimeSeriesOperand) { targetMeasurement = constructTargetMeasurement( - sourceDevice.concatAsMeasurementPath(sourceColumn.getExpressionString()), + sourceDevice.concatAsMeasurementPath( + pair.right == null ? sourceColumn.getExpressionString() : pair.right), measurementTemplate); } else { targetMeasurement = measurementTemplate; @@ -2228,6 +2231,8 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> IntoComponent.IntoPathIterator intoPathIterator = intoComponent.getIntoPathIterator(); for (Pair<Expression, String> pair : outputExpressions) { Expression sourceExpression = pair.left; + // if it's really view path, it should start with root. + // otherwise it should just be an alias String viewPath = pair.right; PartialPath deviceTemplate = intoPathIterator.getDeviceTemplate(); String measurementTemplate = intoPathIterator.getMeasurementTemplate(); @@ -2239,7 +2244,13 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> if (sourceExpression instanceof TimeSeriesOperand) { if (viewPath != null) { try { - sourcePath = new MeasurementPath(viewPath); + // if it's really view path, it should start with root. + if (viewPath.startsWith(ROOT_DOT)) { + sourcePath = new MeasurementPath(viewPath); + } else { + // otherwise it should just be an alias + sourcePath = new PartialPath(viewPath); + } } catch (IllegalPathException e) { throw new SemanticException( String.format( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/SqlConstant.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/SqlConstant.java index 8521e3ad2d1..ba3a4d86d72 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/SqlConstant.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/SqlConstant.java @@ -35,6 +35,9 @@ public class SqlConstant { public static final String NOW_FUNC = "now()"; public static final String ROOT = "root"; + + public static final String ROOT_DOT = "root."; + public static final String QUOTE = "'"; public static final String DQUOTE = "\""; public static final String BOOLEAN_TRUE = "true";
