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 4a3c1d3e331 Fixed query type of create table device
4a3c1d3e331 is described below

commit 4a3c1d3e331dfed32fe5c8a22ce60e8b1930ae2f
Author: Caideyipi <[email protected]>
AuthorDate: Mon Aug 12 14:32:29 2024 +0800

    Fixed query type of create table device
---
 .../plan/relational/analyzer/Analyzer.java         |  16 ++-
 .../relational/analyzer/ExpressionAnalyzer.java    |  20 +++-
 .../relational/analyzer/StatementAnalyzer.java     |  10 +-
 .../analyzer/StatementAnalyzerFactory.java         |  11 +-
 .../plan/relational/planner/LogicalPlanner.java    |  15 +--
 .../relational/planner/RelationalModelPlanner.java |   1 +
 .../relational/sql/ast/WrappedInsertStatement.java |   3 +-
 .../plan/relational/sql/ast/WrappedStatement.java  |   2 +-
 .../plan/relational/analyzer/AnalyzerTest.java     | 124 +++++++++++----------
 .../analyzer/LimitOffsetPushDownTest.java          |  13 ++-
 .../plan/relational/analyzer/SortTest.java         |  28 ++---
 .../plan/relational/planner/PlanTester.java        |  12 +-
 .../relational/planner/PredicateUtilsTest.java     |  26 ++++-
 13 files changed, 176 insertions(+), 105 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java
