This is an automated email from the ASF dual-hosted git repository.

jackietien pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/dev/1.3 by this push:
     new 9ae3d24d710 [To dev/1.3] Fix group by nature month when timezone is 
not default
9ae3d24d710 is described below

commit 9ae3d24d7106ee55ee6905960e1f19c839e8a71e
Author: Weihao Li <[email protected]>
AuthorDate: Thu Dec 12 16:35:27 2024 +0800

    [To dev/1.3] Fix group by nature month when timezone is not default
---
 .../iotdb/it/env/cluster/env/AbstractEnv.java      | 16 +++++++
 .../iotdb/it/env/remote/env/RemoteServerEnv.java   | 14 ++++++
 .../java/org/apache/iotdb/itbase/env/BaseEnv.java  |  3 ++
 .../db/it/groupby/IoTDBGroupByNaturalMonthIT.java  | 28 ++++++++++++
 .../protocol/thrift/impl/ClientRPCServiceImpl.java |  4 +-
 .../timerangeiterator/AggrWindowIterator.java      | 26 +++++++----
 .../PreAggrWindowWithNaturalMonthIterator.java     |  8 +++-
 .../TimeRangeIteratorFactory.java                  |  9 ++--
 .../execution/operator/AggregationUtil.java        |  7 ++-
 .../process/SlidingWindowAggregationOperator.java  |  7 ++-
 .../queryengine/plan/analyze/AnalyzeVisitor.java   |  4 +-
 .../plan/analyze/TemplatedAggregationAnalyze.java  |  4 +-
 .../plan/optimization/LimitOffsetPushDown.java     | 20 +++++---
 .../db/queryengine/plan/parser/ASTVisitor.java     |  2 +-
 .../plan/planner/OperatorTreeGenerator.java        | 31 +++++++------
 .../org/apache/iotdb/db/utils/DateTimeUtils.java   |  9 ++--
 .../aggregation/TimeRangeIteratorTest.java         | 53 +++++++++++++---------
 .../operator/AggregationOperatorTest.java          |  7 +--
 .../AlignedSeriesAggregationScanOperatorTest.java  |  3 +-
 .../operator/HorizontallyConcatOperatorTest.java   |  5 +-
 .../execution/operator/LastQueryOperatorTest.java  |  9 ++--
 .../operator/LastQuerySortOperatorTest.java        |  9 ++--
 .../execution/operator/OperatorMemoryTest.java     | 16 +++++--
 .../operator/RawDataAggregationOperatorTest.java   |  3 +-
 .../SeriesAggregationScanOperatorTest.java         |  3 +-
 .../SlidingWindowAggregationOperatorTest.java      |  8 ++--
 .../operator/UpdateLastCacheOperatorTest.java      |  3 +-
 .../plan/optimization/LimitOffsetPushDownTest.java | 11 ++++-
 28 files changed, 226 insertions(+), 96 deletions(-)

diff --git 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AbstractEnv.java
 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AbstractEnv.java
index 92cb39765c6..0374091e40f 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AbstractEnv.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AbstractEnv.java
@@ -64,6 +64,7 @@ import java.io.IOException;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
@@ -470,6 +471,21 @@ public abstract class AbstractEnv implements BaseEnv {
     return session;
   }
 
