This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new d34511a93f3 Fix error in template + sort + offset + limit + align by
device
d34511a93f3 is described below
commit d34511a93f32d347a193b142f8d19f8b3d8dd1c6
Author: Beyyes <[email protected]>
AuthorDate: Thu Dec 19 20:03:25 2024 +0800
Fix error in template + sort + offset + limit + align by device
---
.../IoTDBAlignByDeviceWithTemplateIT.java | 28 ++++++++++++++++++++--
.../queryengine/plan/analyze/AnalyzeVisitor.java | 11 +++++----
.../plan/analyze/TemplatedAggregationAnalyze.java | 6 ++---
.../queryengine/plan/analyze/TemplatedAnalyze.java | 7 +++---
4 files changed, 38 insertions(+), 14 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
index 05e2104b904..a71cb773713 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
@@ -59,6 +59,9 @@ public class IoTDBAlignByDeviceWithTemplateIT {
"INSERT INTO root.sg2.d4(timestamp,s1,s2,s3)
values(1,1111.1,true,1111), (5,5555.5,false,5555);",
};
+ String[] expectedHeader;
+ String[] retArray;
+
@BeforeClass
public static void setUp() throws Exception {
EnvFactory.getEnv().initClusterEnvironment();
@@ -70,11 +73,32 @@ public class IoTDBAlignByDeviceWithTemplateIT {
EnvFactory.getEnv().cleanClusterEnvironment();
}
+ @Test
+ public void singleDeviceTest() {
+ expectedHeader = new String[] {"Time,Device,s3,s1,s2"};
+ retArray =
+ new String[] {
+ "1,root.sg1.d1,1,1.1,false,",
+ };
+ resultSetEqualTest(
+ "SELECT * FROM root.sg1.d1 order by time desc offset 1 limit 1 ALIGN
BY DEVICE;",
+ expectedHeader,
+ retArray);
+ retArray =
+ new String[] {
+ "1,root.sg2.d1,1,1.1,false,",
+ };
+ resultSetEqualTest(
+ "SELECT * FROM root.sg2.d1 order by time desc offset 1 limit 1 ALIGN
BY DEVICE;",
+ expectedHeader,
+ retArray);
+ }
+
@Test
public void selectWildcardNoFilterTest() {
// 1. order by device
- String[] expectedHeader = new String[] {"Time,Device,s3,s1,s2"};
- String[] retArray =
+ expectedHeader = new String[] {"Time,Device,s3,s1,s2"};
+ retArray =
new String[] {
"1,root.sg1.d1,1,1.1,false,",
"2,root.sg1.d1,2,2.2,false,",
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 224d22520a0..ed441e9dc00 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
@@ -319,13 +319,16 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
List<Pair<Expression, String>> outputExpressions;
if (queryStatement.isAlignByDevice()) {
- if (TemplatedAnalyze.canBuildPlanUseTemplate(
- analysis, queryStatement, partitionFetcher, schemaTree, context)) {
+ List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree);
+
+ if (deviceList.size() > 1
+ && TemplatedAnalyze.canBuildPlanUseTemplate(
+ analysis, queryStatement, partitionFetcher, schemaTree,
context, deviceList)) {
+ // when device size is less than 1, there is no need to use template
optimization, i.e. no
+ // need to extract common variables
return analysis;
}
- List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree);
-
if (canPushDownLimitOffsetInGroupByTimeForDevice(queryStatement)) {
// remove the device which won't appear in resultSet after
limit/offset
deviceList =
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java
index 495d144a80d..dc7df32007f 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java
@@ -54,7 +54,6 @@ import static
org.apache.iotdb.db.queryengine.plan.analyze.ExpressionAnalyzer.se
import static
org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeDataPartition;
import static
org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeDeviceToWhere;
import static
org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeDeviceViewOutput;
-import static
org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeFrom;
import static
org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.canPushDownLimitOffsetInGroupByTimeForDevice;
import static
org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.pushDownLimitOffsetInGroupByTimeForDevice;
import static org.apache.iotdb.db.utils.constant.SqlConstant.COUNT_TIME;
@@ -68,7 +67,8 @@ public class TemplatedAggregationAnalyze {
IPartitionFetcher partitionFetcher,
ISchemaTree schemaTree,
MPPQueryContext context,
- Template template) {
+ Template template,
+ List<PartialPath> deviceList) {
// not support order by expression and non-aligned template
if (queryStatement.hasOrderByExpression() || !template.isDirectAligned()) {
@@ -77,8 +77,6 @@ public class TemplatedAggregationAnalyze {
analysis.setNoWhereAndAggregation(false);
- List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree);
-
if (canPushDownLimitOffsetInGroupByTimeForDevice(queryStatement)) {
// remove the device which won't appear in resultSet after limit/offset
deviceList =
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
index c1f0971b293..ea70fcb0e3a 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
@@ -97,7 +97,8 @@ public class TemplatedAnalyze {
QueryStatement queryStatement,
IPartitionFetcher partitionFetcher,
ISchemaTree schemaTree,
- MPPQueryContext context) {
+ MPPQueryContext context,
+ List<PartialPath> deviceList) {
if (queryStatement.getGroupByComponent() != null
|| queryStatement.isSelectInto()
|| queryStatement.hasFill()
@@ -114,7 +115,7 @@ public class TemplatedAnalyze {
if (queryStatement.isAggregationQuery()) {
return canBuildAggregationPlanUseTemplate(
- analysis, queryStatement, partitionFetcher, schemaTree, context,
template);
+ analysis, queryStatement, partitionFetcher, schemaTree, context,
template, deviceList);
}
List<Pair<Expression, String>> outputExpressions = new ArrayList<>();
@@ -174,8 +175,6 @@ public class TemplatedAnalyze {
analyzeSelect(queryStatement, analysis, outputExpressions, template);
- List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree);
-
analyzeDeviceToWhere(analysis, queryStatement);
if (analysis.getWhereExpression() != null
&& analysis.getWhereExpression().equals(ConstantOperand.FALSE)) {