index 7f3a9321bb3..f5861cf45fe 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.db.queryengine.plan.relational.analyzer;
 
 import org.apache.iotdb.db.exception.sql.SemanticException;
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression;
@@ -36,6 +37,7 @@ public class Analyzer {
 
   private final StatementAnalyzerFactory statementAnalyzerFactory;
 
+  private final MPPQueryContext context;
   private final SessionInfo session;
   private final List<Expression> parameters;
 
@@ -44,11 +46,13 @@ public class Analyzer {
   private final WarningCollector warningCollector;
 
   public Analyzer(
-      SessionInfo session,
-      StatementAnalyzerFactory statementAnalyzerFactory,
-      List<Expression> parameters,
-      Map<NodeRef<Parameter>, Expression> parameterLookup,
-      WarningCollector warningCollector) {
+      final MPPQueryContext context,
+      final SessionInfo session,
+      final StatementAnalyzerFactory statementAnalyzerFactory,
+      final List<Expression> parameters,
+      final Map<NodeRef<Parameter>, Expression> parameterLookup,
+      final WarningCollector warningCollector) {
+    this.context = context;
     this.session = requireNonNull(session, "session is null");
     this.statementAnalyzerFactory =
         requireNonNull(statementAnalyzerFactory, "statementAnalyzerFactory is 
null");
@@ -74,7 +78,7 @@ public class Analyzer {
 
     StatementAnalyzer analyzer =
         statementAnalyzerFactory.createStatementAnalyzer(
-            analysis, session, warningCollector, CorrelationSupport.ALLOWED);
+            analysis, context, session, warningCollector, 
CorrelationSupport.ALLOWED);
 
     analyzer.analyze(statement);
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/ExpressionAnalyzer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/ExpressionAnalyzer.java
index abd20c49c4a..ff4223ef732 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/ExpressionAnalyzer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/ExpressionAnalyzer.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.db.queryengine.plan.relational.analyzer;
 
 import org.apache.iotdb.db.exception.sql.SemanticException;
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector;
 import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider;
@@ -140,6 +141,7 @@ public class ExpressionAnalyzer {
   // Track referenced fields from source relation node
   private final Multimap<NodeRef<Node>, Field> referencedFields = 
HashMultimap.create();
 
+  private final MPPQueryContext context;
   private final SessionInfo session;
 
   private final Map<NodeRef<Parameter>, Expression> parameters;
@@ -155,6 +157,7 @@ public class ExpressionAnalyzer {
 
   private ExpressionAnalyzer(
       Metadata metadata,
+      MPPQueryContext context,
       AccessControl accessControl,
       StatementAnalyzerFactory statementAnalyzerFactory,
       Analysis analysis,
@@ -163,10 +166,11 @@ public class ExpressionAnalyzer {
       WarningCollector warningCollector) {
     this(
         metadata,
+        context,
         accessControl,
         (node, correlationSupport) ->
             statementAnalyzerFactory.createStatementAnalyzer(
-                analysis, session, warningCollector, correlationSupport),
+                analysis, context, session, warningCollector, 
correlationSupport),
         session,
         types,
         analysis.getParameters(),
@@ -176,6 +180,7 @@ public class ExpressionAnalyzer {
 
   ExpressionAnalyzer(
       Metadata metadata,
+      MPPQueryContext context,
       AccessControl accessControl,
       BiFunction<Node, CorrelationSupport, StatementAnalyzer> 
statementAnalyzerFactory,
       SessionInfo session,
@@ -184,6 +189,7 @@ public class ExpressionAnalyzer {
       WarningCollector warningCollector,
       Function<Expression, Type> getPreanalyzedType) {
     this.metadata = requireNonNull(metadata, "metadata is null");
+    this.context = requireNonNull(context, "context is null");
     this.accessControl = requireNonNull(accessControl, "accessControl is 
null");
     this.statementAnalyzerFactory =
         requireNonNull(statementAnalyzerFactory, "statementAnalyzerFactory is 
null");
@@ -1324,6 +1330,7 @@ public class ExpressionAnalyzer {
 
   public static ExpressionAnalysis analyzeExpressions(
       Metadata metadata,
+      MPPQueryContext context,
       SessionInfo session,
       StatementAnalyzerFactory statementAnalyzerFactory,
       AccessControl accessControl,
@@ -1336,6 +1343,7 @@ public class ExpressionAnalyzer {
     ExpressionAnalyzer analyzer =
         new ExpressionAnalyzer(
             metadata,
+            context,
             accessControl,
             statementAnalyzerFactory,
             analysis,
@@ -1359,6 +1367,7 @@ public class ExpressionAnalyzer {
 
   public static ExpressionAnalysis analyzeExpression(
       Metadata metadata,
+      MPPQueryContext context,
       SessionInfo session,
       StatementAnalyzerFactory statementAnalyzerFactory,
       AccessControl accessControl,
@@ -1370,6 +1379,7 @@ public class ExpressionAnalyzer {
     ExpressionAnalyzer analyzer =
         new ExpressionAnalyzer(
             metadata,
+            context,
             accessControl,
             statementAnalyzerFactory,
             analysis,
@@ -1392,6 +1402,7 @@ public class ExpressionAnalyzer {
 
   public static void analyzeExpressionWithoutSubqueries(
       Metadata metadata,
+      MPPQueryContext context,
       SessionInfo session,
       AccessControl accessControl,
       Scope scope,
@@ -1403,6 +1414,7 @@ public class ExpressionAnalyzer {
     ExpressionAnalyzer analyzer =
         new ExpressionAnalyzer(
             metadata,
+            context,
             accessControl,
             (node, ignored) -> {
               throw new SemanticException(message);
@@ -1431,12 +1443,14 @@ public class ExpressionAnalyzer {
 
   public static ExpressionAnalyzer createConstantAnalyzer(
       Metadata metadata,
+      MPPQueryContext context,
       AccessControl accessControl,
       SessionInfo session,
       Map<NodeRef<Parameter>, Expression> parameters,
       WarningCollector warningCollector) {
     return createWithoutSubqueries(
         metadata,
+        context,
         accessControl,
         session,
         parameters,
@@ -1446,6 +1460,7 @@ public class ExpressionAnalyzer {
 
   public static ExpressionAnalyzer createWithoutSubqueries(
       Metadata metadata,
+      MPPQueryContext context,
       AccessControl accessControl,
       SessionInfo session,
       Map<NodeRef<Parameter>, Expression> parameters,
@@ -1453,6 +1468,7 @@ public class ExpressionAnalyzer {
       WarningCollector warningCollector) {
     return createWithoutSubqueries(
         metadata,
+        context,
         accessControl,
         session,
         TypeProvider.empty(),
@@ -1463,6 +1479,7 @@ public class ExpressionAnalyzer {
 
   public static ExpressionAnalyzer createWithoutSubqueries(
       Metadata metadata,
+      MPPQueryContext context,
       AccessControl accessControl,
       SessionInfo session,
       TypeProvider symbolTypes,
@@ -1471,6 +1488,7 @@ public class ExpressionAnalyzer {
       WarningCollector warningCollector) {
     return new ExpressionAnalyzer(
         metadata,
+        context,
         accessControl,
         (node, correlationSupport) -> {
           throw statementAnalyzerRejection.apply(node);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java
index 1b78943299b..b54ffafd5e2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import org.apache.iotdb.db.queryengine.execution.warnings.IoTDBWarning;
 import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector;
 import org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeUtils;
+import org.apache.iotdb.db.queryengine.plan.analyze.QueryType;
 import org.apache.iotdb.db.queryengine.plan.analyze.schema.SchemaValidator;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnSchema;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
@@ -166,6 +167,7 @@ public class StatementAnalyzer {
   private final StatementAnalyzerFactory statementAnalyzerFactory;
 
   private Analysis analysis;
+  private final MPPQueryContext queryContext;
 
   private final AccessControl accessControl;
 
@@ -180,6 +182,7 @@ public class StatementAnalyzer {
   public StatementAnalyzer(
       StatementAnalyzerFactory statementAnalyzerFactory,
       Analysis analysis,
+      MPPQueryContext queryContext,
       AccessControl accessControl,
       WarningCollector warningCollector,
       SessionInfo sessionContext,
@@ -187,6 +190,7 @@ public class StatementAnalyzer {
       CorrelationSupport correlationSupport) {
     this.statementAnalyzerFactory = statementAnalyzerFactory;
     this.analysis = analysis;
+    this.queryContext = queryContext;
     this.accessControl = accessControl;
     this.warningCollector = warningCollector;
     this.sessionContext = sessionContext;
@@ -692,7 +696,7 @@ public class StatementAnalyzer {
     protected Scope visitTableSubquery(TableSubquery node, Optional<Scope> 
scope) {
       StatementAnalyzer analyzer =
           statementAnalyzerFactory.createStatementAnalyzer(
-              analysis, sessionContext, warningCollector, 
CorrelationSupport.ALLOWED);
+              analysis, queryContext, sessionContext, warningCollector, 
CorrelationSupport.ALLOWED);
       Scope queryScope =
           analyzer.analyze(
               node.getQuery(),
@@ -1972,6 +1976,7 @@ public class StatementAnalyzer {
         ExpressionAnalysis expressionAnalysis =
             ExpressionAnalyzer.analyzeExpression(
                 metadata,
+                queryContext,
                 sessionContext,
                 statementAnalyzerFactory,
                 accessControl,
@@ -2159,6 +2164,7 @@ public class StatementAnalyzer {
     private ExpressionAnalysis analyzeExpression(Expression expression, Scope 
scope) {
       return ExpressionAnalyzer.analyzeExpression(
           metadata,
+          queryContext,
           sessionContext,
           statementAnalyzerFactory,
           accessControl,
@@ -2173,6 +2179,7 @@ public class StatementAnalyzer {
         Expression expression, Scope scope, CorrelationSupport 
correlationSupport) {
       return ExpressionAnalyzer.analyzeExpression(
           metadata,
+          queryContext,
           sessionContext,
           statementAnalyzerFactory,
           accessControl,
@@ -2478,6 +2485,7 @@ public class StatementAnalyzer {
 
     @Override
     protected Scope visitCreateDevice(final CreateDevice node, final 
Optional<Scope> context) {
+      queryContext.setQueryType(QueryType.WRITE);
       return null;
     }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzerFactory.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzerFactory.java
index f37b6460994..155e0d3338e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzerFactory.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzerFactory.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.queryengine.plan.relational.analyzer;
 
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
@@ -46,11 +47,19 @@ public class StatementAnalyzerFactory {
 
   public StatementAnalyzer createStatementAnalyzer(
       Analysis analysis,
+      MPPQueryContext context,
       SessionInfo session,
       WarningCollector warningCollector,
       CorrelationSupport correlationSupport) {
     return new StatementAnalyzer(
-        this, analysis, accessControl, warningCollector, session, metadata, 
correlationSupport);
+        this,
+        analysis,
+        context,
+        accessControl,
+        warningCollector,
+        session,
+        metadata,
+        correlationSupport);
   }
 
   public static StatementAnalyzerFactory createTestingStatementAnalyzerFactory(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java
index 44310f9b7e8..c5e73eeac05 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java
@@ -24,7 +24,6 @@ import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import org.apache.iotdb.db.queryengine.common.header.ColumnHeader;
 import org.apache.iotdb.db.queryengine.common.header.DatasetHeader;
 import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector;
-import org.apache.iotdb.db.queryengine.plan.analyze.QueryType;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.LogicalQueryPlan;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.WritePlanNode;
@@ -215,8 +214,6 @@ public class LogicalPlanner {
   }
 
   private PlanNode planCreateDevice(final CreateDevice statement, final 
Analysis analysis) {
-    queryContext.setQueryType(QueryType.WRITE);
-
     final CreateTableDeviceNode node =
         new CreateTableDeviceNode(
             queryContext.getQueryId().genPlanNodeId(),
@@ -238,8 +235,6 @@ public class LogicalPlanner {
   }
 
   private PlanNode planFetchDevice(final FetchDevice statement, final Analysis 
analysis) {
-    queryContext.setQueryType(QueryType.READ);
-
     final List<ColumnHeader> columnHeaderList =
         getColumnHeaderList(statement.getDatabase(), statement.getTableName());
 
@@ -312,8 +307,6 @@ public class LogicalPlanner {
   }
 
   private String planQueryDevice(final AbstractQueryDevice statement, final 
Analysis analysis) {
-    queryContext.setQueryType(QueryType.READ);
-
     final String database =
         Objects.isNull(statement.getDatabase())
             ? analysis.getDatabaseName()
@@ -341,12 +334,12 @@ public class LogicalPlanner {
     return database;
   }
 
-  private List<ColumnHeader> getColumnHeaderList(String database, String 
tableName) {
-    List<TsTableColumnSchema> columnSchemaList =
+  private List<ColumnHeader> getColumnHeaderList(final String database, final 
String tableName) {
+    final List<TsTableColumnSchema> columnSchemaList =
         DataNodeTableCache.getInstance().getTable(database, 
tableName).getColumnList();
 
-    List<ColumnHeader> columnHeaderList = new 
ArrayList<>(columnSchemaList.size());
-    for (TsTableColumnSchema columnSchema : columnSchemaList) {
+    final List<ColumnHeader> columnHeaderList = new 
ArrayList<>(columnSchemaList.size());
+    for (final TsTableColumnSchema columnSchema : columnSchemaList) {
       if (columnSchema.getColumnCategory().equals(TsTableColumnCategory.ID)
           || 
columnSchema.getColumnCategory().equals(TsTableColumnCategory.ATTRIBUTE)) {
         columnHeaderList.add(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationalModelPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationalModelPlanner.java
index d764877950a..2a2f40e94ca 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationalModelPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationalModelPlanner.java
@@ -96,6 +96,7 @@ public class RelationalModelPlanner implements IPlanner {
 
     Analyzer analyzer =
         new Analyzer(
+            context,
             context.getSession(),
             statementAnalyzerFactory,
             Collections.emptyList(),
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/WrappedInsertStatement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/WrappedInsertStatement.java
index 3ea6bac3540..e8481557784 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/WrappedInsertStatement.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/WrappedInsertStatement.java
@@ -49,7 +49,8 @@ public abstract class WrappedInsertStatement extends 
WrappedStatement
 
   protected TableSchema tableSchema;
 
-  public WrappedInsertStatement(InsertBaseStatement innerTreeStatement, 
MPPQueryContext context) {
+  protected WrappedInsertStatement(
+      InsertBaseStatement innerTreeStatement, MPPQueryContext context) {
     super(innerTreeStatement, context);
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/WrappedStatement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/WrappedStatement.java
index 003dd2ed431..af11be5ad73 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/WrappedStatement.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/WrappedStatement.java
@@ -29,7 +29,7 @@ public abstract class WrappedStatement extends Statement {
   protected org.apache.iotdb.db.queryengine.plan.statement.Statement 
innerTreeStatement;
   protected MPPQueryContext context;
 
-  public WrappedStatement(
+  protected WrappedStatement(
       org.apache.iotdb.db.queryengine.plan.statement.Statement 
innerTreeStatement,
       MPPQueryContext context) {
     super(null);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
index ae9996eb3db..34824d537bf 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
@@ -132,27 +132,27 @@ public class AnalyzerTest {
 
   @Test
   public void testMockQuery() throws OperatorNotFoundException {
-    String sql =
+    final String sql =
         "SELECT s1, (s1 + 1) as t from table1 where time > 100 and s2 > 10 
offset 2 limit 3";
-    Metadata metadata = Mockito.mock(Metadata.class);
+    final Metadata metadata = Mockito.mock(Metadata.class);
     Mockito.when(metadata.tableExists(Mockito.any())).thenReturn(true);
 
-    Map<String, ColumnHandle> map = new HashMap<>();
-    TableSchema tableSchema = Mockito.mock(TableSchema.class);
+    final Map<String, ColumnHandle> map = new HashMap<>();
+    final TableSchema tableSchema = Mockito.mock(TableSchema.class);
     Mockito.when(tableSchema.getTableName()).thenReturn("table1");
-    ColumnSchema column1 =
+    final ColumnSchema column1 =
         
ColumnSchema.builder().setName("time").setType(INT64).setHidden(false).build();
-    ColumnHandle column1Handle = Mockito.mock(ColumnHandle.class);
+    final ColumnHandle column1Handle = Mockito.mock(ColumnHandle.class);
     map.put("time", column1Handle);
-    ColumnSchema column2 =
+    final ColumnSchema column2 =
         
ColumnSchema.builder().setName("s1").setType(INT32).setHidden(false).build();
-    ColumnHandle column2Handle = Mockito.mock(ColumnHandle.class);
+    final ColumnHandle column2Handle = Mockito.mock(ColumnHandle.class);
     map.put("s1", column2Handle);
-    ColumnSchema column3 =
+    final ColumnSchema column3 =
         
ColumnSchema.builder().setName("s2").setType(INT64).setHidden(false).build();
-    ColumnHandle column3Handle = Mockito.mock(ColumnHandle.class);
+    final ColumnHandle column3Handle = Mockito.mock(ColumnHandle.class);
     map.put("s2", column3Handle);
-    List<ColumnSchema> columnSchemaList = Arrays.asList(column1, column2, 
column3);
+    final List<ColumnSchema> columnSchemaList = Arrays.asList(column1, 
column2, column3);
     Mockito.when(tableSchema.getColumns()).thenReturn(columnSchemaList);
 
     Mockito.when(
@@ -167,7 +167,8 @@ public class AnalyzerTest {
             metadata.getOperatorReturnType(eq(OperatorType.ADD), 
eq(Arrays.asList(INT32, INT32))))
         .thenReturn(DOUBLE);
 
-    Analysis actualAnalysis = analyzeSQL(sql, metadata);
+    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
+    final Analysis actualAnalysis = analyzeSQL(sql, metadata, context);
     assertNotNull(actualAnalysis);
     System.out.println(actualAnalysis.getTypes());
   }
@@ -176,11 +177,11 @@ public class AnalyzerTest {
   public void singleTableNoFilterTest() {
     // wildcard
     sql = "SELECT * FROM testdb.table1";
-    actualAnalysis = analyzeSQL(sql, metadata);
+    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     assertNotNull(actualAnalysis);
     assertEquals(1, actualAnalysis.getTables().size());
 
-    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -216,10 +217,10 @@ public class AnalyzerTest {
   public void singleTableWithFilterTest1() {
     // only global time filter
     sql = "SELECT * FROM table1 where time > 1";
-    actualAnalysis = analyzeSQL(sql, metadata);
+    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     assertNotNull(actualAnalysis);
     assertEquals(1, actualAnalysis.getTables().size());
-    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -267,10 +268,10 @@ public class AnalyzerTest {
   public void singleTableWithFilterTest2() {
     // measurement value filter, which can be pushed down to TableScanNode
     sql = "SELECT tag1, attr1, s2 FROM table1 where s1 > 1";
-    actualAnalysis = analyzeSQL(sql, metadata);
+    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     assertNotNull(actualAnalysis);
     assertEquals(1, actualAnalysis.getTables().size());
-    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -330,10 +331,10 @@ public class AnalyzerTest {
     // timePredicate of TableScanNode
     sql =
         "SELECT tag1, attr1, s2 FROM table1 where s1 > 1 and s2>2 and tag1='A' 
and time > 1 and time < 10";
-    actualAnalysis = analyzeSQL(sql, metadata);
+    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     assertNotNull(actualAnalysis);
     assertEquals(1, actualAnalysis.getTables().size());
-    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -360,10 +361,10 @@ public class AnalyzerTest {
     // transfer to : ((("time" > 1) OR ("s1" > 1)) AND (("time" > 1) OR ("s2" 
> 2)) AND (("time" >
     // 1) OR ("time" < 10)))
     sql = "SELECT tag1, attr1, s2 FROM table1 where time > 1 or s1 > 1 and s2 
> 2 and time < 10";
-    actualAnalysis = analyzeSQL(sql, metadata);
+    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     assertNotNull(actualAnalysis);
     assertEquals(1, actualAnalysis.getTables().size());
-    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -389,10 +390,10 @@ public class AnalyzerTest {
   public void singleTableWithFilterTest5() {
     // measurement value filter with time filter
     sql = "SELECT tag1, attr1, s2 FROM table1 where time > 1 or s1 > 1 or time 
< 10 or s2 > 2";
-    actualAnalysis = analyzeSQL(sql, metadata);
+    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     assertNotNull(actualAnalysis);
     assertEquals(1, actualAnalysis.getTables().size());
-    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -431,9 +432,9 @@ public class AnalyzerTest {
   public void singleTableWithFilterTest6() {
     // value filter which can not be pushed down
     sql = "SELECT tag1, attr1, s2 FROM table1 where diff(s1) > 1";
-    actualAnalysis = analyzeSQL(sql, metadata);
-    assertEquals(1, actualAnalysis.getTables().size());
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
+    assertEquals(1, actualAnalysis.getTables().size());
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -479,7 +480,7 @@ public class AnalyzerTest {
             
distributedQueryPlan.getFragments().get(1).getPlanNodeTree().getChildren().get(0);
 
     sql = "SELECT tag1, attr1, s2 FROM table1 where diff(s1) + 1 > 1";
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     assertEquals(1, actualAnalysis.getTables().size());
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
@@ -504,17 +505,17 @@ public class AnalyzerTest {
     // TODO(beyyes) fix the CNFs parse error
     sql =
         "SELECT tag1, attr1, s2 FROM table1 where (time > 1 and s1 > 1 or s2 < 
7) or (time < 10 and s1 > 4)";
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
   }
 
   @Test
   public void singleTableProjectTest() {
     // 1. project without filter
     sql = "SELECT time, tag1, attr1, s1 FROM table1";
-    actualAnalysis = analyzeSQL(sql, metadata);
+    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     assertNotNull(actualAnalysis);
     assertEquals(1, actualAnalysis.getTables().size());
-    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -526,7 +527,7 @@ public class AnalyzerTest {
 
     // 2. project with filter
     sql = "SELECT tag1, attr1, s1 FROM table1 WHERE tag2='A' and s2=8";
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     assertNotNull(actualAnalysis);
     assertEquals(1, actualAnalysis.getTables().size());
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
@@ -549,7 +550,7 @@ public class AnalyzerTest {
     // 3. project with filter and function
     sql =
         "SELECT s1+s3, CAST(s2 AS DOUBLE) FROM table1 WHERE REPLACE(tag1, 
'low', '!')='!' AND attr2='B'";
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
@@ -570,7 +571,7 @@ public class AnalyzerTest {
 
     // 4. project with not all attributes, to test the rightness of 
PruneUnUsedColumns
     sql = "SELECT tag2, attr2, s2 FROM table1";
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
@@ -588,7 +589,7 @@ public class AnalyzerTest {
     // 1. is null / is not null
     sql = "SELECT * FROM table1 WHERE tag1 is not null and s1 is null";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
@@ -607,7 +608,7 @@ public class AnalyzerTest {
     // 2. like
     sql = "SELECT * FROM table1 WHERE tag1 like '%m'";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
@@ -624,7 +625,7 @@ public class AnalyzerTest {
     sql =
         "SELECT *, s1/2, s2+1, s2*3, s1+s2, s2%1 FROM table1 WHERE tag1 in 
('A', 'B') and tag2 not in ('A', 'C')";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
@@ -641,7 +642,7 @@ public class AnalyzerTest {
     // 4. not
     sql = "SELECT * FROM table1 WHERE tag1 not like '%m'";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
@@ -650,7 +651,7 @@ public class AnalyzerTest {
     // 5. String literal comparisons
     sql = "SELECT * FROM table1 WHERE tag1 <= 's1'";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
@@ -665,7 +666,7 @@ public class AnalyzerTest {
     // 6. String column comparisons
     sql = "SELECT * FROM table1 WHERE tag1 != attr1";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
@@ -683,7 +684,7 @@ public class AnalyzerTest {
     // 1. cast
     sql = "SELECT CAST(s2 AS DOUBLE) FROM table1 WHERE CAST(s1 AS DOUBLE) > 
1.0";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -692,7 +693,7 @@ public class AnalyzerTest {
     sql =
         "SELECT SUBSTRING(tag1, 2), SUBSTRING(tag2, s1) FROM table1 WHERE 
SUBSTRING(tag2, 1) = 'A'";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -700,7 +701,7 @@ public class AnalyzerTest {
     // 3. round
     sql = "SELECT ROUND(s1, 1) FROM table1 WHERE ROUND(s2, 2) > 1.0";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -708,7 +709,7 @@ public class AnalyzerTest {
     // 4. replace
     sql = "SELECT REPLACE(tag1, 'A', 'B') FROM table1 WHERE REPLACE(attr1, 
'C', 'D') = 'D'";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -719,7 +720,7 @@ public class AnalyzerTest {
     // 1. only diff
     sql = "SELECT DIFF(s1) FROM table1 WHERE DIFF(s2) > 0";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -762,7 +763,7 @@ public class AnalyzerTest {
     // 2. diff with time filter, tag filter and measurement filter
     sql = "SELECT s1 FROM table1 WHERE DIFF(s2) > 0 and time > 5 and tag1 = 
'A' and s1 = 1";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP);
     logicalQueryPlan = logicalPlanner.plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -780,7 +781,7 @@ public class AnalyzerTest {
         "SELECT *, s1/2, s2+1 FROM table1 WHERE tag1 in ('A', 'B') and tag2 = 
'C' and tag3 is not null and attr1 like '_'"
             + "and s2 iS NUll and S1 = 6 and s3 < 8.0 and tAG1 LIKE '%m'";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
@@ -806,7 +807,7 @@ public class AnalyzerTest {
   public void limitOffsetTest() {
     sql = "SELECT tag1, attr1, s1 FROM table1 offset 3 limit 5";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -820,7 +821,7 @@ public class AnalyzerTest {
         "SELECT *, s1/2, s2+1 FROM table1 WHERE tag1 in ('A', 'B') and tag2 = 
'C' "
             + "and s2 iS NUll and S1 = 6 and s3 < 8.0 and tAG1 LIKE '%m' 
offset 3 limit 5";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -836,7 +837,7 @@ public class AnalyzerTest {
   public void predicateCannotNormalizedTest() {
     sql = "SELECT * FROM table1 where (time > 1 and s1 > 1 or s2 < 7) or (time 
< 10 and s1 > 4)";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -853,7 +854,7 @@ public class AnalyzerTest {
   public void limitEliminationTest() {
     sql = "SELECT s1+s3 FROM table1 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     // logical plan: `OutputNode - ProjectNode - LimitNode - TableScanNode`
@@ -886,7 +887,7 @@ public class AnalyzerTest {
 
     sql = "SELECT s1,s1+s3 FROM table1 where tag1='beijing' and tag2='A1' 
limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     // logical plan: `OutputNode - ProjectNode - LimitNode - TableScanNode`
@@ -909,7 +910,7 @@ public class AnalyzerTest {
 
     sql = "SELECT diff(s1) FROM table1 where tag1='beijing' and tag2='A1' 
limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     // logical plan: `OutputNode - ProjectNode - LimitNode - TableScanNode`
@@ -929,7 +930,7 @@ public class AnalyzerTest {
   public void duplicateProjectionsTest() {
     sql = "SELECT Time,time,s1+1,S1+1,tag1,TAG1 FROM table1";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -1029,6 +1030,7 @@ public class AnalyzerTest {
         analyzeStatement(
             insertTabletStatement.toRelationalStatement(context),
             mockMetadata,
+            context,
             new SqlParser(),
             sessionInfo);
     assertEquals(1, 
actualAnalysis.getDataPartition().getDataPartitionMap().size());
@@ -1074,6 +1076,7 @@ public class AnalyzerTest {
         analyzeStatement(
             insertStatement.toRelationalStatement(context),
             mockMetadata,
+            context,
             new SqlParser(),
             sessionInfo);
     assertEquals(1, 
actualAnalysis.getDataPartition().getDataPartitionMap().size());
@@ -1106,30 +1109,35 @@ public class AnalyzerTest {
     assertEquals(1, distributedQueryPlan.getInstances().size());
   }
 
-  public static Analysis analyzeSQL(String sql, Metadata metadata) {
+  public static Analysis analyzeSQL(String sql, Metadata metadata, final 
MPPQueryContext context) {
     SqlParser sqlParser = new SqlParser();
     Statement statement = sqlParser.createStatement(sql, 
ZoneId.systemDefault());
     SessionInfo session =
         new SessionInfo(
             0, "test", ZoneId.systemDefault(), "testdb", 
IClientSession.SqlDialect.TABLE);
-    return analyzeStatement(statement, metadata, sqlParser, session);
+    return analyzeStatement(statement, metadata, context, sqlParser, session);
   }
 
   public static Analysis analyzeStatement(
-      Statement statement, Metadata metadata, SqlParser sqlParser, SessionInfo 
session) {
+      final Statement statement,
+      final Metadata metadata,
+      final MPPQueryContext context,
+      final SqlParser sqlParser,
+      final SessionInfo session) {
     try {
-      StatementAnalyzerFactory statementAnalyzerFactory =
+      final StatementAnalyzerFactory statementAnalyzerFactory =
           new StatementAnalyzerFactory(metadata, sqlParser, nopAccessControl);
 
       Analyzer analyzer =
           new Analyzer(
+              context,
               session,
               statementAnalyzerFactory,
               Collections.emptyList(),
               Collections.emptyMap(),
               NOOP);
       return analyzer.analyze(statement);
-    } catch (Exception e) {
+    } catch (final Exception e) {
       e.printStackTrace();
       fail(statement + ", " + e.getMessage());
     }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/LimitOffsetPushDownTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/LimitOffsetPushDownTest.java
index d5045ac4163..6791070b16c 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/LimitOffsetPushDownTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/LimitOffsetPushDownTest.java
@@ -11,6 +11,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.apache.iotdb.db.queryengine.plan.relational.analyzer;
 
 import org.apache.iotdb.commons.conf.IoTDBConstant;
@@ -70,7 +71,7 @@ public class LimitOffsetPushDownTest {
   public void noOrderByTest() {
     sql = "SELECT time, tag3, cast(s2 AS double) FROM table1 where s1>1 offset 
5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
@@ -110,7 +111,7 @@ public class LimitOffsetPushDownTest {
     sql =
         "SELECT time, tag3, cast(s2 AS double) FROM table1 where s1>1 order by 
tag2 desc, tag1 asc, attr1 desc, tag3 desc, time desc, s1+s3 asc offset 5 limit 
10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
@@ -144,7 +145,7 @@ public class LimitOffsetPushDownTest {
 
     sql = "SELECT * FROM table1 order by tag2 desc, tag1 asc, attr1 desc, tag3 
desc limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
@@ -183,7 +184,7 @@ public class LimitOffsetPushDownTest {
     sql =
         "SELECT time, tag3, cast(s2 AS double) FROM table1 where s1>1 order by 
tag2 desc, attr1 desc, tag3 desc, time desc, s1+s3 asc offset 5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
@@ -224,7 +225,7 @@ public class LimitOffsetPushDownTest {
     sql =
         "SELECT time, tag3, cast(s2 AS double) FROM table1 where s1>1 order by 
time desc, tag2 asc, s1+s3 asc offset 5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
@@ -264,7 +265,7 @@ public class LimitOffsetPushDownTest {
     sql =
         "SELECT time, tag3, cast(s2 AS double) FROM table1 where s1>1 order by 
s1 desc, tag2 desc, attr1 desc, tag3 desc, time desc, s1+s3 asc offset 5 limit 
10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
             .plan(actualAnalysis);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/SortTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/SortTest.java
index 7feb9dc1b1c..238bacc8180 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/SortTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/SortTest.java
@@ -100,7 +100,7 @@ public class SortTest {
         "SELECT time, tag3, tag1, cast(s2 as double), s2+s3, attr1 FROM table1 
"
             + "where s1>1 and s1+s3>0 and cast(s1 as double)>1.0 order by tag2 
desc, tag3 asc, time desc, s1+s2 desc offset 5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -176,7 +176,7 @@ public class SortTest {
 
     sql = "SELECT * FROM table1 order by tag2 desc, tag3 asc offset 5 limit 
10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -202,7 +202,7 @@ public class SortTest {
         "SELECT time, tag3, tag1, cast(s2 as double), s2+s3, attr1 FROM table1 
"
             + "where s1>1 and s1+s3>0 and cast(s1 as double)>1.0 order by tag2 
desc, tag1 desc, tag3 asc, time desc, s1+s2 desc offset 5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -280,7 +280,7 @@ public class SortTest {
         "SELECT time, tag3, tag1, cast(s2 as double), s2+s3, attr1 FROM table1 
"
             + "where s1>1 and s1+s3>0 and cast(s1 as double)>1.0 order by tag2 
desc, tag1 desc, tag3 asc, time desc, s1+s2 desc";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -348,7 +348,7 @@ public class SortTest {
         "SELECT time, tag3, tag1, cast(s2 as double), s2+s3, attr1 FROM table1 
"
             + "where s1>1 and s1+s3>0 and cast(s1 as double)>1.0 order by tag2 
desc, tag1 desc, s1+s2 desc, time desc offset 5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -428,7 +428,7 @@ public class SortTest {
         "SELECT time, tag3, tag1, cast(s2 as double), s2+s3, attr1 FROM table1 
"
             + "where s1>1 and s1+s3>0 and cast(s1 as double)>1.0 order by tag2 
desc, tag1 desc, tag3 asc, s1+s2 desc, time desc offset 5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -506,7 +506,7 @@ public class SortTest {
     sql =
         "SELECT time, tag3, tag1, cast(s2 as double), s2+s3, attr1 FROM table1 
order by time desc, tag2 asc, tag3 desc, s1+s2 desc offset 5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -518,7 +518,7 @@ public class SortTest {
         "SELECT time, tag3, substring(tag1, 1), cast(s2 as double), s2+s3, 
attr1 FROM table1 "
             + "where s1>1 and s1+s3>0 and cast(s1 as double)>1.0 order by time 
desc, s1+s2 asc, tag2 asc, tag1 desc offset 5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -529,7 +529,7 @@ public class SortTest {
         "SELECT time, tag3, tag1, cast(s2 as double), s2+s3, attr1 FROM table1 
"
             + "where s1>1 and s1+s3>0 and cast(s1 as double)>1.0 order by time 
desc, s1+s2 asc, tag2 asc, tag3 desc, tag1 desc offset 5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -540,7 +540,7 @@ public class SortTest {
         "SELECT time, tag3, tag1, cast(s2 as double), s2+s3, attr1 FROM table1 
"
             + "where s1>1 and s1+s3>0 and cast(s1 as double)>1.0 order by time 
desc, tag2 asc, tag3 desc, tag1 asc, s1+s2 desc offset 5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -555,7 +555,7 @@ public class SortTest {
         "SELECT time, tag3, tag1, cast(s2 as double), s2+s3, attr1 FROM table1 
"
             + "order by s1+s2 desc, tag2 desc, tag1 desc, time desc offset 5 
limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -566,7 +566,7 @@ public class SortTest {
         "SELECT time, tag3, tag1, cast(s2 as double), s2+s3, attr1 FROM table1 
"
             + "where s1>1 and s1+s3>0 and cast(s1 as double)>1.0 order by 
s1+s2 desc, tag2 desc, tag1 desc, tag3 desc, time asc offset 5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -577,7 +577,7 @@ public class SortTest {
         "SELECT time, tag3, tag1, cast(s2 as double), s2+s3, attr1 FROM table1 
"
             + "where s1>1 and s1+s3>0 and cast(s1 as double)>1.0 order by 
s1+s2 desc, time desc, tag2 desc, tag1 desc offset 5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
@@ -588,7 +588,7 @@ public class SortTest {
         "SELECT time, tag3, tag1, cast(s2 as double), s2+s3, attr1 FROM table1 
"
             + "where s1>1 and s1+s3>0 and cast(s1 as double)>1.0 order by 
s1+s2 desc, time desc, tag2 desc, tag1 desc, tag3 asc offset 5 limit 10";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     logicalQueryPlan =
         new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanTester.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanTester.java
index 170cff354d0..254fd5f0912 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanTester.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanTester.java
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.iotdb.db.queryengine.plan.relational.planner;
 
 import org.apache.iotdb.commons.conf.IoTDBConstant;
@@ -113,17 +114,24 @@ public class PlanTester {
     SessionInfo session =
         new SessionInfo(
             0, "test", ZoneId.systemDefault(), "testdb", 
IClientSession.SqlDialect.TABLE);
-    return analyzeStatement(statement, metadata, sqlParser, session);
+    final MPPQueryContext context =
+        new MPPQueryContext(sql, new QueryId("test_query"), session, null, 
null);
+    return analyzeStatement(statement, metadata, context, sqlParser, session);
   }
 
   public static Analysis analyzeStatement(
-      Statement statement, Metadata metadata, SqlParser sqlParser, SessionInfo 
session) {
+      Statement statement,
+      Metadata metadata,
+      MPPQueryContext context,
+      SqlParser sqlParser,
+      SessionInfo session) {
     try {
       StatementAnalyzerFactory statementAnalyzerFactory =
           new StatementAnalyzerFactory(metadata, sqlParser, new 
NopAccessControl());
 
       Analyzer analyzer =
           new Analyzer(
+              context,
               session,
               statementAnalyzerFactory,
               Collections.emptyList(),
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PredicateUtilsTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PredicateUtilsTest.java
index ad68875c172..4820b14eadc 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PredicateUtilsTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PredicateUtilsTest.java
@@ -19,6 +19,11 @@
 
 package org.apache.iotdb.db.queryengine.plan.relational.planner;
 
+import org.apache.iotdb.commons.conf.IoTDBConstant;
+import org.apache.iotdb.db.protocol.session.IClientSession;
+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.relational.analyzer.Analysis;
 import org.apache.iotdb.db.queryengine.plan.relational.analyzer.TestMatadata;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
@@ -27,6 +32,8 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression;
 import org.apache.tsfile.utils.Pair;
 import org.junit.Test;
 
+import java.time.ZoneId;
+
 import static 
org.apache.iotdb.db.queryengine.plan.relational.analyzer.AnalyzerTest.analyzeSQL;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.PredicateUtils.extractGlobalTimePredicate;
 
@@ -34,16 +41,29 @@ public class PredicateUtilsTest {
   @Test
   public void extractGlobalTimePredicateTest() {
     String sql = "SELECT tag1 FROM table1 where time>1 and s1>1";
-    Metadata metadata = new TestMatadata();
+    final Metadata metadata = new TestMatadata();
+    final MPPQueryContext context =
+        new MPPQueryContext(
+            sql,
+            new QueryId("test_query"),
+            new SessionInfo(
+                1L,
+                "iotdb-user",
+                ZoneId.systemDefault(),
+                IoTDBConstant.ClientVersion.V_1_0,
+                "db",
+                IClientSession.SqlDialect.TABLE),
+            null,
+            null);
 
-    Analysis actualAnalysis = analyzeSQL(sql, metadata);
+    Analysis actualAnalysis = analyzeSQL(sql, metadata, context);
     Pair<Expression, Boolean> ret =
         extractGlobalTimePredicate(
             actualAnalysis.getWhereMap().values().iterator().next(), true, 
true);
     System.out.println(ret.getLeft());
 
     sql = "SELECT tag1 FROM table1 where time>1 and s1>1 or tag1='A'";
-    actualAnalysis = analyzeSQL(sql, metadata);
+    actualAnalysis = analyzeSQL(sql, metadata, context);
     ret =
         extractGlobalTimePredicate(
             actualAnalysis.getWhereMap().values().iterator().next(), true, 
true);

Reply via email to