+  @Override
+  public ISession getSessionConnection(ZoneId zoneId) throws 
IoTDBConnectionException {
+    DataNodeWrapper dataNode =
+        
this.dataNodeWrapperList.get(rand.nextInt(this.dataNodeWrapperList.size()));
+    Session session =
+        new Session(
+            dataNode.getIp(),
+            dataNode.getPort(),
+            SessionConfig.DEFAULT_USER,
+            SessionConfig.DEFAULT_PASSWORD,
+            zoneId);
+    session.open();
+    return session;
+  }
+
   @Override
   public ISession getSessionConnection(String userName, String password)
       throws IoTDBConnectionException {
diff --git 
a/integration-test/src/main/java/org/apache/iotdb/it/env/remote/env/RemoteServerEnv.java
 
b/integration-test/src/main/java/org/apache/iotdb/it/env/remote/env/RemoteServerEnv.java
index 267da926592..907fc39605d 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/it/env/remote/env/RemoteServerEnv.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/it/env/remote/env/RemoteServerEnv.java
@@ -47,6 +47,7 @@ import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.sql.Statement;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -225,6 +226,19 @@ public class RemoteServerEnv implements BaseEnv {
     return session;
   }
 
+  @Override
+  public ISession getSessionConnection(ZoneId zoneId) throws 
IoTDBConnectionException {
+    Session session =
+        new Session(
+            ip_addr,
+            Integer.parseInt(port),
+            SessionConfig.DEFAULT_USER,
+            SessionConfig.DEFAULT_PASSWORD,
+            zoneId);
+    session.open();
+    return session;
+  }
+
   public ISession getSessionConnection(String userName, String password)
       throws IoTDBConnectionException {
     Session session = new Session(ip_addr, Integer.parseInt(port), userName, 
password);
diff --git 
a/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java 
b/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java
index 3b9b27de851..88f9f766783 100644
--- a/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java
+++ b/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java
@@ -39,6 +39,7 @@ import java.net.HttpURLConnection;
 import java.net.URL;
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.time.ZoneId;
 import java.util.List;
 import java.util.Optional;
 
@@ -147,6 +148,8 @@ public interface BaseEnv {
 
   ISession getSessionConnection() throws IoTDBConnectionException;
 
+  ISession getSessionConnection(ZoneId zoneId) throws IoTDBConnectionException;
+
   ISession getSessionConnection(String userName, String password) throws 
IoTDBConnectionException;
 
   ISession getSessionConnection(List<String> nodeUrls) throws 
IoTDBConnectionException;
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByNaturalMonthIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByNaturalMonthIT.java
index e08eb4c5f1d..9d56acf518f 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByNaturalMonthIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/groupby/IoTDBGroupByNaturalMonthIT.java
@@ -18,6 +18,8 @@
  */
 package org.apache.iotdb.db.it.groupby;
 
+import org.apache.iotdb.isession.ISession;
+import org.apache.iotdb.isession.SessionDataSet;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.ClusterIT;
@@ -49,6 +51,7 @@ import static 
org.apache.iotdb.db.it.utils.TestUtils.resultSetEqualTest;
 import static org.apache.iotdb.db.utils.constant.TestConstant.sum;
 import static org.apache.iotdb.itbase.constant.TestConstant.TIMESTAMP_STR;
 import static org.apache.iotdb.itbase.constant.TestConstant.count;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
@@ -75,6 +78,8 @@ public class IoTDBGroupByNaturalMonthIT {
         calendar.add(Calendar.MONTH, 1), i = calendar.getTimeInMillis()) {
       dataSet.add("insert into root.test.d1(timestamp, s1) values (" + i + ", 
1)");
     }
+
+    dataSet.add("insert into root.testTimeZone.d1(timestamp, s1) values (1, 
1)");
   }
 
   protected static final DateFormat df = new 
SimpleDateFormat("MM/dd/yyyy:HH:mm:ss");
@@ -413,4 +418,27 @@ public class IoTDBGroupByNaturalMonthIT {
         null,
         currPrecision);
   }
+
+  @Test
+  public void groupByNaturalMonthWithNonSystemDefaultTimeZone() {
+    try (ISession session =
+        
EnvFactory.getEnv().getSessionConnection(TimeZone.getTimeZone("UTC+09:00").toZoneId()))
 {
+
+      SessionDataSet sessionDataSet =
+          session.executeQueryStatement(
+              "select count(s1) from root.testTimeZone.d1 group 
by([2024-07-01, 2024-08-01), 1mo)");
+
+      int count = 0;
+      while (sessionDataSet.hasNext()) {
+        sessionDataSet.next();
+        count++;
+      }
+      assertEquals(1, count);
+
+      sessionDataSet.closeOperationHandle();
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
index e7b9d19b4e5..20a80ce683d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
@@ -722,7 +722,7 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
               scanOptionsBuilder.build(),
               driverContext.getOperatorContexts().get(0),
               Collections.singletonList(aggregator),
-              initTimeRangeIterator(groupByTimeParameter, true, true),
+              initTimeRangeIterator(groupByTimeParameter, true, true, 
sessionInfo.getZoneId()),
               groupByTimeParameter,
               DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
               !TSDataType.BLOB.equals(dataType)
@@ -738,7 +738,7 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
               scanOptionsBuilder.build(),
               driverContext.getOperatorContexts().get(0),
               Collections.singletonList(aggregator),
-              initTimeRangeIterator(groupByTimeParameter, true, true),
+              initTimeRangeIterator(groupByTimeParameter, true, true, 
sessionInfo.getZoneId()),
               groupByTimeParameter,
               DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
               !TSDataType.BLOB.equals(dataType)
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/timerangeiterator/AggrWindowIterator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/timerangeiterator/AggrWindowIterator.java
index b2dfc4909eb..e9847f814cf 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/timerangeiterator/AggrWindowIterator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/timerangeiterator/AggrWindowIterator.java
@@ -25,6 +25,8 @@ import org.apache.iotdb.db.utils.TimestampPrecisionUtils;
 import org.apache.tsfile.read.common.TimeRange;
 import org.apache.tsfile.utils.TimeDuration;
 
+import java.time.ZoneId;
+
 /**
  * This class iteratively generates aggregated time windows.
  *
@@ -46,6 +48,8 @@ public class AggrWindowIterator implements ITimeRangeIterator 
{
   // The number of current timeRange, it's used to calculate the cpu when 
there contains month
   private int timeRangeCount;
 
+  private final ZoneId zoneId;
+
   @SuppressWarnings("squid:S107")
   public AggrWindowIterator(
       long startTime,
@@ -53,7 +57,8 @@ public class AggrWindowIterator implements ITimeRangeIterator 
{
       TimeDuration interval,
       TimeDuration slidingStep,
       boolean isAscending,
-      boolean leftCRightO) {
+      boolean leftCRightO,
+      ZoneId zoneId) {
     this.startTime = startTime;
     this.endTime = endTime;
     this.interval = interval;
@@ -61,6 +66,7 @@ public class AggrWindowIterator implements ITimeRangeIterator 
{
     this.isAscending = isAscending;
     this.leftCRightO = leftCRightO;
     this.timeRangeCount = 0;
+    this.zoneId = zoneId;
   }
 
   @Override
@@ -78,7 +84,7 @@ public class AggrWindowIterator implements ITimeRangeIterator 
{
       // calculate interval length by natural month based on startTime
       // ie. startTIme = 1/31, interval = 1mo, curEndTime will be set to 2/29
       retEndTime =
-          Math.min(DateTimeUtils.calcPositiveIntervalByMonth(startTime, 
interval), endTime);
+          Math.min(DateTimeUtils.calcPositiveIntervalByMonth(startTime, 
interval, zoneId), endTime);
     } else {
       retEndTime = Math.min(startTime + interval.nonMonthDuration, endTime);
     }
@@ -99,14 +105,14 @@ public class AggrWindowIterator implements 
ITimeRangeIterator {
                       / 
(slidingStep.getMaxTotalDuration(TimestampPrecisionUtils.currPrecision)));
       long tempRetStartTime =
           DateTimeUtils.calcPositiveIntervalByMonth(
-              startTime, slidingStep.multiple(intervalNum - 1));
+              startTime, slidingStep.multiple(intervalNum - 1), zoneId);
       retStartTime = tempRetStartTime;
       while (tempRetStartTime < endTime) {
         intervalNum++;
         retStartTime = tempRetStartTime;
         tempRetStartTime =
             DateTimeUtils.calcPositiveIntervalByMonth(
-                retStartTime, slidingStep.multiple(intervalNum - 1));
+                retStartTime, slidingStep.multiple(intervalNum - 1), zoneId);
       }
       intervalNum -= 1;
     } else {
@@ -120,7 +126,7 @@ public class AggrWindowIterator implements 
ITimeRangeIterator {
       retEndTime =
           Math.min(
               DateTimeUtils.calcPositiveIntervalByMonth(
-                  startTime, interval.merge(slidingStep.multiple(intervalNum - 
1))),
+                  startTime, interval.merge(slidingStep.multiple(intervalNum - 
1)), zoneId),
               endTime);
     } else {
       retEndTime = Math.min(retStartTime + interval.nonMonthDuration, endTime);
@@ -147,7 +153,7 @@ public class AggrWindowIterator implements 
ITimeRangeIterator {
       if (slidingStep.containsMonth()) {
         retStartTime =
             DateTimeUtils.calcPositiveIntervalByMonth(
-                startTime, slidingStep.multiple(timeRangeCount));
+                startTime, slidingStep.multiple(timeRangeCount), zoneId);
       } else {
         retStartTime = curStartTime + slidingStep.nonMonthDuration;
       }
@@ -171,7 +177,7 @@ public class AggrWindowIterator implements 
ITimeRangeIterator {
     if (interval.containsMonth()) {
       retEndTime =
           DateTimeUtils.calcPositiveIntervalByMonth(
-              startTime, slidingStep.multiple(timeRangeCount).merge(interval));
+              startTime, slidingStep.multiple(timeRangeCount).merge(interval), 
zoneId);
     } else {
       retEndTime = retStartTime + interval.nonMonthDuration;
     }
@@ -213,11 +219,13 @@ public class AggrWindowIterator implements 
ITimeRangeIterator {
                   (double) queryRange
                       / 
(slidingStep.getMaxTotalDuration(TimestampPrecisionUtils.currPrecision)));
       long retStartTime =
-          DateTimeUtils.calcPositiveIntervalByMonth(startTime, 
slidingStep.multiple(intervalNum));
+          DateTimeUtils.calcPositiveIntervalByMonth(
+              startTime, slidingStep.multiple(intervalNum), zoneId);
       while (retStartTime < endTime) {
         intervalNum++;
         retStartTime =
-            DateTimeUtils.calcPositiveIntervalByMonth(startTime, 
slidingStep.multiple(intervalNum));
+            DateTimeUtils.calcPositiveIntervalByMonth(
+                startTime, slidingStep.multiple(intervalNum), zoneId);
       }
     } else {
       intervalNum = (long) Math.ceil(queryRange / (double) 
slidingStep.nonMonthDuration);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/timerangeiterator/PreAggrWindowWithNaturalMonthIterator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/timerangeiterator/PreAggrWindowWithNaturalMonthIterator.java
index a99583f62af..a4a0aa62611 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/timerangeiterator/PreAggrWindowWithNaturalMonthIterator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/timerangeiterator/PreAggrWindowWithNaturalMonthIterator.java
@@ -24,6 +24,8 @@ import org.apache.iotdb.db.utils.datastructure.TimeSelector;
 import org.apache.tsfile.read.common.TimeRange;
 import org.apache.tsfile.utils.TimeDuration;
 
+import java.time.ZoneId;
+
 public class PreAggrWindowWithNaturalMonthIterator implements 
ITimeRangeIterator {
 
   private static final int HEAP_MAX_SIZE = 100;
@@ -46,11 +48,13 @@ public class PreAggrWindowWithNaturalMonthIterator 
implements ITimeRangeIterator
       TimeDuration interval,
       TimeDuration slidingStep,
       boolean isAscending,
-      boolean leftCRightO) {
+      boolean leftCRightO,
+      ZoneId zoneId) {
     this.isAscending = isAscending;
     this.timeBoundaryHeap = new TimeSelector(HEAP_MAX_SIZE, isAscending);
     this.aggrWindowIterator =
-        new AggrWindowIterator(startTime, endTime, interval, slidingStep, 
isAscending, leftCRightO);
+        new AggrWindowIterator(
+            startTime, endTime, interval, slidingStep, isAscending, 
leftCRightO, zoneId);
     this.leftCRightO = leftCRightO;
     initHeap();
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/timerangeiterator/TimeRangeIteratorFactory.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/timerangeiterator/TimeRangeIteratorFactory.java
index 8bf06fd2668..7331971b4a6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/timerangeiterator/TimeRangeIteratorFactory.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/timerangeiterator/TimeRangeIteratorFactory.java
@@ -23,6 +23,8 @@ import org.apache.iotdb.db.utils.TimestampPrecisionUtils;
 
 import org.apache.tsfile.utils.TimeDuration;
 
+import java.time.ZoneId;
+
 public class TimeRangeIteratorFactory {
 
   private TimeRangeIteratorFactory() {}
@@ -40,7 +42,8 @@ public class TimeRangeIteratorFactory {
       TimeDuration slidingStep,
       boolean isAscending,
       boolean leftCRightO,
-      boolean outputPartialTimeWindow) {
+      boolean outputPartialTimeWindow,
+      ZoneId zoneId) {
     if (outputPartialTimeWindow
         && interval.getTotalDuration(TimestampPrecisionUtils.currPrecision)
             > 
slidingStep.getTotalDuration(TimestampPrecisionUtils.currPrecision)) {
@@ -54,11 +57,11 @@ public class TimeRangeIteratorFactory {
             leftCRightO);
       } else {
         return new PreAggrWindowWithNaturalMonthIterator(
-            startTime, endTime, interval, slidingStep, isAscending, 
leftCRightO);
+            startTime, endTime, interval, slidingStep, isAscending, 
leftCRightO, zoneId);
       }
     } else {
       return new AggrWindowIterator(
-          startTime, endTime, interval, slidingStep, isAscending, leftCRightO);
+          startTime, endTime, interval, slidingStep, isAscending, leftCRightO, 
zoneId);
     }
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/AggregationUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/AggregationUtil.java
index 96c36fe8fcd..8340a0ca407 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/AggregationUtil.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/AggregationUtil.java
@@ -46,6 +46,7 @@ import org.apache.tsfile.read.common.block.column.TimeColumn;
 import org.apache.tsfile.read.common.block.column.TimeColumnBuilder;
 import org.apache.tsfile.utils.Pair;
 
+import java.time.ZoneId;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -72,7 +73,8 @@ public class AggregationUtil {
   public static ITimeRangeIterator initTimeRangeIterator(
       GroupByTimeParameter groupByTimeParameter,
       boolean ascending,
-      boolean outputPartialTimeWindow) {
+      boolean outputPartialTimeWindow,
+      ZoneId zoneId) {
     if (groupByTimeParameter == null) {
       return new SingleTimeWindowIterator(Long.MIN_VALUE, Long.MAX_VALUE);
     } else {
@@ -83,7 +85,8 @@ public class AggregationUtil {
           groupByTimeParameter.getSlidingStep(),
           ascending,
           groupByTimeParameter.isLeftCRightO(),
-          outputPartialTimeWindow);
+          outputPartialTimeWindow,
+          zoneId);
     }
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/SlidingWindowAggregationOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/SlidingWindowAggregationOperator.java
index 9a1de9522af..c7e5769d675 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/SlidingWindowAggregationOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/SlidingWindowAggregationOperator.java
@@ -32,6 +32,7 @@ import org.apache.tsfile.read.common.TimeRange;
 import org.apache.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.tsfile.utils.RamUsageEstimator;
 
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -61,7 +62,8 @@ public class SlidingWindowAggregationOperator extends 
SingleInputAggregationOper
       boolean ascending,
       boolean outputEndTime,
       GroupByTimeParameter groupByTimeParameter,
-      long maxReturnSize) {
+      long maxReturnSize,
+      ZoneId zoneId) {
     super(operatorContext, aggregators, child, ascending, maxReturnSize);
     checkArgument(
         groupByTimeParameter != null,
@@ -78,7 +80,8 @@ public class SlidingWindowAggregationOperator extends 
SingleInputAggregationOper
 
     this.timeRangeIterator = timeRangeIterator;
     this.outputEndTime = outputEndTime;
-    this.subTimeRangeIterator = initTimeRangeIterator(groupByTimeParameter, 
ascending, true);
+    this.subTimeRangeIterator =
+        initTimeRangeIterator(groupByTimeParameter, ascending, true, zoneId);
   }
 
   @Override
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 05c915b9081..e34fa1e0930 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
@@ -315,7 +315,9 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
 
         if (canPushDownLimitOffsetInGroupByTimeForDevice(queryStatement)) {
           // remove the device which won't appear in resultSet after 
limit/offset
-          deviceList = pushDownLimitOffsetInGroupByTimeForDevice(deviceList, 
queryStatement);
+          deviceList =
+              pushDownLimitOffsetInGroupByTimeForDevice(
+                  deviceList, queryStatement, context.getZoneId());
         }
 
         outputExpressions =
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 79f8ba0a8c1..a9ca34196ad 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
@@ -80,7 +80,9 @@ public class TemplatedAggregationAnalyze {
 
     if (canPushDownLimitOffsetInGroupByTimeForDevice(queryStatement)) {
       // remove the device which won't appear in resultSet after limit/offset
-      deviceList = pushDownLimitOffsetInGroupByTimeForDevice(deviceList, 
queryStatement);
+      deviceList =
+          pushDownLimitOffsetInGroupByTimeForDevice(
+              deviceList, queryStatement, context.getZoneId());
     }
 
     List<Pair<Expression, String>> outputExpressions = new ArrayList<>();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
index df73a23dd18..16624e203f4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDown.java
@@ -46,9 +46,11 @@ import org.apache.iotdb.db.utils.DateTimeUtils;
 
 import org.apache.tsfile.utils.TimeDuration;
 
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.TimeZone;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -270,7 +272,7 @@ public class LimitOffsetPushDown implements PlanOptimizer {
   }
 
   private static void pushDownLimitOffsetToTimeParameterContainingMonth(
-      QueryStatement queryStatement) {
+      QueryStatement queryStatement, ZoneId zoneId) {
     GroupByTimeComponent groupByTimeComponent = 
queryStatement.getGroupByTimeComponent();
     long startTime = groupByTimeComponent.getStartTime();
     long endTime = groupByTimeComponent.getEndTime();
@@ -283,9 +285,11 @@ public class LimitOffsetPushDown implements PlanOptimizer {
     long totalStep = slidingStep.getMinTotalDuration(TimeUnit.MILLISECONDS);
     long size = (endTime - startTime + totalStep - 1) / totalStep;
     if (size > offsetSize) {
+      TimeZone timeZone = TimeZone.getTimeZone(zoneId);
       // ordering in group by month must be ascending
       long newStartTime =
-          DateTimeUtils.calcPositiveIntervalByMonth(startTime, 
slidingStep.multiple(offsetSize));
+          DateTimeUtils.calcPositiveIntervalByMonth(
+              startTime, slidingStep.multiple(offsetSize), zoneId);
 
       if (limitSize != 0) {
         endTime =
@@ -293,7 +297,8 @@ public class LimitOffsetPushDown implements PlanOptimizer {
                 endTime,
                 DateTimeUtils.calcPositiveIntervalByMonth(
                     startTime,
-                    calculateEndTimeDuration(slidingStep, interval, limitSize, 
offsetSize)));
+                    calculateEndTimeDuration(slidingStep, interval, limitSize, 
offsetSize),
+                    zoneId));
       }
       groupByTimeComponent.setEndTime(endTime);
       groupByTimeComponent.setStartTime(newStartTime);
@@ -316,12 +321,13 @@ public class LimitOffsetPushDown implements PlanOptimizer 
{
     return new TimeDuration(monthDuration, nonMonthDuration);
   }
 
-  public static void pushDownLimitOffsetToTimeParameter(QueryStatement 
queryStatement) {
+  public static void pushDownLimitOffsetToTimeParameter(
+      QueryStatement queryStatement, ZoneId zoneId) {
     GroupByTimeComponent groupByTimeComponent = 
queryStatement.getGroupByTimeComponent();
     // if group by time contains month, we use another push down limit/offset
     if (groupByTimeComponent.getInterval().containsMonth()
         || groupByTimeComponent.getSlidingStep().containsMonth()) {
-      pushDownLimitOffsetToTimeParameterContainingMonth(queryStatement);
+      pushDownLimitOffsetToTimeParameterContainingMonth(queryStatement, 
zoneId);
       return;
     }
     long startTime = groupByTimeComponent.getStartTime();
@@ -371,7 +377,7 @@ public class LimitOffsetPushDown implements PlanOptimizer {
   }
 
   public static List<PartialPath> pushDownLimitOffsetInGroupByTimeForDevice(
-      List<PartialPath> deviceNames, QueryStatement queryStatement) {
+      List<PartialPath> deviceNames, QueryStatement queryStatement, ZoneId 
zoneId) {
     GroupByTimeComponent groupByTimeComponent = 
queryStatement.getGroupByTimeComponent();
     if (groupByTimeComponent.getInterval().containsMonth()
         || groupByTimeComponent.getSlidingStep().containsMonth()) {
@@ -408,7 +414,7 @@ public class LimitOffsetPushDown implements PlanOptimizer {
     if (startDeviceIndex == endDeviceIndex) {
       optimizedDeviceNames.add(deviceNames.get(startDeviceIndex));
       if (hasLimitOffset(queryStatement) && 
queryStatement.isOrderByTimeInDevices()) {
-        pushDownLimitOffsetToTimeParameter(queryStatement);
+        pushDownLimitOffsetToTimeParameter(queryStatement, zoneId);
       }
     } else {
       while (index <= endDeviceIndex && index < deviceNames.size()) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
index 8796c4e8b65..9b38d4856be 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
@@ -1481,7 +1481,7 @@ public class ASTVisitor extends 
IoTDBSqlParserBaseVisitor<Statement> {
               
parseOffsetClause(ctx.paginationClause().rowPaginationClause().offsetClause()));
         }
         if (canPushDownLimitOffsetToGroupByTime(queryStatement)) {
-          pushDownLimitOffsetToTimeParameter(queryStatement);
+          pushDownLimitOffsetToTimeParameter(queryStatement, zoneId);
         }
       }
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
index 208985b2e6b..14f3803c1a1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
@@ -626,7 +626,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
 
     GroupByTimeParameter groupByTimeParameter = node.getGroupByTimeParameter();
     ITimeRangeIterator timeRangeIterator =
-        initTimeRangeIterator(groupByTimeParameter, ascending, true);
+        initTimeRangeIterator(groupByTimeParameter, ascending, true, 
context.getZoneId());
     long maxReturnSize =
         AggregationUtil.calculateMaxAggregationResultSize(
             node.getAggregationDescriptorList(), timeRangeIterator, 
context.getTypeProvider());
@@ -776,7 +776,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
     }
 
     ITimeRangeIterator timeRangeIterator =
-        initTimeRangeIterator(groupByTimeParameter, ascending, true);
+        initTimeRangeIterator(groupByTimeParameter, ascending, true, 
context.getZoneId());
     long maxReturnSize =
         AggregationUtil.calculateMaxAggregationResultSize(
             aggregationDescriptorList, timeRangeIterator, 
context.getTypeProvider());
@@ -1797,7 +1797,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
 
     GroupByTimeParameter groupByTimeParameter = node.getGroupByTimeParameter();
     ITimeRangeIterator timeRangeIterator =
-        initTimeRangeIterator(groupByTimeParameter, ascending, false);
+        initTimeRangeIterator(groupByTimeParameter, ascending, false, 
context.getZoneId());
     long maxReturnSize =
         calculateMaxAggregationResultSize(
             aggregationDescriptors, timeRangeIterator, 
context.getTypeProvider());
@@ -1852,7 +1852,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
     }
     GroupByTimeParameter groupByTimeParameter = node.getGroupByTimeParameter();
     ITimeRangeIterator timeRangeIterator =
-        initTimeRangeIterator(groupByTimeParameter, ascending, false);
+        initTimeRangeIterator(groupByTimeParameter, ascending, false, 
context.getZoneId());
     List<AggregationDescriptor> aggregationDescriptors =
         node.getTagValuesToAggregationDescriptors().values().stream()
             .flatMap(Collection::stream)
@@ -1921,7 +1921,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
 
     GroupByTimeParameter groupByTimeParameter = node.getGroupByTimeParameter();
     ITimeRangeIterator timeRangeIterator =
-        initTimeRangeIterator(groupByTimeParameter, ascending, false);
+        initTimeRangeIterator(groupByTimeParameter, ascending, false, 
context.getZoneId());
     long maxReturnSize =
         calculateMaxAggregationResultSize(
             aggregationDescriptors, timeRangeIterator, 
context.getTypeProvider());
@@ -1934,7 +1934,8 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
         ascending,
         node.isOutputEndTime(),
         groupByTimeParameter,
-        maxReturnSize);
+        maxReturnSize,
+        context.getZoneId());
   }
 
   @Override
@@ -2018,7 +2019,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
                 RawDataAggregationOperator.class.getSimpleName());
 
     ITimeRangeIterator timeRangeIterator =
-        initTimeRangeIterator(groupByTimeParameter, ascending, true);
+        initTimeRangeIterator(groupByTimeParameter, ascending, true, 
context.getZoneId());
     long maxReturnSize =
         calculateMaxAggregationResultSize(
             aggregationDescriptors, timeRangeIterator, 
context.getTypeProvider());
@@ -2141,7 +2142,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
                 AggregationOperator.class.getSimpleName());
 
     ITimeRangeIterator timeRangeIterator =
-        initTimeRangeIterator(node.getGroupByTimeParameter(), ascending, true);
+        initTimeRangeIterator(node.getGroupByTimeParameter(), ascending, true, 
context.getZoneId());
     long maxReturnSize =
         calculateMaxAggregationResultSize(
             aggregationDescriptors, timeRangeIterator, 
context.getTypeProvider());
@@ -2889,7 +2890,8 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
 
     // last_time, last_value
     List<Aggregator> aggregators = 
LastQueryUtil.createAggregators(seriesPath.getSeriesType());
-    ITimeRangeIterator timeRangeIterator = initTimeRangeIterator(null, false, 
false);
+    ITimeRangeIterator timeRangeIterator =
+        initTimeRangeIterator(null, false, false, context.getZoneId());
     long maxReturnSize = 
calculateMaxAggregationResultSizeForLastQuery(aggregators);
 
     SeriesScanOptions.Builder scanOptionsBuilder = new 
SeriesScanOptions.Builder();
@@ -2927,7 +2929,8 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
         canUseStatistics = false;
       }
     }
-    ITimeRangeIterator timeRangeIterator = initTimeRangeIterator(null, false, 
false);
+    ITimeRangeIterator timeRangeIterator =
+        initTimeRangeIterator(null, false, false, context.getZoneId());
     long maxReturnSize = 
calculateMaxAggregationResultSizeForLastQuery(aggregators);
 
     SeriesScanOptions.Builder scanOptionsBuilder = new 
SeriesScanOptions.Builder();
@@ -3585,7 +3588,8 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
 
     Operator childOperator = node.getChild().accept(this, context);
     ColumnGeneratorParameter parameter = node.getColumnGeneratorParameter();
-    ColumnGenerator columnGenerator = 
genColumnGeneratorAccordingToParameter(parameter);
+    ColumnGenerator columnGenerator =
+        genColumnGeneratorAccordingToParameter(parameter, context.getZoneId());
     long maxExtraColumnSize = 0;
     for (TSDataType dataType : node.getGeneratedColumnTypes()) {
       maxExtraColumnSize += getOutputColumnSizePerLine(dataType);
@@ -3597,7 +3601,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
   }
 
   private ColumnGenerator genColumnGeneratorAccordingToParameter(
-      ColumnGeneratorParameter columnGeneratorParameter) {
+      ColumnGeneratorParameter columnGeneratorParameter, ZoneId zoneId) {
     ColumnGeneratorType type = columnGeneratorParameter.getGeneratorType();
     if (type == ColumnGeneratorType.SLIDING_TIME) {
       SlidingTimeColumnGeneratorParameter slidingTimeColumnGeneratorParameter =
@@ -3606,7 +3610,8 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
           initTimeRangeIterator(
               slidingTimeColumnGeneratorParameter.getGroupByTimeParameter(),
               slidingTimeColumnGeneratorParameter.isAscending(),
-              false));
+              false,
+              zoneId));
     } else {
       throw new UnsupportedOperationException("Unsupported column generator 
type: " + type);
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java
index 59867861ed9..6f7e7179858 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java
@@ -45,6 +45,7 @@ import java.time.format.DateTimeParseException;
 import java.time.format.SignStyle;
 import java.time.temporal.ChronoField;
 import java.util.Calendar;
+import java.util.TimeZone;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 
@@ -760,12 +761,10 @@ public class DateTimeUtils {
 
   public static final long MS_TO_MONTH = 30 * 86400_000L;
 
-  public static long calcPositiveIntervalByMonth(long startTime, TimeDuration 
duration) {
+  public static long calcPositiveIntervalByMonth(
+      long startTime, TimeDuration duration, ZoneId zoneId) {
     return TimeDuration.calcPositiveIntervalByMonth(
-        startTime,
-        duration,
-        SessionManager.getInstance().getSessionTimeZone(),
-        TimestampPrecisionUtils.currPrecision);
+        startTime, duration, TimeZone.getTimeZone(zoneId), 
TimestampPrecisionUtils.currPrecision);
   }
 
   /**
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/aggregation/TimeRangeIteratorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/aggregation/TimeRangeIteratorTest.java
index 489e2fb9b86..86d8ef8ad34 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/aggregation/TimeRangeIteratorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/aggregation/TimeRangeIteratorTest.java
@@ -28,6 +28,7 @@ import org.junit.Assert;
 import org.junit.Test;
 
 import java.sql.Timestamp;
+import java.time.ZoneId;
 import java.util.TimeZone;
 
 public class TimeRangeIteratorTest {
@@ -54,13 +55,13 @@ public class TimeRangeIteratorTest {
 
     ITimeRangeIterator timeRangeIterator =
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            startTime, endTime, interval, slidingStep, true, true, false);
+            startTime, endTime, interval, slidingStep, true, true, false, 
ZoneId.systemDefault());
 
     checkRes(timeRangeIterator, res);
 
     ITimeRangeIterator descTimeRangeIterator =
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            startTime, endTime, interval, slidingStep, false, true, false);
+            startTime, endTime, interval, slidingStep, false, true, false, 
ZoneId.systemDefault());
 
     checkRes(descTimeRangeIterator, res);
   }
@@ -169,51 +170,51 @@ public class TimeRangeIteratorTest {
     TimeDuration interval = new TimeDuration(0, 4);
     checkRes(
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            0, 32, interval, new TimeDuration(0, 1), true, true, true),
+            0, 32, interval, new TimeDuration(0, 1), true, true, true, 
ZoneId.systemDefault()),
         res4_1);
     checkRes(
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            0, 32, interval, new TimeDuration(0, 2), true, true, true),
+            0, 32, interval, new TimeDuration(0, 2), true, true, true, 
ZoneId.systemDefault()),
         res4_2);
     checkRes(
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            0, 32, interval, new TimeDuration(0, 3), true, true, true),
+            0, 32, interval, new TimeDuration(0, 3), true, true, true, 
ZoneId.systemDefault()),
         res4_3);
     checkRes(
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            0, 32, interval, new TimeDuration(0, 4), true, true, true),
+            0, 32, interval, new TimeDuration(0, 4), true, true, true, 
ZoneId.systemDefault()),
         res4_4);
     checkRes(
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            0, 32, interval, new TimeDuration(0, 5), true, true, true),
+            0, 32, interval, new TimeDuration(0, 5), true, true, true, 
ZoneId.systemDefault()),
         res4_5);
     checkRes(
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            0, 32, interval, new TimeDuration(0, 6), true, true, true),
+            0, 32, interval, new TimeDuration(0, 6), true, true, true, 
ZoneId.systemDefault()),
         res4_6);
     checkRes(
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            0, 32, interval, new TimeDuration(0, 1), false, true, true),
+            0, 32, interval, new TimeDuration(0, 1), false, true, true, 
ZoneId.systemDefault()),
         res4_1);
     checkRes(
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            0, 32, interval, new TimeDuration(0, 2), false, true, true),
+            0, 32, interval, new TimeDuration(0, 2), false, true, true, 
ZoneId.systemDefault()),
         res4_2);
     checkRes(
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            0, 32, interval, new TimeDuration(0, 3), false, true, true),
+            0, 32, interval, new TimeDuration(0, 3), false, true, true, 
ZoneId.systemDefault()),
         res4_3);
     checkRes(
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            0, 32, interval, new TimeDuration(0, 4), false, true, true),
+            0, 32, interval, new TimeDuration(0, 4), false, true, true, 
ZoneId.systemDefault()),
         res4_4);
     checkRes(
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            0, 32, interval, new TimeDuration(0, 5), false, true, true),
+            0, 32, interval, new TimeDuration(0, 5), false, true, true, 
ZoneId.systemDefault()),
         res4_5);
     checkRes(
         TimeRangeIteratorFactory.getTimeRangeIterator(
-            0, 32, interval, new TimeDuration(0, 6), false, true, true),
+            0, 32, interval, new TimeDuration(0, 6), false, true, true, 
ZoneId.systemDefault()),
         res4_6);
   }
 
@@ -282,7 +283,8 @@ public class TimeRangeIteratorTest {
               new TimeDuration(1, 0),
               true,
               true,
-              false),
+              false,
+              ZoneId.systemDefault()),
           res1);
       checkRes(
           TimeRangeIteratorFactory.getTimeRangeIterator(
@@ -292,7 +294,8 @@ public class TimeRangeIteratorTest {
               new TimeDuration(1, 0),
               true,
               true,
-              true),
+              true,
+              ZoneId.systemDefault()),
           res1);
       checkRes(
           TimeRangeIteratorFactory.getTimeRangeIterator(
@@ -302,7 +305,8 @@ public class TimeRangeIteratorTest {
               new TimeDuration(1, 0),
               true,
               true,
-              false),
+              false,
+              ZoneId.systemDefault()),
           res2);
       checkRes(
           TimeRangeIteratorFactory.getTimeRangeIterator(
@@ -312,7 +316,8 @@ public class TimeRangeIteratorTest {
               new TimeDuration(1, 0),
               true,
               true,
-              true),
+              true,
+              ZoneId.systemDefault()),
           res2);
       checkRes(
           TimeRangeIteratorFactory.getTimeRangeIterator(
@@ -322,7 +327,8 @@ public class TimeRangeIteratorTest {
               new TimeDuration(0, 10 * MS_TO_DAY),
               true,
               true,
-              false),
+              false,
+              ZoneId.systemDefault()),
           res3);
       checkRes(
           TimeRangeIteratorFactory.getTimeRangeIterator(
@@ -332,7 +338,8 @@ public class TimeRangeIteratorTest {
               new TimeDuration(0, 10 * MS_TO_DAY),
               true,
               true,
-              true),
+              true,
+              ZoneId.systemDefault()),
           res4);
     } finally {
       TimeZone.setDefault(oldDefault);
@@ -372,7 +379,8 @@ public class TimeRangeIteratorTest {
             new TimeDuration(1, MS_TO_DAY),
             true,
             true,
-            true),
+            true,
+            ZoneId.systemDefault()),
         res);
 
     res =
@@ -422,7 +430,8 @@ public class TimeRangeIteratorTest {
             new TimeDuration(1, MS_TO_DAY),
             true,
             true,
-            true),
+            true,
+            ZoneId.systemDefault()),
         res);
   }
 
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/AggregationOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/AggregationOperatorTest.java
index fc9fab2c79d..b217921aa20 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/AggregationOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/AggregationOperatorTest.java
@@ -58,6 +58,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -340,7 +341,7 @@ public class AggregationOperatorTest {
             scanOptionsBuilder.build(),
             driverContext.getOperatorContexts().get(0),
             aggregators,
-            initTimeRangeIterator(groupByTimeParameter, true, true),
+            initTimeRangeIterator(groupByTimeParameter, true, true, 
ZoneId.systemDefault()),
             groupByTimeParameter,
             DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
             true);
@@ -365,7 +366,7 @@ public class AggregationOperatorTest {
             scanOptionsBuilder.build(),
             driverContext.getOperatorContexts().get(0),
             aggregators,
-            initTimeRangeIterator(groupByTimeParameter, true, true),
+            initTimeRangeIterator(groupByTimeParameter, true, true, 
ZoneId.systemDefault()),
             groupByTimeParameter,
             DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
             true);
@@ -399,7 +400,7 @@ public class AggregationOperatorTest {
     return new AggregationOperator(
         driverContext.getOperatorContexts().get(2),
         finalAggregators,
-        initTimeRangeIterator(groupByTimeParameter, true, true),
+        initTimeRangeIterator(groupByTimeParameter, true, true, 
ZoneId.systemDefault()),
         children,
         false,
         DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/AlignedSeriesAggregationScanOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/AlignedSeriesAggregationScanOperatorTest.java
index 67f603f9746..2a5c5c13d0b 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/AlignedSeriesAggregationScanOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/AlignedSeriesAggregationScanOperatorTest.java
@@ -58,6 +58,7 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -743,7 +744,7 @@ public class AlignedSeriesAggregationScanOperatorTest {
             scanOptionsBuilder.build(),
             driverContext.getOperatorContexts().get(0),
             aggregators,
-            initTimeRangeIterator(groupByTimeParameter, ascending, true),
+            initTimeRangeIterator(groupByTimeParameter, ascending, true, 
ZoneId.systemDefault()),
             groupByTimeParameter,
             DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
             true);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/HorizontallyConcatOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/HorizontallyConcatOperatorTest.java
index d85a5c45bff..bad50a7e1c9 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/HorizontallyConcatOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/HorizontallyConcatOperatorTest.java
@@ -54,6 +54,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -147,7 +148,7 @@ public class HorizontallyConcatOperatorTest {
               scanOptionsBuilder.build(),
               driverContext.getOperatorContexts().get(0),
               aggregators,
-              initTimeRangeIterator(groupByTimeParameter, true, true),
+              initTimeRangeIterator(groupByTimeParameter, true, true, 
ZoneId.systemDefault()),
               groupByTimeParameter,
               DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
               true);
@@ -168,7 +169,7 @@ public class HorizontallyConcatOperatorTest {
               scanOptionsBuilder.build(),
               driverContext.getOperatorContexts().get(1),
               aggregators,
-              initTimeRangeIterator(groupByTimeParameter, true, true),
+              initTimeRangeIterator(groupByTimeParameter, true, true, 
ZoneId.systemDefault()),
               groupByTimeParameter,
               DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
               true);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/LastQueryOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/LastQueryOperatorTest.java
index 879585a033c..23139279d58 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/LastQueryOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/LastQueryOperatorTest.java
@@ -53,6 +53,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
@@ -144,7 +145,7 @@ public class LastQueryOperatorTest {
               scanOptionsBuilder.build(),
               driverContext.getOperatorContexts().get(0),
               aggregators1,
-              initTimeRangeIterator(null, false, true),
+              initTimeRangeIterator(null, false, true, ZoneId.systemDefault()),
               null,
               DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
               true);
@@ -170,7 +171,7 @@ public class LastQueryOperatorTest {
               scanOptionsBuilder.build(),
               driverContext.getOperatorContexts().get(2),
               aggregators2,
-              initTimeRangeIterator(null, false, true),
+              initTimeRangeIterator(null, false, true, ZoneId.systemDefault()),
               null,
               DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
               true);
@@ -273,7 +274,7 @@ public class LastQueryOperatorTest {
               scanOptionsBuilder.build(),
               driverContext.getOperatorContexts().get(0),
               aggregators1,
-              initTimeRangeIterator(null, false, true),
+              initTimeRangeIterator(null, false, true, ZoneId.systemDefault()),
               null,
               DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
               true);
@@ -298,7 +299,7 @@ public class LastQueryOperatorTest {
               scanOptionsBuilder.build(),
               driverContext.getOperatorContexts().get(2),
               aggregators2,
-              initTimeRangeIterator(null, false, true),
+              initTimeRangeIterator(null, false, true, ZoneId.systemDefault()),
               null,
               DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
               true);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/LastQuerySortOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/LastQuerySortOperatorTest.java
index 4b1164b62a2..e7c66a30970 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/LastQuerySortOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/LastQuerySortOperatorTest.java
@@ -53,6 +53,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
@@ -145,7 +146,7 @@ public class LastQuerySortOperatorTest {
               scanOptionsBuilder.build(),
               driverContext.getOperatorContexts().get(0),
               aggregators1,
-              initTimeRangeIterator(null, false, true),
+              initTimeRangeIterator(null, false, true, ZoneId.systemDefault()),
               null,
               DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
               true);
@@ -170,7 +171,7 @@ public class LastQuerySortOperatorTest {
               scanOptionsBuilder.build(),
               driverContext.getOperatorContexts().get(2),
               aggregators2,
-              initTimeRangeIterator(null, false, true),
+              initTimeRangeIterator(null, false, true, ZoneId.systemDefault()),
               null,
               DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
               true);
@@ -273,7 +274,7 @@ public class LastQuerySortOperatorTest {
               scanOptionsBuilder.build(),
               driverContext.getOperatorContexts().get(0),
               aggregators1,
-              initTimeRangeIterator(null, false, true),
+              initTimeRangeIterator(null, false, true, ZoneId.systemDefault()),
               null,
               DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
               true);
@@ -298,7 +299,7 @@ public class LastQuerySortOperatorTest {
               scanOptionsBuilder.build(),
               driverContext.getOperatorContexts().get(2),
               aggregators2,
-              initTimeRangeIterator(null, false, true),
+              initTimeRangeIterator(null, false, true, ZoneId.systemDefault()),
               null,
               DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
               true);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
index 98c08e658fe..39f79c9ca52 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
@@ -101,6 +101,7 @@ import org.apache.tsfile.utils.TimeDuration;
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -1206,7 +1207,8 @@ public class OperatorMemoryTest {
                         true),
                     o.getStep())));
 
-    ITimeRangeIterator timeRangeIterator = 
initTimeRangeIterator(groupByTimeParameter, true, true);
+    ITimeRangeIterator timeRangeIterator =
+        initTimeRangeIterator(groupByTimeParameter, true, true, 
ZoneId.systemDefault());
     long maxReturnSize =
         AggregationUtil.calculateMaxAggregationResultSize(
             aggregationDescriptors, timeRangeIterator, typeProvider);
@@ -1264,7 +1266,8 @@ public class OperatorMemoryTest {
 
     GroupByTimeParameter groupByTimeParameter =
         new GroupByTimeParameter(0, 1000, new TimeDuration(0, 10), new 
TimeDuration(0, 10), true);
-    ITimeRangeIterator timeRangeIterator = 
initTimeRangeIterator(groupByTimeParameter, true, false);
+    ITimeRangeIterator timeRangeIterator =
+        initTimeRangeIterator(groupByTimeParameter, true, false, 
ZoneId.systemDefault());
     long maxReturnSize =
         AggregationUtil.calculateMaxAggregationResultSize(
             aggregationDescriptors, timeRangeIterator, typeProvider);
@@ -1337,7 +1340,8 @@ public class OperatorMemoryTest {
 
     GroupByTimeParameter groupByTimeParameter =
         new GroupByTimeParameter(0, 1000, new TimeDuration(0, 10), new 
TimeDuration(0, 5), true);
-    ITimeRangeIterator timeRangeIterator = 
initTimeRangeIterator(groupByTimeParameter, true, false);
+    ITimeRangeIterator timeRangeIterator =
+        initTimeRangeIterator(groupByTimeParameter, true, false, 
ZoneId.systemDefault());
     long maxReturnSize =
         AggregationUtil.calculateMaxAggregationResultSize(
             aggregationDescriptors, timeRangeIterator, typeProvider);
@@ -1351,7 +1355,8 @@ public class OperatorMemoryTest {
             true,
             false,
             groupByTimeParameter,
-            maxReturnSize);
+            maxReturnSize,
+            ZoneId.systemDefault());
 
     long expectedMaxReturnSize =
         200
@@ -1417,7 +1422,8 @@ public class OperatorMemoryTest {
 
     GroupByTimeParameter groupByTimeParameter =
         new GroupByTimeParameter(0, 1000, new TimeDuration(0, 10), new 
TimeDuration(0, 10), true);
-    ITimeRangeIterator timeRangeIterator = 
initTimeRangeIterator(groupByTimeParameter, true, false);
+    ITimeRangeIterator timeRangeIterator =
+        initTimeRangeIterator(groupByTimeParameter, true, false, 
ZoneId.systemDefault());
     long maxReturnSize =
         AggregationUtil.calculateMaxAggregationResultSize(
             aggregationDescriptors, timeRangeIterator, typeProvider);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/RawDataAggregationOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/RawDataAggregationOperatorTest.java
index 46cfc59b372..580b1909146 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/RawDataAggregationOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/RawDataAggregationOperatorTest.java
@@ -66,6 +66,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -988,7 +989,7 @@ public class RawDataAggregationOperatorTest {
     return new RawDataAggregationOperator(
         driverContext.getOperatorContexts().get(3),
         aggregators,
-        initTimeRangeIterator(groupByTimeParameter, true, true),
+        initTimeRangeIterator(groupByTimeParameter, true, true, 
ZoneId.systemDefault()),
         timeJoinOperator,
         true,
         DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/SeriesAggregationScanOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/SeriesAggregationScanOperatorTest.java
index 84b64112beb..bbf96e89fb4 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/SeriesAggregationScanOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/SeriesAggregationScanOperatorTest.java
@@ -56,6 +56,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -658,7 +659,7 @@ public class SeriesAggregationScanOperatorTest {
             scanOptionsBuilder.build(),
             driverContext.getOperatorContexts().get(0),
             aggregators,
-            initTimeRangeIterator(groupByTimeParameter, ascending, true),
+            initTimeRangeIterator(groupByTimeParameter, ascending, true, 
ZoneId.systemDefault()),
             groupByTimeParameter,
             DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
             true);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/SlidingWindowAggregationOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/SlidingWindowAggregationOperatorTest.java
index f894294104b..c3af0f6ac03 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/SlidingWindowAggregationOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/SlidingWindowAggregationOperatorTest.java
@@ -58,6 +58,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -257,7 +258,7 @@ public class SlidingWindowAggregationOperatorTest {
             scanOptionsBuilder.build(),
             driverContext.getOperatorContexts().get(0),
             aggregators,
-            initTimeRangeIterator(groupByTimeParameter, ascending, true),
+            initTimeRangeIterator(groupByTimeParameter, ascending, true, 
ZoneId.systemDefault()),
             groupByTimeParameter,
             DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
             true);
@@ -283,11 +284,12 @@ public class SlidingWindowAggregationOperatorTest {
     return new SlidingWindowAggregationOperator(
         driverContext.getOperatorContexts().get(1),
         finalAggregators,
-        initTimeRangeIterator(groupByTimeParameter, ascending, false),
+        initTimeRangeIterator(groupByTimeParameter, ascending, false, 
ZoneId.systemDefault()),
         seriesAggregationScanOperator,
         ascending,
         false,
         groupByTimeParameter,
-        DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES);
+        DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
+        ZoneId.systemDefault());
   }
 }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/UpdateLastCacheOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/UpdateLastCacheOperatorTest.java
index f39d9157a51..0c9c47815ae 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/UpdateLastCacheOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/UpdateLastCacheOperatorTest.java
@@ -53,6 +53,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
@@ -223,7 +224,7 @@ public class UpdateLastCacheOperatorTest {
             scanOptionsBuilder.build(),
             driverContext.getOperatorContexts().get(0),
             aggregators,
-            initTimeRangeIterator(groupByTimeParameter, ascending, true),
+            initTimeRangeIterator(groupByTimeParameter, ascending, true, 
ZoneId.systemDefault()),
             groupByTimeParameter,
             DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES,
             true);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDownTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDownTest.java
index bdaba989262..b82d9ed6af2 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDownTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/LimitOffsetPushDownTest.java
@@ -19,9 +19,11 @@
 
 package org.apache.iotdb.db.queryengine.plan.optimization;
 
+import org.apache.iotdb.common.rpc.thrift.TEndPoint;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.QueryId;
+import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import org.apache.iotdb.db.queryengine.plan.analyze.Analysis;
 import org.apache.iotdb.db.queryengine.plan.analyze.Analyzer;
 import org.apache.iotdb.db.queryengine.plan.analyze.FakePartitionFetcherImpl;
@@ -41,6 +43,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.crud.QueryStatement;
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -443,7 +446,13 @@ public class LimitOffsetPushDownTest {
       long endTime) {
     QueryStatement statement =
         (QueryStatement) StatementGenerator.createStatement(sql, 
ZonedDateTime.now().getOffset());
-    MPPQueryContext context = new MPPQueryContext(new QueryId("test_query"));
+    MPPQueryContext context =
+        new MPPQueryContext(
+            "",
+            new QueryId("test_query"),
+            new SessionInfo(-1L, "", ZoneId.systemDefault()),
+            new TEndPoint(),
+            new TEndPoint());
     Analyzer analyzer =
         new Analyzer(context, new FakePartitionFetcherImpl(), new 
FakeSchemaFetcherImpl());
     Analysis analysis = analyzer.analyze(statement);

Reply via email to