Skip to content

Commit 73476e0

Browse files
authored
Fix back-quote remove of Select-Into query when query is not for raw data
1 parent 496c62e commit 73476e0

File tree

3 files changed

+65
-2
lines changed

3 files changed

+65
-2
lines changed

integration-test/src/test/java/org/apache/iotdb/db/it/selectinto/IoTDBSelectIntoIT.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,4 +806,53 @@ public void testNewDataType() {
806806
String expectedQueryHeader = "Time,root.db.d2.s7,root.db.d2.s8,root.db.d2.s9,root.db.d2.s10,";
807807
resultSetEqualTest("select s7,s8,s9,s10 from root.db.d2;", expectedQueryHeader, resultSet);
808808
}
809+
810+
// -------------------------------------- OTHER TEST -------------------------------------
811+
@Test
812+
public void testRemoveBackQuote() {
813+
String[] intoRetArray =
814+
new String[] {
815+
"count(root.sg.d1.s1),root.sg_agg1.d1.count_s1,1,",
816+
"last_value(root.sg.d1.s2),root.sg_agg1.d1.last_value_s2,1,",
817+
"count(root.sg.d2.s1),root.sg_agg1.d2.count_s1,1,",
818+
"last_value(root.sg.d2.s2),root.sg_agg1.d2.last_value_s2,1,"
819+
};
820+
resultSetEqualTest(
821+
"select count(d1.s1), last_value(d1.s2), count(d2.s1), last_value(d2.s2) "
822+
+ "into root.sg_agg1.`d1`(`count_s1`, last_value_s2), aligned root.sg_agg1.d2(count_s1, last_value_s2) "
823+
+ "from root.sg;",
824+
selectIntoHeader,
825+
intoRetArray);
826+
827+
String expectedQueryHeader =
828+
"Time,root.sg_agg1.d1.count_s1,root.sg_agg1.d2.count_s1,root.sg_agg1.d1.last_value_s2,root.sg_agg1.d2.last_value_s2,";
829+
String[] queryRetArray = new String[] {"0,10,7,12.0,11.0,"};
830+
resultSetEqualTest(
831+
"select count_s1, last_value_s2 from root.sg_agg1.d1, root.sg_agg1.d2;",
832+
expectedQueryHeader,
833+
queryRetArray);
834+
}
835+
836+
@Test
837+
public void testRemoveBackQuoteAlignByDevice() {
838+
String[] intoRetArray =
839+
new String[] {
840+
"root.sg.d1,count(s1),root.sg_abd_agg1.d1.count_s1,1,",
841+
"root.sg.d1,last_value(s2),root.sg_abd_agg1.d1.last_value_s2,1,"
842+
};
843+
resultSetEqualTest(
844+
"select count(s1), last_value(s2) "
845+
+ "into root.sg_abd_agg1.`d1`(`count_s1`, last_value_s2) "
846+
+ "from root.sg.d1 align by device;",
847+
selectIntoAlignByDeviceHeader,
848+
intoRetArray);
849+
850+
String expectedQueryHeader =
851+
"Time,root.sg_abd_agg1.d1.count_s1," + "root.sg_abd_agg1.d1.last_value_s2,";
852+
String[] queryRetArray = new String[] {"0,10,12.0,"};
853+
resultSetEqualTest(
854+
"select count_s1, last_value_s2 from root.sg_abd_agg1.d1, root.sg_abd_agg1.d2;",
855+
expectedQueryHeader,
856+
queryRetArray);
857+
}
809858
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,10 @@
221221
import static org.apache.iotdb.db.queryengine.plan.analyze.SelectIntoUtils.constructTargetDevice;
222222
import static org.apache.iotdb.db.queryengine.plan.analyze.SelectIntoUtils.constructTargetMeasurement;
223223
import static org.apache.iotdb.db.queryengine.plan.analyze.SelectIntoUtils.constructTargetPath;
224+
import static org.apache.iotdb.db.queryengine.plan.analyze.SelectIntoUtils.constructTargetPathWithoutPlaceHolder;
224225
import static org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.canPushDownLimitOffsetInGroupByTimeForDevice;
225226
import static org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.pushDownLimitOffsetInGroupByTimeForDevice;
227+
import static org.apache.iotdb.db.queryengine.plan.parser.ASTVisitor.parseNodeString;
226228
import static org.apache.iotdb.db.schemaengine.schemaregion.view.visitor.GetSourcePathsVisitor.getSourcePaths;
227229
import static org.apache.iotdb.db.storageengine.load.metrics.LoadTsFileCostMetricsSet.ANALYSIS;
228230
import static org.apache.iotdb.db.utils.constant.SqlConstant.COUNT_TIME_HEADER;
@@ -2371,7 +2373,7 @@ private void analyzeInto(
23712373
pair.right == null ? sourceColumn.getExpressionString() : pair.right),
23722374
measurementTemplate);
23732375
} else {
2374-
targetMeasurement = measurementTemplate;
2376+
targetMeasurement = parseNodeString(measurementTemplate);
23752377
}
23762378
deviceViewIntoPathDescriptor.specifyTargetDeviceMeasurement(
23772379
sourceDevice, targetDevice, sourceColumn.getExpressionString(), targetMeasurement);
@@ -2450,7 +2452,7 @@ private void analyzeInto(
24502452
}
24512453
targetPath = constructTargetPath(sourcePath, deviceTemplate, measurementTemplate);
24522454
} else {
2453-
targetPath = deviceTemplate.concatAsMeasurementPath(measurementTemplate);
2455+
targetPath = constructTargetPathWithoutPlaceHolder(deviceTemplate, measurementTemplate);
24542456
}
24552457
intoPathDescriptor.specifyTargetPath(sourceColumn, viewPath, targetPath);
24562458
intoPathDescriptor.specifyDeviceAlignment(

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/SelectIntoUtils.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,18 @@ private SelectIntoUtils() {
4848
// forbidding instantiation
4949
}
5050

51+
public static PartialPath constructTargetPathWithoutPlaceHolder(
52+
PartialPath devicePath, String measurement) {
53+
String[] originalDeviceNodes = devicePath.getNodes();
54+
String[] resNodes = new String[originalDeviceNodes.length + 1];
55+
56+
for (int i = 0; i < originalDeviceNodes.length; i++) {
57+
resNodes[i] = parseNodeString(originalDeviceNodes[i]);
58+
}
59+
resNodes[resNodes.length - 1] = parseNodeString(measurement);
60+
return new MeasurementPath(resNodes);
61+
}
62+
5163
public static PartialPath constructTargetPath(
5264
PartialPath sourcePath, PartialPath deviceTemplate, String measurementTemplate) {
5365
PartialPath targetDevice = constructTargetDevice(sourcePath.getDevicePath(), deviceTemplate);

0 commit comments

Comments
 (0)