Skip to content

Commit d34511a

Browse files
authored
Fix error in template + sort + offset + limit + align by device
1 parent 61fa8d6 commit d34511a

File tree

4 files changed

+38
-14
lines changed

4 files changed

+38
-14
lines changed

integration-test/src/test/java/org/apache/iotdb/db/it/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ public class IoTDBAlignByDeviceWithTemplateIT {
5959
"INSERT INTO root.sg2.d4(timestamp,s1,s2,s3) values(1,1111.1,true,1111), (5,5555.5,false,5555);",
6060
};
6161

62+
String[] expectedHeader;
63+
String[] retArray;
64+
6265
@BeforeClass
6366
public static void setUp() throws Exception {
6467
EnvFactory.getEnv().initClusterEnvironment();
@@ -70,11 +73,32 @@ public static void tearDown() throws Exception {
7073
EnvFactory.getEnv().cleanClusterEnvironment();
7174
}
7275

76+
@Test
77+
public void singleDeviceTest() {
78+
expectedHeader = new String[] {"Time,Device,s3,s1,s2"};
79+
retArray =
80+
new String[] {
81+
"1,root.sg1.d1,1,1.1,false,",
82+
};
83+
resultSetEqualTest(
84+
"SELECT * FROM root.sg1.d1 order by time desc offset 1 limit 1 ALIGN BY DEVICE;",
85+
expectedHeader,
86+
retArray);
87+
retArray =
88+
new String[] {
89+
"1,root.sg2.d1,1,1.1,false,",
90+
};
91+
resultSetEqualTest(
92+
"SELECT * FROM root.sg2.d1 order by time desc offset 1 limit 1 ALIGN BY DEVICE;",
93+
expectedHeader,
94+
retArray);
95+
}
96+
7397
@Test
7498
public void selectWildcardNoFilterTest() {
7599
// 1. order by device
76-
String[] expectedHeader = new String[] {"Time,Device,s3,s1,s2"};
77-
String[] retArray =
100+
expectedHeader = new String[] {"Time,Device,s3,s1,s2"};
101+
retArray =
78102
new String[] {
79103
"1,root.sg1.d1,1,1.1,false,",
80104
"2,root.sg1.d1,2,2.2,false,",

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -319,13 +319,16 @@ public Analysis visitQuery(QueryStatement queryStatement, MPPQueryContext contex
319319

320320
List<Pair<Expression, String>> outputExpressions;
321321
if (queryStatement.isAlignByDevice()) {
322-
if (TemplatedAnalyze.canBuildPlanUseTemplate(
323-
analysis, queryStatement, partitionFetcher, schemaTree, context)) {
322+
List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree);
323+
324+
if (deviceList.size() > 1
325+
&& TemplatedAnalyze.canBuildPlanUseTemplate(
326+
analysis, queryStatement, partitionFetcher, schemaTree, context, deviceList)) {
327+
// when device size is less than 1, there is no need to use template optimization, i.e. no
328+
// need to extract common variables
324329
return analysis;
325330
}
326331

327-
List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree);
328-
329332
if (canPushDownLimitOffsetInGroupByTimeForDevice(queryStatement)) {
330333
// remove the device which won't appear in resultSet after limit/offset
331334
deviceList =

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import static org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeDataPartition;
5555
import static org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeDeviceToWhere;
5656
import static org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeDeviceViewOutput;
57-
import static org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeFrom;
5857
import static org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.canPushDownLimitOffsetInGroupByTimeForDevice;
5958
import static org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.pushDownLimitOffsetInGroupByTimeForDevice;
6059
import static org.apache.iotdb.db.utils.constant.SqlConstant.COUNT_TIME;
@@ -68,7 +67,8 @@ static boolean canBuildAggregationPlanUseTemplate(
6867
IPartitionFetcher partitionFetcher,
6968
ISchemaTree schemaTree,
7069
MPPQueryContext context,
71-
Template template) {
70+
Template template,
71+
List<PartialPath> deviceList) {
7272

7373
// not support order by expression and non-aligned template
7474
if (queryStatement.hasOrderByExpression() || !template.isDirectAligned()) {
@@ -77,8 +77,6 @@ static boolean canBuildAggregationPlanUseTemplate(
7777

7878
analysis.setNoWhereAndAggregation(false);
7979

80-
List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree);
81-
8280
if (canPushDownLimitOffsetInGroupByTimeForDevice(queryStatement)) {
8381
// remove the device which won't appear in resultSet after limit/offset
8482
deviceList =

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ public static boolean canBuildPlanUseTemplate(
9797
QueryStatement queryStatement,
9898
IPartitionFetcher partitionFetcher,
9999
ISchemaTree schemaTree,
100-
MPPQueryContext context) {
100+
MPPQueryContext context,
101+
List<PartialPath> deviceList) {
101102
if (queryStatement.getGroupByComponent() != null
102103
|| queryStatement.isSelectInto()
103104
|| queryStatement.hasFill()
@@ -114,7 +115,7 @@ public static boolean canBuildPlanUseTemplate(
114115

115116
if (queryStatement.isAggregationQuery()) {
116117
return canBuildAggregationPlanUseTemplate(
117-
analysis, queryStatement, partitionFetcher, schemaTree, context, template);
118+
analysis, queryStatement, partitionFetcher, schemaTree, context, template, deviceList);
118119
}
119120

120121
List<Pair<Expression, String>> outputExpressions = new ArrayList<>();
@@ -174,8 +175,6 @@ public static boolean canBuildPlanUseTemplate(
174175

175176
analyzeSelect(queryStatement, analysis, outputExpressions, template);
176177

177-
List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree);
178-
179178
analyzeDeviceToWhere(analysis, queryStatement);
180179
if (analysis.getWhereExpression() != null
181180
&& analysis.getWhereExpression().equals(ConstantOperand.FALSE)) {

0 commit comments

Comments
 (0)