You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ca...@apache.org on 2024/04/16 01:44:01 UTC

(iotdb) branch ty/TableModelGrammar updated (095f86adc68 -> 5a90254881e)

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

caogaofei pushed a change to branch ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git


    from 095f86adc68 add interface
     new 34bf1aa11bb add optimizer RemoveRedundantIdentityProjections
     new 3a8183fe219 Merge branch 'ty/TableModelGrammar' of github.com:apache/iotdb into ty/TableModelGrammar
     new c818ecda1af add optimizer
     new 09e1be46ebf merge master
     new 5a90254881e perfect process

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../plan/planner/plan/node/PlanNode.java           |   6 +
 .../plan/planner/plan/node/PlanVisitor.java        |   5 +
 .../relational/metadata/TableMetadataImpl.java     |   9 +
 .../plan/relational/planner/Assignments.java       |   5 +-
 .../plan/relational/planner/LogicalPlanner.java    |   7 +-
 .../plan/relational/planner/PlanBuilder.java       |  45 ++---
 .../plan/relational/planner/QueryPlanner.java      |  63 +++----
 .../plan/relational/planner/RelationPlan.java      |   6 +-
 .../plan/relational/planner/RelationPlanner.java   | 181 +++++++--------------
 .../distribute/RelationalDistributionPlanner.java  |   3 +
 .../plan/relational/planner/node/FilterNode.java   |   8 +-
 .../plan/relational/planner/node/LimitNode.java    |  10 +-
 .../plan/relational/planner/node/OffsetNode.java   |   8 +-
 .../plan/relational/planner/node/OutputNode.java   |  20 ++-
 .../plan/relational/planner/node/ProjectNode.java  |  14 +-
 .../plan/relational/planner/node/SortNode.java     |  12 +-
 .../relational/planner/node/TableScanNode.java     |   5 +
 ...RelationalPlanOptimizer.java => IndexScan.java} |   8 +-
 ...ava => RemoveRedundantIdentityProjections.java} |  61 ++++---
 .../planner/optimizations/SimplifyExpressions.java |   4 -
 .../plan/relational/analyzer/AnalyzerTest.java     |   6 +-
 .../plan/relational/analyzer/TestMatadata.java     |  10 ++
 22 files changed, 274 insertions(+), 222 deletions(-)
 copy iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/{RelationalPlanOptimizer.java => IndexScan.java} (82%)
 copy iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/{SimplifyExpressions.java => RemoveRedundantIdentityProjections.java} (50%)


(iotdb) 03/05: add optimizer

Posted by ca...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

caogaofei pushed a commit to branch ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit c818ecda1afa85d252daad3a98307bbfaf115889
Author: Beyyes <cg...@foxmail.com>
AuthorDate: Tue Apr 16 09:25:22 2024 +0800

    add optimizer
---
 .../plan/relational/planner/PlanBuilder.java       | 37 +++++++++++++---------
 .../plan/relational/planner/QueryPlanner.java      | 26 +++++++++------
 .../distribute/RelationalDistributionPlanner.java  |  3 ++
 .../IndexScan.java}                                | 19 ++++-------
 .../RemoveRedundantIdentityProjections.java        |  1 +
 .../plan/relational/analyzer/AnalyzerTest.java     |  5 ++-
 6 files changed, 52 insertions(+), 39 deletions(-)

diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
index a34e17dbf85..49f93ed3e66 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
@@ -24,8 +24,10 @@ import org.apache.iotdb.db.relational.sql.tree.Expression;
 import com.google.common.collect.ImmutableMap;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import static java.util.Objects.requireNonNull;
 
@@ -65,26 +67,31 @@ public class PlanBuilder {
   }
 
   public <T extends Expression> PlanBuilder appendProjections(
-      Iterable<T> expressions, SymbolAllocator symbolAllocator, QueryId idAllocator) {
+      Iterable<T> expressions,
+      Analysis analysis,
+      SymbolAllocator symbolAllocator,
+      QueryId idAllocator) {
     Assignments.Builder projections = Assignments.builder();
 
     // add an identity projection for underlying plan
     projections.putIdentities(root.getOutputSymbols());
 
-    Map<ScopeAware<Expression>, Symbol> mappings = new HashMap<>();
-    //        for (T expression : expressions) {
-    //            // Skip any expressions that have already been translated and recorded in the
-    // translation map, or that are duplicated in the list of exp
-    //            if (!mappings.containsKey(scopeAwareKey(expression, translations.getAnalysis(),
-    //                    translations.getScope())) && !alreadyHasTranslation.test(translations,
-    // expression)) {
-    //                Symbol symbol = symbolAllocator.newSymbol("expr",
-    // translations.getAnalysis().getType(expression));
-    //                projections.put(symbol, rewriter.apply(translations, expression));
-    //                mappings.put(scopeAwareKey(expression, translations.getAnalysis(),
-    // translations.getScope()), symbol);
-    //            }
-    //        }
+    Set<String> set = new HashSet<>();
+    for (Symbol symbol : root.getOutputSymbols()) {
+      set.add(symbol.toString());
+    }
+
+    Map<Expression, Symbol> mappings = new HashMap<>();
+    for (T expression : expressions) {
+      // Skip any expressions that have already been translated and recorded in the
+      // translation map, or that are duplicated in the list of exp
+      if (!mappings.containsKey(expression) && !set.contains(expression.toString())) {
+        set.add(expression.toString());
+        Symbol symbol = symbolAllocator.newSymbol("expr", analysis.getType(expression));
+        projections.put(symbol, expression);
+        mappings.put(expression, symbol);
+      }
+    }
 
     return new PlanBuilder(new ProjectNode(idAllocator.genPlanNodeId(), root, projections.build()));
   }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java
index 768cd3ca4b5..c92fbdaa66c 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java
@@ -83,21 +83,25 @@ public class QueryPlanner {
     List<Expression> orderBy = analysis.getOrderByExpressions(query);
     // builder = subqueryPlanner.handleSubqueries(builder, orderBy, analysis.getSubqueries(query));
 
+    // TODO result is :input[0], :input[1], :input[2]
     List<Analysis.SelectExpression> selectExpressions = analysis.getSelectExpressions(query);
     List<Expression> outputs =
         selectExpressions.stream()
             .map(Analysis.SelectExpression::getExpression)
             .collect(toImmutableList());
 
-    builder =
-        builder.appendProjections(Iterables.concat(orderBy, outputs), symbolAllocator, idAllocator);
+    if (orderBy.size() > 0) {
+      builder =
+          builder.appendProjections(
+              Iterables.concat(orderBy, outputs), analysis, symbolAllocator, idAllocator);
+    }
 
     Optional<OrderingScheme> orderingScheme =
         orderingScheme(builder, query.getOrderBy(), analysis.getOrderByExpressions(query));
     builder = sort(builder, orderingScheme);
     builder = offset(builder, query.getOffset());
     builder = limit(builder, query.getLimit(), orderingScheme);
-    builder = builder.appendProjections(outputs, symbolAllocator, idAllocator);
+    builder = builder.appendProjections(outputs, analysis, symbolAllocator, idAllocator);
 
     return new RelationPlan(
         builder.getRoot(), analysis.getScope(query), computeOutputs(builder, outputs));
@@ -121,7 +125,7 @@ public class QueryPlanner {
     if (hasExpressionsToUnfold(selectExpressions)) {
       // pre-project the folded expressions to preserve any non-deterministic semantics of functions
       // that might be referenced
-      builder = builder.appendProjections(expressions, symbolAllocator, idAllocator);
+      builder = builder.appendProjections(expressions, analysis, symbolAllocator, idAllocator);
     }
 
     List<Expression> outputs = outputExpressions(selectExpressions);
@@ -133,13 +137,14 @@ public class QueryPlanner {
         // translated
         // aggregations are visible.
         List<Expression> orderByAggregates = analysis.getOrderByAggregates(node.getOrderBy().get());
-        builder = builder.appendProjections(orderByAggregates, symbolAllocator, idAllocator);
+        builder =
+            builder.appendProjections(orderByAggregates, analysis, symbolAllocator, idAllocator);
       }
 
       // Add projections for the outputs of SELECT, but stack them on top of the ones from the FROM
       // clause so both are visible
       // when resolving the ORDER BY clause.
-      builder = builder.appendProjections(outputs, symbolAllocator, idAllocator);
+      builder = builder.appendProjections(outputs, analysis, symbolAllocator, idAllocator);
 
       // The new scope is the composite of the fields from the FROM and SELECT clause (local nested
       // scopes). Fields from the bottom of
@@ -156,8 +161,11 @@ public class QueryPlanner {
 
     List<Expression> orderBy = analysis.getOrderByExpressions(node);
     // TODO this appendProjections may be removed
-    builder =
-        builder.appendProjections(Iterables.concat(orderBy, outputs), symbolAllocator, idAllocator);
+    if (orderBy.size() > 0) {
+      builder =
+          builder.appendProjections(
+              Iterables.concat(orderBy, outputs), analysis, symbolAllocator, idAllocator);
+    }
 
     // TODO handle distinct
 
@@ -166,7 +174,7 @@ public class QueryPlanner {
     builder = sort(builder, orderingScheme);
     builder = offset(builder, node.getOffset());
     builder = limit(builder, node.getLimit(), orderingScheme);
-    builder = builder.appendProjections(outputs, symbolAllocator, idAllocator);
+    builder = builder.appendProjections(outputs, analysis, symbolAllocator, idAllocator);
 
     return new RelationPlan(
         builder.getRoot(), analysis.getScope(node), computeOutputs(builder, outputs));
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java
index 0c85ad78cde..de946fb8c33 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java
@@ -13,6 +13,7 @@
  */
 package org.apache.iotdb.db.queryengine.plan.relational.planner.distribute;
 
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.DistributedQueryPlan;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.LogicalQueryPlan;
 import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis;
@@ -20,10 +21,12 @@ import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis;
 public class RelationalDistributionPlanner {
   private final Analysis analysis;
   private final LogicalQueryPlan logicalQueryPlan;
+  private final MPPQueryContext context;
 
   public RelationalDistributionPlanner(Analysis analysis, LogicalQueryPlan logicalQueryPlan) {
     this.analysis = analysis;
     this.logicalQueryPlan = logicalQueryPlan;
+    this.context = null;
   }
 
   public DistributedQueryPlan planFragments() {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java
similarity index 58%
copy from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java
copy to iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java
index 0c85ad78cde..21a54da4e73 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java
@@ -11,22 +11,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.iotdb.db.queryengine.plan.relational.planner.distribute;
 
-import org.apache.iotdb.db.queryengine.plan.planner.plan.DistributedQueryPlan;
-import org.apache.iotdb.db.queryengine.plan.planner.plan.LogicalQueryPlan;
-import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis;
+package org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations;
 
-public class RelationalDistributionPlanner {
-  private final Analysis analysis;
-  private final LogicalQueryPlan logicalQueryPlan;
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
+import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis;
 
-  public RelationalDistributionPlanner(Analysis analysis, LogicalQueryPlan logicalQueryPlan) {
-    this.analysis = analysis;
-    this.logicalQueryPlan = logicalQueryPlan;
-  }
+public class IndexScan implements RelationalPlanOptimizer {
 
-  public DistributedQueryPlan planFragments() {
+  @Override
+  public PlanNode optimize(PlanNode planNode, Analysis analysis, MPPQueryContext context) {
     return null;
   }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/RemoveRedundantIdentityProjections.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/RemoveRedundantIdentityProjections.java
index d7366dfe9df..34da737fd93 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/RemoveRedundantIdentityProjections.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/RemoveRedundantIdentityProjections.java
@@ -45,6 +45,7 @@ public class RemoveRedundantIdentityProjections implements RelationalPlanOptimiz
 
     @Override
     public PlanNode visitProject(ProjectNode projectNode, RewriterContext context) {
+      // TODO change the impl using the method of context.getParent()
       if (projectNode.getOutputSymbols().equals(projectNode.getChild().getOutputSymbols())) {
         if (context.getParent() instanceof SingleChildProcessNode) {
           ((SingleChildProcessNode) context.getParent()).setChild(projectNode.getChild());
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 143bd906fbe..ca45289fae1 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
@@ -135,9 +135,8 @@ public class AnalyzerTest {
   @Test
   public void testSingleTableQuery() throws IoTDBException {
     // no sort
-    String sql =
-        "SELECT tag1 as tt, tag2, attr1, s1+1 FROM table1 "
-            + "WHERE time>1 AND tag1='A' OR s2>3 OFFSET 10 LIMIT 5";
+    String sql = "SELECT tag1 as tt, tag2, attr1, s1+1 FROM table1 ";
+    // + "WHERE time>1 AND tag1='A' OR s2>3";
     Metadata metadata = new TestMatadata();
 
     Analysis actualAnalysis = analyzeSQL(sql, metadata);


(iotdb) 01/05: add optimizer RemoveRedundantIdentityProjections

Posted by ca...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

caogaofei pushed a commit to branch ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 34bf1aa11bb08c976c62f4104a888712e61e2076
Author: Beyyes <cg...@foxmail.com>
AuthorDate: Mon Apr 15 20:13:56 2024 +0800

    add optimizer RemoveRedundantIdentityProjections
---
 .../plan/planner/plan/node/PlanNode.java           |   6 +
 .../plan/planner/plan/node/PlanVisitor.java        |   5 +
 .../plan/relational/planner/Assignments.java       |   5 +-
 .../plan/relational/planner/LogicalPlanner.java    |   7 +-
 .../plan/relational/planner/PlanBuilder.java       |   6 +-
 .../plan/relational/planner/QueryPlanner.java      |  37 ++--
 .../plan/relational/planner/RelationPlan.java      |   6 +-
 .../plan/relational/planner/RelationPlanner.java   | 188 +++++++--------------
 .../plan/relational/planner/node/FilterNode.java   |   8 +-
 .../plan/relational/planner/node/LimitNode.java    |  10 +-
 .../plan/relational/planner/node/OffsetNode.java   |   8 +-
 .../plan/relational/planner/node/OutputNode.java   |  20 ++-
 .../plan/relational/planner/node/ProjectNode.java  |  14 +-
 .../plan/relational/planner/node/SortNode.java     |  12 +-
 .../relational/planner/node/TableScanNode.java     |   5 +
 ...ava => RemoveRedundantIdentityProjections.java} |  60 ++++---
 .../planner/optimizations/SimplifyExpressions.java |   4 -
 .../plan/relational/analyzer/AnalyzerTest.java     |   3 +-
 18 files changed, 207 insertions(+), 197 deletions(-)

diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNode.java
index 877db9bf543..b8a9ebf66f6 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNode.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNode.java
@@ -22,6 +22,7 @@ package org.apache.iotdb.db.queryengine.plan.planner.plan.node;
 import org.apache.iotdb.commons.exception.runtime.SerializationRunTimeException;
 import org.apache.iotdb.consensus.common.request.IConsensusRequest;
 import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 import org.apache.iotdb.tsfile.utils.PublicBAOS;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
@@ -206,4 +207,9 @@ public abstract class PlanNode implements IConsensusRequest {
   public int hashCode() {
     return Objects.hash(id);
   }
+
+  // =========================== Used for Relational Model ============================
+  public List<Symbol> getOutputSymbols() {
+    throw new UnsupportedOperationException("This planNode does not support getOutputSymbols().");
+  }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java
index 9e893bbc653..393f46a43ba 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java
@@ -518,4 +518,9 @@ public abstract class PlanVisitor<R, C> {
   public R visitTableScan(TableScanNode node, C context) {
     return visitPlan(node, context);
   }
+
+  public R visitProject(
+      org.apache.iotdb.db.queryengine.plan.relational.planner.node.ProjectNode node, C context) {
+    return visitPlan(node, context);
+  }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/Assignments.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/Assignments.java
index 992ada2a745..a439f41f00b 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/Assignments.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/Assignments.java
@@ -37,6 +37,9 @@ import static java.util.Arrays.asList;
 import static java.util.Objects.requireNonNull;
 
 public class Assignments {
+
+  private final Map<Symbol, Expression> assignments;
+
   public static Builder builder() {
     return new Builder();
   }
@@ -66,8 +69,6 @@ public class Assignments {
     return builder().put(symbol1, expression1).put(symbol2, expression2).build();
   }
 
-  private final Map<Symbol, Expression> assignments;
-
   @JsonCreator
   public Assignments(@JsonProperty("assignments") Map<Symbol, Expression> assignments) {
     this.assignments = ImmutableMap.copyOf(requireNonNull(assignments, "assignments is null"));
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 f11c0d86f98..5e54848763f 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
@@ -25,6 +25,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.analyzer.RelationType;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.OutputNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.RelationalPlanOptimizer;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.RemoveRedundantIdentityProjections;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.SimplifyExpressions;
 import org.apache.iotdb.db.relational.sql.tree.Query;
 import org.apache.iotdb.db.relational.sql.tree.Statement;
@@ -34,7 +35,7 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import io.airlift.log.Logger;
 
-import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import static java.util.Objects.requireNonNull;
@@ -58,8 +59,8 @@ public class LogicalPlanner {
     this.sessionInfo = requireNonNull(sessionInfo, "session is null");
     this.warningCollector = requireNonNull(warningCollector, "warningCollector is null");
 
-    this.relationalPlanOptimizers = new ArrayList<>();
-    this.relationalPlanOptimizers.add(new SimplifyExpressions());
+    this.relationalPlanOptimizers =
+        Arrays.asList(new SimplifyExpressions(), new RemoveRedundantIdentityProjections());
   }
 
   public LogicalQueryPlan plan(Analysis analysis) throws IoTDBException {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
index 2045233cb37..a34e17dbf85 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
@@ -29,7 +29,8 @@ import java.util.Map;
 
 import static java.util.Objects.requireNonNull;
 
-class PlanBuilder {
+public class PlanBuilder {
+
   private final PlanNode root;
 
   public PlanBuilder(PlanNode root) {
@@ -68,8 +69,7 @@ class PlanBuilder {
     Assignments.Builder projections = Assignments.builder();
 
     // add an identity projection for underlying plan
-    // TODO needed?
-    // projections.putIdentities(root.getOutputSymbols());
+    projections.putIdentities(root.getOutputSymbols());
 
     Map<ScopeAware<Expression>, Symbol> mappings = new HashMap<>();
     //        for (T expression : expressions) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java
index eb23a4a2cbf..768cd3ca4b5 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java
@@ -28,6 +28,7 @@ import org.apache.iotdb.db.relational.sql.tree.Node;
 import org.apache.iotdb.db.relational.sql.tree.Offset;
 import org.apache.iotdb.db.relational.sql.tree.OrderBy;
 import org.apache.iotdb.db.relational.sql.tree.Query;
+import org.apache.iotdb.db.relational.sql.tree.QueryBody;
 import org.apache.iotdb.db.relational.sql.tree.QuerySpecification;
 import org.apache.iotdb.db.relational.sql.tree.SortItem;
 import org.apache.iotdb.tsfile.read.common.type.Type;
@@ -47,18 +48,17 @@ import static java.util.Objects.requireNonNull;
 import static org.apache.iotdb.db.queryengine.plan.relational.planner.OrderingTranslator.sortItemToSortOrder;
 import static org.apache.iotdb.db.queryengine.plan.relational.planner.PlanBuilder.newPlanBuilder;
 
-class QueryPlanner {
-  private static final int MAX_BIGINT_PRECISION = 19;
+public class QueryPlanner {
   private final Analysis analysis;
   private final SymbolAllocator symbolAllocator;
   private final QueryId idAllocator;
-  // private final Map<NodeRef<LambdaArgumentDeclaration>, Symbol> lambdaDeclarationToSymbolMap;
-  // private final PlannerContext plannerContext;
   private final SessionInfo session;
-  // private final SubqueryPlanner subqueryPlanner;
   private final Map<NodeRef<Node>, RelationPlan> recursiveSubqueries;
 
-  QueryPlanner(
+  // private final Map<NodeRef<LambdaArgumentDeclaration>, Symbol> lambdaDeclarationToSymbolMap;
+  // private final SubqueryPlanner subqueryPlanner;
+
+  public QueryPlanner(
       Analysis analysis,
       SymbolAllocator symbolAllocator,
       QueryId idAllocator,
@@ -74,12 +74,11 @@ class QueryPlanner {
     this.symbolAllocator = symbolAllocator;
     this.idAllocator = idAllocator;
     this.session = session;
-    // this.subqueryPlanner = null;
     this.recursiveSubqueries = recursiveSubqueries;
   }
 
   public RelationPlan plan(Query query) {
-    PlanBuilder builder = planQueryBody(query);
+    PlanBuilder builder = planQueryBody(query.getQueryBody());
 
     List<Expression> orderBy = analysis.getOrderByExpressions(query);
     // builder = subqueryPlanner.handleSubqueries(builder, orderBy, analysis.getSubqueries(query));
@@ -108,20 +107,16 @@ class QueryPlanner {
     PlanBuilder builder = planFrom(node);
 
     builder = filter(builder, analysis.getWhere(node), node);
-    // builder = aggregate(builder, node);
-    builder = filter(builder, analysis.getHaving(node), node);
-    // builder = planWindowFunctions(node, builder,
-    // ImmutableList.copyOf(analysis.getWindowFunctions(node)));
-    // builder = planWindowMeasures(node, builder,
-    // ImmutableList.copyOf(analysis.getWindowMeasures(node)));
+
+    // TODO prcess aggregate, having later
 
     List<Analysis.SelectExpression> selectExpressions = analysis.getSelectExpressions(node);
     List<Expression> expressions =
         selectExpressions.stream()
             .map(Analysis.SelectExpression::getExpression)
             .collect(toImmutableList());
-    // builder = subqueryPlanner.handleSubqueries(builder, expressions,
-    // analysis.getSubqueries(node));
+
+    // TODO process subQuery later
 
     if (hasExpressionsToUnfold(selectExpressions)) {
       // pre-project the folded expressions to preserve any non-deterministic semantics of functions
@@ -160,10 +155,12 @@ class QueryPlanner {
     }
 
     List<Expression> orderBy = analysis.getOrderByExpressions(node);
+    // TODO this appendProjections may be removed
     builder =
         builder.appendProjections(Iterables.concat(orderBy, outputs), symbolAllocator, idAllocator);
 
-    // builder = distinct(builder, node, outputs);
+    // TODO handle distinct
+
     Optional<OrderingScheme> orderingScheme =
         orderingScheme(builder, node.getOrderBy(), analysis.getOrderByExpressions(node));
     builder = sort(builder, orderingScheme);
@@ -208,10 +205,10 @@ class QueryPlanner {
     return outputSymbols.build();
   }
 
-  private PlanBuilder planQueryBody(Query query) {
+  private PlanBuilder planQueryBody(QueryBody queryBody) {
     RelationPlan relationPlan =
         new RelationPlanner(analysis, symbolAllocator, idAllocator, session, recursiveSubqueries)
-            .process(query.getQueryBody(), null);
+            .process(queryBody, null);
 
     return newPlanBuilder(relationPlan, analysis, session);
   }
@@ -223,7 +220,7 @@ class QueryPlanner {
               .process(node.getFrom().get(), null);
       return newPlanBuilder(relationPlan, analysis, session);
     } else {
-      throw new RuntimeException("From clause must not by empty");
+      throw new IllegalStateException("From clause must not by empty");
     }
   }
 
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlan.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlan.java
index 5ece186d194..cdd1bab217f 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlan.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlan.java
@@ -29,15 +29,15 @@ import static java.util.Objects.requireNonNull;
  * values, etc.), and the mapping to indicate how the fields (by position) in the relation map to
  * the outputs of the plan.
  */
-class RelationPlan {
+public class RelationPlan {
 
   private final PlanNode root;
 
+  private final Scope scope;
+
   // for each field in the relation, the corresponding symbol from "root"
   private final List<Symbol> fieldMappings;
 
-  private final Scope scope;
-
   public RelationPlan(PlanNode root, Scope scope, List<Symbol> fieldMappings) {
     requireNonNull(root, "root is null");
     requireNonNull(fieldMappings, "fieldMappings is null");
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
index 9e180d3dc4c..b42cc50c693 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
@@ -25,11 +25,17 @@ import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableHandle;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableScanNode;
 import org.apache.iotdb.db.relational.sql.tree.AliasedRelation;
 import org.apache.iotdb.db.relational.sql.tree.AstVisitor;
+import org.apache.iotdb.db.relational.sql.tree.Except;
+import org.apache.iotdb.db.relational.sql.tree.Intersect;
+import org.apache.iotdb.db.relational.sql.tree.Join;
 import org.apache.iotdb.db.relational.sql.tree.Node;
 import org.apache.iotdb.db.relational.sql.tree.Query;
 import org.apache.iotdb.db.relational.sql.tree.QuerySpecification;
 import org.apache.iotdb.db.relational.sql.tree.SubqueryExpression;
 import org.apache.iotdb.db.relational.sql.tree.Table;
+import org.apache.iotdb.db.relational.sql.tree.TableSubquery;
+import org.apache.iotdb.db.relational.sql.tree.Union;
+import org.apache.iotdb.db.relational.sql.tree.Values;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -40,14 +46,14 @@ import java.util.Map;
 
 import static java.util.Objects.requireNonNull;
 
-class RelationPlanner extends AstVisitor<RelationPlan, Void> {
+public class RelationPlanner extends AstVisitor<RelationPlan, Void> {
   private final Analysis analysis;
   private final SymbolAllocator symbolAllocator;
   private final QueryId idAllocator;
   private final SessionInfo session;
   private final Map<NodeRef<Node>, RelationPlan> recursiveSubqueries;
 
-  RelationPlanner(
+  public RelationPlanner(
       Analysis analysis,
       SymbolAllocator symbolAllocator,
       QueryId idAllocator,
@@ -67,8 +73,9 @@ class RelationPlanner extends AstVisitor<RelationPlan, Void> {
   }
 
   @Override
-  protected RelationPlan visitNode(Node node, Void context) {
-    throw new IllegalStateException("Unsupported node type: " + node.getClass().getName());
+  protected RelationPlan visitQuery(Query node, Void context) {
+    return new QueryPlanner(analysis, symbolAllocator, idAllocator, session, recursiveSubqueries)
+        .plan(node);
   }
 
   @Override
@@ -83,154 +90,81 @@ class RelationPlanner extends AstVisitor<RelationPlan, Void> {
           expansion.getRoot(), expansion.getScope(), expansion.getFieldMappings());
     }
 
-    Query namedQuery = analysis.getNamedQuery(node);
     Scope scope = analysis.getScope(node);
+    TableHandle tableHandle = analysis.getTableHandle(node);
 
-    RelationPlan plan;
-    if (namedQuery != null) {
-      throw new RuntimeException("NamedQuery is not supported");
-    } else {
-      TableHandle handle = analysis.getTableHandle(node);
+    ImmutableList.Builder<Symbol> outputSymbolsBuilder = ImmutableList.builder();
+    ImmutableMap.Builder<Symbol, ColumnHandle> columnsBuilder = ImmutableMap.builder();
 
-      ImmutableList.Builder<Symbol> outputSymbolsBuilder = ImmutableList.builder();
-      ImmutableMap.Builder<Symbol, ColumnHandle> columns = ImmutableMap.builder();
-
-      // Collection<Field> fields = analysis.getMaterializedViewStorageTableFields(node);
-      Collection<Field> fields = scope.getRelationType().getAllFields();
-      for (Field field : fields) {
-        Symbol symbol = symbolAllocator.newSymbol(field);
+    Collection<Field> fields = scope.getRelationType().getAllFields();
+    for (Field field : fields) {
+      Symbol symbol = symbolAllocator.newSymbol(field);
+      outputSymbolsBuilder.add(symbol);
+      columnsBuilder.put(symbol, analysis.getColumn(field));
+    }
 
-        outputSymbolsBuilder.add(symbol);
-        columns.put(symbol, analysis.getColumn(field));
-      }
+    List<Symbol> outputSymbols = outputSymbolsBuilder.build();
+    PlanNode root =
+        new TableScanNode(
+            idAllocator.genPlanNodeId(), tableHandle, outputSymbols, columnsBuilder.buildOrThrow());
 
-      List<Symbol> outputSymbols = outputSymbolsBuilder.build();
-      PlanNode root =
-          new TableScanNode(
-              idAllocator.genPlanNodeId(), handle, outputSymbols, columns.buildOrThrow());
+    return new RelationPlan(root, scope, outputSymbols);
 
-      plan = new RelationPlan(root, scope, outputSymbols);
-    }
-
-    // TODO what's the meaning of RowFilters addColumnMasks?
+    // Query namedQuery = analysis.getNamedQuery(node);
+    // Collection<Field> fields = analysis.getMaterializedViewStorageTableFields(node);
     // plan = addRowFilters(node, plan);
     // plan = addColumnMasks(node, plan);
-
-    return plan;
   }
 
-  //  private RelationPlan addRowFilters(Table node, RelationPlan plan) {
-  //    return addRowFilters(node, plan, Function.identity());
-  //  }
-
-  //  public RelationPlan addRowFilters(
-  //      Table node, RelationPlan plan, Function<Expression, Expression> predicateTransformation) {
-  //    List<Expression> filters = null;
-  //    // analysis.getRowFilters(node);
-  //
-  //    if (filters.isEmpty()) {
-  //      return plan;
-  //    }
-  //
-  //    // The fields in the access control scope has the same layout as those for the table scope
-  //    PlanBuilder planBuilder = newPlanBuilder(plan, analysis, session);
-  //    // .withScope(accessControlScope.apply(node), plan.getFieldMappings());
-  //
-  //    for (Expression filter : filters) {
-  //      // planBuilder = subqueryPlanner.handleSubqueries(planBuilder, filter,
-  //      // analysis.getSubqueries(filter));
-  //
-  //      Expression predicate = coerceIfNecessary(analysis, filter, filter);
-  //      predicate = predicateTransformation.apply(predicate);
-  //      planBuilder =
-  //          planBuilder.withNewRoot(
-  //              new FilterNode(idAllocator.genPlanNodeId(), planBuilder.getRoot(), predicate));
-  //    }
-  //
-  //    return new RelationPlan(planBuilder.getRoot(), plan.getScope(), plan.getFieldMappings());
-  //  }
-
-  //    private RelationPlan addColumnMasks(Table table, RelationPlan plan) {
-  //        Map<String, Expression> columnMasks = analysis.getColumnMasks(table);
-  //
-  //        // A Table can represent a WITH query, which can have anonymous fields. On the other
-  // hand,
-  //        // it can't have masks. The loop below expects fields to have proper names, so bail out
-  //        // if the masks are missing
-  //        if (columnMasks.isEmpty()) {
-  //            return plan;
-  //        }
-  //
-  //        // The fields in the access control scope has the same layout as those for the table
-  // scope
-  //        PlanBuilder planBuilder = newPlanBuilder(plan, analysis, session)
-  //                .withScope(analysis.getAccessControlScope(table), plan.getFieldMappings());
-  //
-  //        Assignments.Builder assignments = Assignments.builder();
-  //        assignments.putIdentities(planBuilder.getRoot().getOutputSymbols());
-  //
-  //        List<Symbol> fieldMappings = new ArrayList<>();
-  //        for (int i = 0; i < plan.getDescriptor().getAllFieldCount(); i++) {
-  //            Field field = plan.getDescriptor().getFieldByIndex(i);
-  //
-  //            Expression mask = columnMasks.get(field.getName().orElseThrow());
-  //            Symbol symbol = plan.getFieldMappings().get(i);
-  //            Expression projection = symbol.toSymbolReference();
-  //            if (mask != null) {
-  //                symbol = symbolAllocator.newSymbol(symbol);
-  //                projection = coerceIfNecessary(analysis, mask, planBuilder.rewrite(mask));
-  //            }
-  //
-  //            assignments.put(symbol, projection);
-  //            fieldMappings.add(symbol);
-  //        }
-  //
-  //        planBuilder = planBuilder
-  //                .withNewRoot(new ProjectNode(
-  //                        idAllocator.genPlanNodeId(),
-  //                        planBuilder.getRoot(),
-  //                        assignments.build()));
-  //
-  //        return new RelationPlan(planBuilder.getRoot(), plan.getScope(), fieldMappings);
-  //    }
+  @Override
+  protected RelationPlan visitQuerySpecification(QuerySpecification node, Void context) {
+    return new QueryPlanner(analysis, symbolAllocator, idAllocator, session, recursiveSubqueries)
+        .plan(node);
+  }
 
   @Override
-  protected RelationPlan visitAliasedRelation(AliasedRelation node, Void context) {
-    RelationPlan subPlan = process(node.getRelation(), context);
+  protected RelationPlan visitNode(Node node, Void context) {
+    throw new IllegalStateException("Unsupported node type: " + node.getClass().getName());
+  }
 
-    PlanNode root = subPlan.getRoot();
-    List<Symbol> mappings = subPlan.getFieldMappings();
+  // ================================ Implemented later =====================================
+  @Override
+  protected RelationPlan visitTableSubquery(TableSubquery node, Void context) {
+    throw new IllegalStateException("TableSubquery is not supported in current version.");
+  }
 
-    if (node.getColumnNames() != null) {
-      ImmutableList.Builder<Symbol> newMappings = ImmutableList.builder();
+  @Override
+  protected RelationPlan visitValues(Values node, Void context) {
+    throw new IllegalStateException("Values is not supported in current version.");
+  }
 
-      // Adjust the mappings to expose only the columns visible in the scope of the aliased relation
-      for (int i = 0; i < subPlan.getDescriptor().getAllFieldCount(); i++) {
-        if (!subPlan.getDescriptor().getFieldByIndex(i).isHidden()) {
-          newMappings.add(subPlan.getFieldMappings().get(i));
-        }
-      }
+  @Override
+  protected RelationPlan visitSubqueryExpression(SubqueryExpression node, Void context) {
+    throw new IllegalStateException("SubqueryExpression is not supported in current version.");
+  }
 
-      mappings = newMappings.build();
-    }
+  @Override
+  protected RelationPlan visitJoin(Join node, Void context) {
+    throw new IllegalStateException("Join is not supported in current version.");
+  }
 
-    return new RelationPlan(root, analysis.getScope(node), mappings);
+  @Override
+  protected RelationPlan visitAliasedRelation(AliasedRelation node, Void context) {
+    throw new IllegalStateException("AliasedRelation is not supported in current version.");
   }
 
   @Override
-  protected RelationPlan visitQuery(Query node, Void context) {
-    return new QueryPlanner(analysis, symbolAllocator, idAllocator, session, recursiveSubqueries)
-        .plan(node);
+  protected RelationPlan visitIntersect(Intersect node, Void context) {
+    throw new IllegalStateException("Intersect is not supported in current version.");
   }
 
   @Override
-  protected RelationPlan visitQuerySpecification(QuerySpecification node, Void context) {
-    return new QueryPlanner(analysis, symbolAllocator, idAllocator, session, recursiveSubqueries)
-        .plan(node);
+  protected RelationPlan visitUnion(Union node, Void context) {
+    throw new IllegalStateException("Union is not supported in current version.");
   }
 
   @Override
-  protected RelationPlan visitSubqueryExpression(SubqueryExpression node, Void context) {
-    return process(node.getQuery(), context);
+  protected RelationPlan visitExcept(Except node, Void context) {
+    throw new IllegalStateException("Except is not supported in current version.");
   }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/FilterNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/FilterNode.java
index 3c49baa4880..68289d5a83d 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/FilterNode.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/FilterNode.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SingleChildProcessNode;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 import org.apache.iotdb.db.relational.sql.tree.Expression;
 
 import java.io.DataOutputStream;
@@ -45,7 +46,7 @@ public class FilterNode extends SingleChildProcessNode {
 
   @Override
   public PlanNode clone() {
-    return null;
+    return new FilterNode(id, child, predicate);
   }
 
   @Override
@@ -66,4 +67,9 @@ public class FilterNode extends SingleChildProcessNode {
   public void setPredicate(Expression predicate) {
     this.predicate = predicate;
   }
+
+  @Override
+  public List<Symbol> getOutputSymbols() {
+    return child.getOutputSymbols();
+  }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/LimitNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/LimitNode.java
index 41b376e04be..17481074932 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/LimitNode.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/LimitNode.java
@@ -4,6 +4,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SingleChildProcessNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.OrderingScheme;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -13,7 +14,7 @@ import java.util.Optional;
 
 public class LimitNode extends SingleChildProcessNode {
   private final long count;
-  // what's the meaning?
+  // TODO what's the meaning?
   private final Optional<OrderingScheme> tiesResolvingScheme;
   // private final boolean partial;
   // private final List<Symbol> preSortedInputs;
@@ -27,7 +28,7 @@ public class LimitNode extends SingleChildProcessNode {
 
   @Override
   public PlanNode clone() {
-    return null;
+    return new LimitNode(id, child, count, tiesResolvingScheme);
   }
 
   @Override
@@ -40,4 +41,9 @@ public class LimitNode extends SingleChildProcessNode {
 
   @Override
   protected void serializeAttributes(DataOutputStream stream) throws IOException {}
+
+  @Override
+  public List<Symbol> getOutputSymbols() {
+    return child.getOutputSymbols();
+  }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/OffsetNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/OffsetNode.java
index c4ea93a27cb..69ac2517e83 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/OffsetNode.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/OffsetNode.java
@@ -3,6 +3,7 @@ package org.apache.iotdb.db.queryengine.plan.relational.planner.node;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SingleChildProcessNode;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -19,7 +20,7 @@ public class OffsetNode extends SingleChildProcessNode {
 
   @Override
   public PlanNode clone() {
-    return null;
+    return new OffsetNode(id, child, count);
   }
 
   @Override
@@ -32,4 +33,9 @@ public class OffsetNode extends SingleChildProcessNode {
 
   @Override
   protected void serializeAttributes(DataOutputStream stream) throws IOException {}
+
+  @Override
+  public List<Symbol> getOutputSymbols() {
+    return child.getOutputSymbols();
+  }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/OutputNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/OutputNode.java
index cb884b09a56..514a7bce382 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/OutputNode.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/OutputNode.java
@@ -5,6 +5,8 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SingleChildProcessNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 
+import com.google.common.collect.ImmutableList;
+
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -12,22 +14,22 @@ import java.util.List;
 
 public class OutputNode extends SingleChildProcessNode {
 
-  private final List<String> outputColumnNames;
+  private final List<String> columnNames;
 
-  private final List<Symbol> symbols;
+  // column name = symbol
+  private final List<Symbol> outputs;
 
-  public OutputNode(
-      PlanNodeId id, PlanNode child, List<String> outputColumnNames, List<Symbol> symbols) {
+  public OutputNode(PlanNodeId id, PlanNode child, List<String> columnNames, List<Symbol> outputs) {
     super(id, child);
     this.id = id;
     this.child = child;
-    this.outputColumnNames = outputColumnNames;
-    this.symbols = symbols;
+    this.columnNames = ImmutableList.copyOf(columnNames);
+    this.outputs = ImmutableList.copyOf(outputs);
   }
 
   @Override
   public PlanNode clone() {
-    return null;
+    return new OutputNode(id, child, columnNames, outputs);
   }
 
   @Override
@@ -40,4 +42,8 @@ public class OutputNode extends SingleChildProcessNode {
 
   @Override
   protected void serializeAttributes(DataOutputStream stream) throws IOException {}
+
+  public List<Symbol> getOutputSymbols() {
+    return outputs;
+  }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/ProjectNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/ProjectNode.java
index ff8de50de27..ed65602cf9e 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/ProjectNode.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/ProjectNode.java
@@ -2,8 +2,10 @@ package org.apache.iotdb.db.queryengine.plan.relational.planner.node;
 
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SingleChildProcessNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.Assignments;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -18,9 +20,14 @@ public class ProjectNode extends SingleChildProcessNode {
     this.assignments = assignments;
   }
 
+  @Override
+  public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+    return visitor.visitProject(this, context);
+  }
+
   @Override
   public PlanNode clone() {
-    return null;
+    return new ProjectNode(id, child, assignments);
   }
 
   @Override
@@ -33,4 +40,9 @@ public class ProjectNode extends SingleChildProcessNode {
 
   @Override
   protected void serializeAttributes(DataOutputStream stream) throws IOException {}
+
+  @Override
+  public List<Symbol> getOutputSymbols() {
+    return assignments.getOutputs();
+  }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/SortNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/SortNode.java
index 37358d3d696..2ea9f7081c2 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/SortNode.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/SortNode.java
@@ -4,6 +4,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SingleChildProcessNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.OrderingScheme;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -14,15 +15,15 @@ public class SortNode extends SingleChildProcessNode {
   private final OrderingScheme orderingScheme;
   private final boolean partial;
 
-  public SortNode(PlanNodeId id, PlanNode planNode, OrderingScheme scheme, boolean partial) {
-    super(id, planNode);
+  public SortNode(PlanNodeId id, PlanNode child, OrderingScheme scheme, boolean partial) {
+    super(id, child);
     this.orderingScheme = scheme;
     this.partial = partial;
   }
 
   @Override
   public PlanNode clone() {
-    return null;
+    return new SortNode(id, child, orderingScheme, partial);
   }
 
   @Override
@@ -35,4 +36,9 @@ public class SortNode extends SingleChildProcessNode {
 
   @Override
   protected void serializeAttributes(DataOutputStream stream) throws IOException {}
+
+  @Override
+  public List<Symbol> getOutputSymbols() {
+    return child.getOutputSymbols();
+  }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java
index 1b7c2476ba3..68eb557a38b 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/TableScanNode.java
@@ -62,4 +62,9 @@ public class TableScanNode extends PlanNode {
 
   @Override
   protected void serializeAttributes(DataOutputStream stream) throws IOException {}
+
+  @Override
+  public List<Symbol> getOutputSymbols() {
+    return outputSymbols;
+  }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/SimplifyExpressions.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/RemoveRedundantIdentityProjections.java
similarity index 52%
copy from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/SimplifyExpressions.java
copy to iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/RemoveRedundantIdentityProjections.java
index aef419fa123..d7366dfe9df 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/SimplifyExpressions.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/RemoveRedundantIdentityProjections.java
@@ -17,42 +17,52 @@ package org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SingleChildProcessNode;
 import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis;
-import org.apache.iotdb.db.queryengine.plan.relational.planner.node.FilterNode;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ProjectNode;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableScanNode;
-import org.apache.iotdb.db.relational.sql.tree.Expression;
 
-import static org.apache.iotdb.db.queryengine.plan.relational.planner.ir.ExtractCommonPredicatesExpressionRewriter.extractCommonPredicates;
-import static org.apache.iotdb.db.queryengine.plan.relational.planner.ir.NormalizeOrExpressionRewriter.normalizeOrExpression;
+import java.util.Collections;
+import java.util.List;
 
-public class SimplifyExpressions implements RelationalPlanOptimizer {
+public class RemoveRedundantIdentityProjections implements RelationalPlanOptimizer {
 
   @Override
   public PlanNode optimize(PlanNode planNode, Analysis analysis, MPPQueryContext context) {
-    // TODO add query statement pruning
     return planNode.accept(new Rewriter(), new RewriterContext());
   }
 
   private static class Rewriter extends PlanVisitor<PlanNode, RewriterContext> {
-
     @Override
     public PlanNode visitPlan(PlanNode node, RewriterContext context) {
-      // PlanNode newNode = node.clone();
-      if (node.getChildren() == null) {
-        System.out.println("aa");
-      }
+      PlanNode newNode = node.clone();
       for (PlanNode child : node.getChildren()) {
-        child.accept(this, context);
+        context.setParent(node);
+        newNode.addChild(child.accept(this, context));
       }
-      return node;
+      return newNode;
     }
 
     @Override
-    public PlanNode visitFilter(FilterNode node, RewriterContext context) {
-      Expression predicate = normalizeOrExpression(node.getPredicate());
-      predicate = extractCommonPredicates(predicate);
-      node.setPredicate(predicate);
-      return node;
+    public PlanNode visitProject(ProjectNode projectNode, RewriterContext context) {
+      if (projectNode.getOutputSymbols().equals(projectNode.getChild().getOutputSymbols())) {
+        if (context.getParent() instanceof SingleChildProcessNode) {
+          ((SingleChildProcessNode) context.getParent()).setChild(projectNode.getChild());
+        } else {
+          List<PlanNode> children = context.getParent().getChildren();
+          for (int i = 0; i < children.size(); i++) {
+            PlanNode child = children.get(i);
+            if (child.getPlanNodeId().equals(projectNode.getPlanNodeId())) {
+              Collections.swap(children, i, children.size() - 1);
+              children.remove(children.size() - 1);
+              break;
+            }
+          }
+        }
+        return projectNode.getChild();
+      } else {
+        return projectNode;
+      }
     }
 
     @Override
@@ -61,5 +71,17 @@ public class SimplifyExpressions implements RelationalPlanOptimizer {
     }
   }
 
-  private static class RewriterContext {}
+  private static class RewriterContext {
+    private PlanNode parent;
+
+    public RewriterContext() {}
+
+    public PlanNode getParent() {
+      return this.parent;
+    }
+
+    public void setParent(PlanNode parent) {
+      this.parent = parent;
+    }
+  }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/SimplifyExpressions.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/SimplifyExpressions.java
index aef419fa123..1e5839fe32a 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/SimplifyExpressions.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/SimplifyExpressions.java
@@ -37,10 +37,6 @@ public class SimplifyExpressions implements RelationalPlanOptimizer {
 
     @Override
     public PlanNode visitPlan(PlanNode node, RewriterContext context) {
-      // PlanNode newNode = node.clone();
-      if (node.getChildren() == null) {
-        System.out.println("aa");
-      }
       for (PlanNode child : node.getChildren()) {
         child.accept(this, context);
       }
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 c42342c16cd..143bd906fbe 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
@@ -134,9 +134,10 @@ public class AnalyzerTest {
 
   @Test
   public void testSingleTableQuery() throws IoTDBException {
+    // no sort
     String sql =
         "SELECT tag1 as tt, tag2, attr1, s1+1 FROM table1 "
-            + "WHERE time>1 AND tag1='A' OR s2>3 ORDER BY time DESC OFFSET 10 LIMIT 5";
+            + "WHERE time>1 AND tag1='A' OR s2>3 OFFSET 10 LIMIT 5";
     Metadata metadata = new TestMatadata();
 
     Analysis actualAnalysis = analyzeSQL(sql, metadata);


(iotdb) 04/05: merge master

Posted by ca...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

caogaofei pushed a commit to branch ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 09e1be46ebf62c20d0c992278ba9bfc554afcd28
Merge: c818ecda1af 095f86adc68
Author: Beyyes <cg...@foxmail.com>
AuthorDate: Tue Apr 16 09:31:46 2024 +0800

    merge master

 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |  6 +-
 .../execution/operator/AggregationUtil.java        |  3 +
 .../AbstractSeriesAggregationScanOperator.java     |  3 +
 .../db/queryengine/plan/analyze/Analysis.java      |  2 +-
 .../plan/relational/analyzer/Analysis.java         | 25 +++-----
 .../plan/relational/analyzer/Field.java            | 39 ++++++++++--
 .../plan/relational/analyzer/RelationType.java     |  2 +
 .../plan/relational/analyzer/ResolvedField.java    |  5 ++
 .../relational/analyzer/StatementAnalyzer.java     | 40 ++++++------
 .../plan/relational/metadata/ColumnSchema.java     | 18 +++++-
 .../plan/relational/metadata/DeviceEntry.java      | 43 +++++++++++++
 .../plan/relational/metadata/Metadata.java         | 40 +++++-------
 .../relational/metadata/TableMetadataImpl.java     | 25 +-------
 .../plan/relational/planner/RelationPlanner.java   | 13 ++--
 .../relational/planner/node/TableScanNode.java     | 13 ++++
 .../plan/relational/analyzer/AnalyzerTest.java     |  8 +--
 .../plan/relational/analyzer/TestMatadata.java     | 71 +---------------------
 .../apache/iotdb/commons/conf/CommonConfig.java    |  4 +-
 18 files changed, 177 insertions(+), 183 deletions(-)

diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
index b42cc50c693,d084324151f..0694f27b9c2
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
@@@ -20,8 -20,7 +20,6 @@@ import org.apache.iotdb.db.queryengine.
  import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Field;
  import org.apache.iotdb.db.queryengine.plan.relational.analyzer.NodeRef;
  import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Scope;
- import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnHandle;
- import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableHandle;
 -import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableSchema;
  import org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableScanNode;
  import org.apache.iotdb.db.relational.sql.tree.AliasedRelation;
  import org.apache.iotdb.db.relational.sql.tree.AstVisitor;
@@@ -33,12 -29,8 +31,11 @@@ import org.apache.iotdb.db.relational.s
  import org.apache.iotdb.db.relational.sql.tree.QuerySpecification;
  import org.apache.iotdb.db.relational.sql.tree.SubqueryExpression;
  import org.apache.iotdb.db.relational.sql.tree.Table;
 +import org.apache.iotdb.db.relational.sql.tree.TableSubquery;
 +import org.apache.iotdb.db.relational.sql.tree.Union;
 +import org.apache.iotdb.db.relational.sql.tree.Values;
  
  import com.google.common.collect.ImmutableList;
- import com.google.common.collect.ImmutableMap;
  
  import java.util.Collection;
  import java.util.List;
@@@ -90,67 -81,134 +87,65 @@@ public class RelationPlanner extends As
            expansion.getRoot(), expansion.getScope(), expansion.getFieldMappings());
      }
  
 -    Query namedQuery = analysis.getNamedQuery(node);
      Scope scope = analysis.getScope(node);
-     TableHandle tableHandle = analysis.getTableHandle(node);
++    // TableHandle tableHandle = analysis.getTableHandle(node);
  
 -    RelationPlan plan;
 -    if (namedQuery != null) {
 -      throw new RuntimeException("NamedQuery is not supported");
 -    } else {
 -      TableSchema handle = analysis.getTableHandle(node);
 +    ImmutableList.Builder<Symbol> outputSymbolsBuilder = ImmutableList.builder();
-     ImmutableMap.Builder<Symbol, ColumnHandle> columnsBuilder = ImmutableMap.builder();
  
 -      ImmutableList.Builder<Symbol> outputSymbolsBuilder = ImmutableList.builder();
++    // Collection<Field> fields = analysis.getMaterializedViewStorageTableFields(node);
 +    Collection<Field> fields = scope.getRelationType().getAllFields();
 +    for (Field field : fields) {
 +      Symbol symbol = symbolAllocator.newSymbol(field);
+ 
 -      // Collection<Field> fields = analysis.getMaterializedViewStorageTableFields(node);
 -      Collection<Field> fields = scope.getRelationType().getAllFields();
 -      for (Field field : fields) {
 -        Symbol symbol = symbolAllocator.newSymbol(field);
 -
 -        outputSymbolsBuilder.add(symbol);
 -      }
 +      outputSymbolsBuilder.add(symbol);
-       columnsBuilder.put(symbol, analysis.getColumn(field));
 +    }
  
 -      List<Symbol> outputSymbols = outputSymbolsBuilder.build();
 -      PlanNode root = new TableScanNode(idAllocator.genPlanNodeId(), null, outputSymbols, null);
 +    List<Symbol> outputSymbols = outputSymbolsBuilder.build();
-     PlanNode root =
-         new TableScanNode(
-             idAllocator.genPlanNodeId(), tableHandle, outputSymbols, columnsBuilder.buildOrThrow());
++    PlanNode root = new TableScanNode(idAllocator.genPlanNodeId(), null, outputSymbols, null);
  
 -      plan = new RelationPlan(root, scope, outputSymbols);
 -    }
 +    return new RelationPlan(root, scope, outputSymbols);
  
 -    // TODO what's the meaning of RowFilters addColumnMasks?
 +    // Query namedQuery = analysis.getNamedQuery(node);
 +    // Collection<Field> fields = analysis.getMaterializedViewStorageTableFields(node);
      // plan = addRowFilters(node, plan);
      // plan = addColumnMasks(node, plan);
 -
 -    return plan;
    }
  
 -  //  private RelationPlan addRowFilters(Table node, RelationPlan plan) {
 -  //    return addRowFilters(node, plan, Function.identity());
 -  //  }
 -
 -  //  public RelationPlan addRowFilters(
 -  //      Table node, RelationPlan plan, Function<Expression, Expression> predicateTransformation) {
 -  //    List<Expression> filters = null;
 -  //    // analysis.getRowFilters(node);
 -  //
 -  //    if (filters.isEmpty()) {
 -  //      return plan;
 -  //    }
 -  //
 -  //    // The fields in the access control scope has the same layout as those for the table scope
 -  //    PlanBuilder planBuilder = newPlanBuilder(plan, analysis, session);
 -  //    // .withScope(accessControlScope.apply(node), plan.getFieldMappings());
 -  //
 -  //    for (Expression filter : filters) {
 -  //      // planBuilder = subqueryPlanner.handleSubqueries(planBuilder, filter,
 -  //      // analysis.getSubqueries(filter));
 -  //
 -  //      Expression predicate = coerceIfNecessary(analysis, filter, filter);
 -  //      predicate = predicateTransformation.apply(predicate);
 -  //      planBuilder =
 -  //          planBuilder.withNewRoot(
 -  //              new FilterNode(idAllocator.genPlanNodeId(), planBuilder.getRoot(), predicate));
 -  //    }
 -  //
 -  //    return new RelationPlan(planBuilder.getRoot(), plan.getScope(), plan.getFieldMappings());
 -  //  }
 -
 -  //    private RelationPlan addColumnMasks(Table table, RelationPlan plan) {
 -  //        Map<String, Expression> columnMasks = analysis.getColumnMasks(table);
 -  //
 -  //        // A Table can represent a WITH query, which can have anonymous fields. On the other
 -  // hand,
 -  //        // it can't have masks. The loop below expects fields to have proper names, so bail out
 -  //        // if the masks are missing
 -  //        if (columnMasks.isEmpty()) {
 -  //            return plan;
 -  //        }
 -  //
 -  //        // The fields in the access control scope has the same layout as those for the table
 -  // scope
 -  //        PlanBuilder planBuilder = newPlanBuilder(plan, analysis, session)
 -  //                .withScope(analysis.getAccessControlScope(table), plan.getFieldMappings());
 -  //
 -  //        Assignments.Builder assignments = Assignments.builder();
 -  //        assignments.putIdentities(planBuilder.getRoot().getOutputSymbols());
 -  //
 -  //        List<Symbol> fieldMappings = new ArrayList<>();
 -  //        for (int i = 0; i < plan.getDescriptor().getAllFieldCount(); i++) {
 -  //            Field field = plan.getDescriptor().getFieldByIndex(i);
 -  //
 -  //            Expression mask = columnMasks.get(field.getName().orElseThrow());
 -  //            Symbol symbol = plan.getFieldMappings().get(i);
 -  //            Expression projection = symbol.toSymbolReference();
 -  //            if (mask != null) {
 -  //                symbol = symbolAllocator.newSymbol(symbol);
 -  //                projection = coerceIfNecessary(analysis, mask, planBuilder.rewrite(mask));
 -  //            }
 -  //
 -  //            assignments.put(symbol, projection);
 -  //            fieldMappings.add(symbol);
 -  //        }
 -  //
 -  //        planBuilder = planBuilder
 -  //                .withNewRoot(new ProjectNode(
 -  //                        idAllocator.genPlanNodeId(),
 -  //                        planBuilder.getRoot(),
 -  //                        assignments.build()));
 -  //
 -  //        return new RelationPlan(planBuilder.getRoot(), plan.getScope(), fieldMappings);
 -  //    }
 +  @Override
 +  protected RelationPlan visitQuerySpecification(QuerySpecification node, Void context) {
 +    return new QueryPlanner(analysis, symbolAllocator, idAllocator, session, recursiveSubqueries)
 +        .plan(node);
 +  }
  
    @Override
 -  protected RelationPlan visitAliasedRelation(AliasedRelation node, Void context) {
 -    RelationPlan subPlan = process(node.getRelation(), context);
 +  protected RelationPlan visitNode(Node node, Void context) {
 +    throw new IllegalStateException("Unsupported node type: " + node.getClass().getName());
 +  }
  
 -    PlanNode root = subPlan.getRoot();
 -    List<Symbol> mappings = subPlan.getFieldMappings();
 +  // ================================ Implemented later =====================================
 +  @Override
 +  protected RelationPlan visitTableSubquery(TableSubquery node, Void context) {
 +    throw new IllegalStateException("TableSubquery is not supported in current version.");
 +  }
  
 -    if (node.getColumnNames() != null) {
 -      ImmutableList.Builder<Symbol> newMappings = ImmutableList.builder();
 +  @Override
 +  protected RelationPlan visitValues(Values node, Void context) {
 +    throw new IllegalStateException("Values is not supported in current version.");
 +  }
  
 -      // Adjust the mappings to expose only the columns visible in the scope of the aliased relation
 -      for (int i = 0; i < subPlan.getDescriptor().getAllFieldCount(); i++) {
 -        if (!subPlan.getDescriptor().getFieldByIndex(i).isHidden()) {
 -          newMappings.add(subPlan.getFieldMappings().get(i));
 -        }
 -      }
 +  @Override
 +  protected RelationPlan visitSubqueryExpression(SubqueryExpression node, Void context) {
 +    throw new IllegalStateException("SubqueryExpression is not supported in current version.");
 +  }
  
 -      mappings = newMappings.build();
 -    }
 +  @Override
 +  protected RelationPlan visitJoin(Join node, Void context) {
 +    throw new IllegalStateException("Join is not supported in current version.");
 +  }
  
 -    return new RelationPlan(root, analysis.getScope(node), mappings);
 +  @Override
 +  protected RelationPlan visitAliasedRelation(AliasedRelation node, Void context) {
 +    throw new IllegalStateException("AliasedRelation is not supported in current version.");
    }
  
    @Override


(iotdb) 05/05: perfect process

Posted by ca...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

caogaofei pushed a commit to branch ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 5a90254881e5e1ef709eb265efc5fed0c07c8f5e
Author: Beyyes <cg...@foxmail.com>
AuthorDate: Tue Apr 16 09:43:47 2024 +0800

    perfect process
---
 .../plan/relational/metadata/TableMetadataImpl.java            |  9 +++++++++
 .../db/queryengine/plan/relational/analyzer/TestMatadata.java  | 10 ++++++++++
 2 files changed, 19 insertions(+)

diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
index fea259a2b50..e5cfa4befb2 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
@@ -29,6 +29,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager;
 import org.apache.iotdb.db.queryengine.plan.relational.type.TypeManager;
 import org.apache.iotdb.db.queryengine.plan.relational.type.TypeNotFoundException;
 import org.apache.iotdb.db.queryengine.plan.relational.type.TypeSignature;
+import org.apache.iotdb.db.relational.sql.tree.Expression;
 import org.apache.iotdb.db.utils.constant.SqlConstant;
 import org.apache.iotdb.tsfile.read.common.type.Type;
 
@@ -227,6 +228,14 @@ public class TableMetadataImpl implements Metadata {
     return true;
   }
 
+  @Override
+  public List<DeviceEntry> indexScan(
+      QualifiedObjectName tableName,
+      List<Expression> expressionList,
+      List<String> attributeColumns) {
+    return null;
+  }
+
   public static boolean isTwoNumericType(List<? extends Type> argumentTypes) {
     return argumentTypes.size() == 2
         && isNumericType(argumentTypes.get(0))
diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java
index 79aaa33061f..b40538f7869 100644
--- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java
+++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java
@@ -7,6 +7,7 @@ import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import org.apache.iotdb.db.queryengine.plan.relational.function.OperatorType;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnMetadata;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnSchema;
+import org.apache.iotdb.db.queryengine.plan.relational.metadata.DeviceEntry;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.OperatorNotFoundException;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName;
@@ -16,6 +17,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager;
 import org.apache.iotdb.db.queryengine.plan.relational.type.TypeManager;
 import org.apache.iotdb.db.queryengine.plan.relational.type.TypeNotFoundException;
 import org.apache.iotdb.db.queryengine.plan.relational.type.TypeSignature;
+import org.apache.iotdb.db.relational.sql.tree.Expression;
 import org.apache.iotdb.db.utils.constant.SqlConstant;
 import org.apache.iotdb.tsfile.read.common.type.BinaryType;
 import org.apache.iotdb.tsfile.read.common.type.Type;
@@ -250,6 +252,14 @@ public class TestMatadata implements Metadata {
     return true;
   }
 
+  @Override
+  public List<DeviceEntry> indexScan(
+      QualifiedObjectName tableName,
+      List<Expression> expressionList,
+      List<String> attributeColumns) {
+    return null;
+  }
+
   public static boolean isTwoNumericType(List<? extends Type> argumentTypes) {
     return argumentTypes.size() == 2
         && isNumericType(argumentTypes.get(0))


(iotdb) 02/05: Merge branch 'ty/TableModelGrammar' of github.com:apache/iotdb into ty/TableModelGrammar

Posted by ca...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

caogaofei pushed a commit to branch ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 3a8183fe219541d6fb9882fe6a1731f52d978e1a
Merge: 34bf1aa11bb 6408bd86367
Author: Beyyes <cg...@foxmail.com>
AuthorDate: Mon Apr 15 20:14:10 2024 +0800

    Merge branch 'ty/TableModelGrammar' of github.com:apache/iotdb into ty/TableModelGrammar

 README.md                                          |  62 +-
 example/pipe-opc-ua-sink/pom.xml                   |  34 ++
 .../apache/iotdb/SubscriptionSessionExample.java   |  18 +-
 .../it/env/cluster/config/MppConfigNodeConfig.java |   6 +
 .../iotdb/it/env/cluster/env/AbstractEnv.java      |  29 +-
 .../it/env/cluster/node/AbstractNodeWrapper.java   |   5 +
 .../env/remote/config/RemoteConfigNodeConfig.java  |   6 +
 .../apache/iotdb/itbase/env/BaseNodeWrapper.java   |   2 +
 .../apache/iotdb/itbase/env/ConfigNodeConfig.java  |   2 +
 ...oTDBRegionMigrateDataNodeCrashITFramework.java} |  14 +-
 .../IoTDBRegionMigrateReliabilityITFramework.java  | 412 +++++++++----
 .../it/regionmigration/KillPointContext.java       |  25 +-
 .../pass/IoTDBRegionMigrateClusterCrashIT.java     |  68 +++
 .../pass/IoTDBRegionMigrateConfigNodeCrashIT.java  |  92 ++-
 .../pass/IoTDBRegionMigrateNormalIT.java           |   8 +-
 .../pass/IoTDBRegionMigrateOtherIT.java            |   9 +-
 ...ateCoordinatorCrashWhenRemoveRemotePeerIT.java} |  24 +-
 .../IoTDBRegionMigrateDataNodeCrashIT.java         |  59 +-
 ...MigrateOriginalCrashWhenDeleteLocalPeerIT.java} |  19 +-
 ...igrateOriginalCrashWhenRemoveRemotePeerIT.java} |  19 +-
 .../pipe/it/autocreate/AbstractPipeDualAutoIT.java |   4 +
 .../pipe/it/autocreate/IoTDBPipeClusterIT.java     |  75 ++-
 .../pipe/it/autocreate/IoTDBPipeIdempotentIT.java  |   4 +
 .../pipe/it/autocreate/IoTDBPipeProcessorIT.java   |   4 +
 .../pipe/it/autocreate/IoTDBPipeProtocolIT.java    |  12 +
 .../pipe/it/manual/AbstractPipeDualManualIT.java   |   4 +
 .../pipe/it/manual/IoTDBPipeMetaHistoricalIT.java  |   4 +
 .../it/manual/IoTDBPipeMetaLeaderChangeIT.java     |   4 +
 .../iotdb/pipe/it/single/AbstractPipeSingleIT.java |   2 +
 .../iotdb/session/it/IoTDBSessionSimpleIT.java     |   1 +
 .../it/dual/AbstractSubscriptionDualIT.java        |   4 +
 .../it/dual/IoTDBSubscriptionTopicIT.java          | 157 ++++-
 .../it/local/IoTDBSubscriptionBasicIT.java         |  12 +-
 .../it/local/IoTDBSubscriptionIdempotentIT.java    |  22 +-
 .../it/local/IoTDBSubscriptionRestartIT.java       | 298 +++++++++-
 .../org/apache/iotdb/isession/SessionDataSet.java  |   6 +-
 .../apache/iotdb/rpc/TElasticFramedTransport.java  |   3 +-
 .../java/org/apache/iotdb/rpc/TSStatusCode.java    |   3 +
 .../rpc/subscription/config/ConsumerConstant.java  |  17 +-
 .../exception}/SubscriptionException.java          |   2 +-
 .../SubscriptionParameterNotValidException.java    |  17 +-
 .../SubscriptionPollTimeOutException.java          |  16 +-
 .../subscription/ConsumerHeartbeatWorker.java      |  26 +-
 .../subscription/PullConsumerAutoCommitWorker.java |  10 +-
 .../session/subscription/SubscriptionConsumer.java | 383 ++++++++++--
 .../subscription/SubscriptionEndpointsSyncer.java  | 131 +++++
 .../session/subscription/SubscriptionProvider.java |  48 +-
 .../subscription/SubscriptionPullConsumer.java     |  99 +++-
 .../subscription/SubscriptionPushConsumer.java     |   2 +-
 .../session/subscription/SubscriptionSession.java  |  20 +-
 .../SubscriptionSessionConnection.java             |  16 -
 .../session/subscription/model/Subscription.java   |   6 +-
 .../iotdb/session/subscription/model/Topic.java    |   4 +-
 iotdb-connector/grafana-plugin/yarn.lock           |  16 +-
 .../confignode/client/DataNodeRequestType.java     |   3 +
 .../client/async/AsyncDataNodeClientPool.java      |  14 +
 .../client/async/handlers/AsyncClientHandler.java  |   2 +
 .../client/sync/SyncDataNodeClientPool.java        |   3 +
 .../consensus/request/ConfigPhysicalPlan.java      |  12 +
 .../consensus/request/ConfigPhysicalPlanType.java  |   5 +
 .../request/write/table/CommitCreateTablePlan.java |  66 +++
 .../request/write/table/PreCreateTablePlan.java    |  67 +++
 .../write/table/RollbackCreateTablePlan.java       |  66 +++
 .../statemachine/ConfigRegionStateMachine.java     |   3 +
 .../iotdb/confignode/manager/ConfigManager.java    |  24 +
 .../apache/iotdb/confignode/manager/IManager.java  |   7 +
 .../iotdb/confignode/manager/ProcedureManager.java |  54 +-
 .../iotdb/confignode/manager/node/NodeManager.java |   2 +
 .../receiver/IoTDBConfigNodeReceiverAgent.java     |  21 +
 .../pipe/execution/PipeConfigNodeSubtask.java      |   9 +-
 .../receiver/protocol/IoTDBConfigNodeReceiver.java |  36 +-
 .../manager/schema/ClusterSchemaManager.java       |  10 +
 .../persistence/executor/ConfigPlanExecutor.java   |   9 +
 .../persistence/schema/ClusterSchemaInfo.java      |  75 +++
 .../confignode/persistence/schema/ConfigMTree.java | 109 ++++
 .../schema/mnode/impl/ConfigTableNode.java         | 221 +++++++
 .../schema/mnode/impl/TableNodeStatus.java         |  58 ++
 .../schema/mnode/info/ConfigTableInfo.java         |  46 +-
 .../persistence/subscription/SubscriptionInfo.java |   2 +-
 .../iotdb/confignode/procedure/Procedure.java      |  15 -
 .../procedure/env/RegionMaintainHandler.java       |  85 +--
 .../procedure/impl/StateMachineProcedure.java      |  18 +
 .../impl/region/AddRegionPeerProcedure.java        |  91 ++-
 .../impl/region/RemoveRegionPeerProcedure.java     |  23 +-
 .../impl/schema/DataNodeRegionTaskExecutor.java    |   2 +-
 .../impl/schema/table/CreateTableProcedure.java    | 429 ++++++++++++++
 .../AbstractOperateSubscriptionProcedure.java      |   2 +-
 .../consumer/AlterConsumerGroupProcedure.java      |   2 +-
 .../runtime/ConsumerGroupMetaSyncProcedure.java    |   2 +-
 .../subscription/CreateSubscriptionProcedure.java  |   2 +-
 .../subscription/DropSubscriptionProcedure.java    |   2 +-
 .../subscription/topic/AlterTopicProcedure.java    |   2 +-
 .../subscription/topic/CreateTopicProcedure.java   |   2 +-
 .../subscription/topic/DropTopicProcedure.java     |   2 +-
 .../topic/runtime/TopicMetaSyncProcedure.java      |   2 +-
 .../testonly/CreateManyDatabasesProcedure.java     |  10 +-
 .../procedure/state/schema/CreateTableState.java}  |  13 +-
 .../procedure/store/ProcedureFactory.java          |   6 +
 .../confignode/procedure/store/ProcedureType.java  |   2 +
 .../thrift/ConfigNodeRPCServiceProcessor.java      |  13 +-
 iotdb-core/consensus/pom.xml                       |   4 +
 .../org/apache/iotdb/consensus/IConsensus.java     |  19 +
 .../consensus/exception/ConsensusException.java    |   4 +
 .../apache/iotdb/consensus/iot/IoTConsensus.java   |  91 ++-
 .../consensus/iot/IoTConsensusServerImpl.java      | 130 +++--
 .../service/IoTConsensusRPCServiceProcessor.java   |   8 +-
 .../iotdb/consensus/ratis/RatisConsensus.java      |  42 +-
 .../iotdb/consensus/simple/SimpleConsensus.java    |  11 +
 .../apache/iotdb/consensus/iot/ReplicateTest.java  |  21 +
 .../apache/iotdb/consensus/iot/StabilityTest.java  |  12 +-
 .../iotdb/consensus/ratis/RatisConsensusTest.java  |  26 +-
 .../dataregion/DataRegionStateMachine.java         |  15 +-
 .../db/exception/PartitionViolationException.java  |   6 +-
 .../table/TableAlreadyExistsException.java}        |  13 +-
 .../metadata/table/TableNotExistsException.java}   |  15 +-
 ...IoTDBThriftSyncPipeTransferBatchReqBuilder.java |   2 +-
 .../builder/PipeTransferBatchReqBuilder.java       |  49 +-
 .../async/IoTDBDataRegionAsyncConnector.java       |  26 +
 .../PipeTransferTabletBatchEventHandler.java       |  12 +-
 .../PipeTransferTabletInsertionEventHandler.java   |   5 -
 .../PipeTransferTsFileInsertionEventHandler.java   |   2 -
 .../common/tablet/PipeRawTabletInsertionEvent.java |   4 +-
 .../iotdb/db/pipe/metric/PipeConnectorMetrics.java |  46 +-
 .../iotdb/db/pipe/metric/PipeExtractorMetrics.java |  49 +-
 .../iotdb/db/pipe/metric/PipeProcessorMetrics.java |  46 +-
 .../processor/aggregate/AggregateProcessor.java    |  60 +-
 .../protocol/thrift/IoTDBDataNodeReceiver.java     |  60 +-
 .../thrift/IoTDBDataNodeReceiverAgent.java         |  18 +
 .../db/pipe/resource/memory/PipeMemoryBlock.java   |   7 +-
 .../resource/tsfile/PipeTsFileResourceManager.java |   1 -
 .../pipe/task/connection/PipeEventCollector.java   |   8 +-
 .../db/pipe/task/stage/PipeTaskConnectorStage.java |   3 +-
 .../db/pipe/task/stage/PipeTaskProcessorStage.java |   2 +-
 .../subtask/connector/PipeConnectorSubtask.java    |   6 +-
 .../connector/PipeConnectorSubtaskManager.java     |  10 +-
 .../subtask/processor/PipeProcessorSubtask.java    |   5 +-
 .../iotdb/db/protocol/client/ConfigNodeClient.java |  14 +
 .../impl/DataNodeInternalRPCServiceImpl.java       |  56 +-
 .../db/queryengine/common/MPPQueryContext.java     |  17 +-
 .../common/header/ColumnHeaderConstant.java        |  17 +
 .../common/header/DatasetHeaderFactory.java        |   8 +
 .../execution/exchange/sink/ShuffleSinkHandle.java |   4 +-
 .../exchange/source/LocalSourceHandle.java         |   9 -
 .../queryengine/execution/memory/MemoryPool.java   |  14 +-
 .../iotdb/db/queryengine/plan/Coordinator.java     |  15 +-
 .../queryengine/plan/analyze/AnalyzeVisitor.java   |  53 +-
 .../analyze/cache/schema/DataNodeSchemaCache.java  |  47 +-
 .../analyze/cache/schema/SchemaCacheEntry.java     |   8 +
 .../cache/schema/TimeSeriesSchemaCache.java        |  32 +
 .../cache/schema/dualkeycache/IDualKeyCache.java   |   9 +
 .../schema/dualkeycache/impl/DualKeyCacheImpl.java |  59 ++
 .../schema/lastcache/DataNodeLastCacheManager.java |   7 +
 .../schema/lastcache/ILastCacheContainer.java      |   5 +-
 .../cache/schema/lastcache/LastCacheContainer.java |   7 +
 .../analyze/lock/DataNodeSchemaLockManager.java    |  59 ++
 .../plan/analyze/lock/SchemaLockType.java          |  64 ++
 .../plan/analyze/schema/ClusterSchemaFetcher.java  |  14 +-
 .../execution/config/TableConfigTaskVisitor.java   | 109 +++-
 .../config/executor/ClusterConfigTaskExecutor.java |  89 ++-
 .../config/executor/IConfigTaskExecutor.java       |  12 +-
 .../metadata/relational/CreateTableTask.java       |  16 +-
 .../metadata/relational/DescribeTableTask.java     |  85 +++
 .../config/metadata/relational/ShowTablesTask.java |  77 +++
 .../db/queryengine/plan/parser/ASTVisitor.java     |   2 +-
 .../db/schemaengine/table/DataNodeTableCache.java  | 207 +++++++
 .../iotdb/db/schemaengine/table/ITableCache.java}  |  18 +-
 .../java/org/apache/iotdb/db/service/DataNode.java |  73 +--
 .../iotdb/db/service/RegionMigrateService.java     |   7 +-
 .../db/storageengine/dataregion/DataRegion.java    |  44 +-
 .../exception/CompactionExceptionHandler.java      |  15 +-
 .../execute/recover/CompactionRecoverTask.java     |  18 +-
 .../execute/task/AbstractCompactionTask.java       |  10 +-
 .../execute/task/InnerSpaceCompactionTask.java     |   2 +-
 .../compaction/schedule/CompactionScheduler.java   |   6 -
 .../compaction/schedule/CompactionTaskQueue.java   |  52 +-
 .../impl/RewriteCrossSpaceCompactionSelector.java  |   2 +-
 .../memtable/AlignedWritableMemChunk.java          |   5 +-
 .../dataregion/snapshot/SnapshotLoader.java        |   6 -
 .../storageengine/dataregion/tsfile/TsFileID.java  |  18 +-
 .../tsfile/timeindex/DeviceTimeIndex.java          |  64 +-
 .../dataregion/tsfile/timeindex/FileTimeIndex.java |  22 +-
 .../dataregion/tsfile/timeindex/ITimeIndex.java    |   2 -
 .../agent/SubscriptionAgentLauncher.java           |   2 +-
 .../agent/SubscriptionConsumerAgent.java           |   2 +-
 .../receiver/SubscriptionReceiverV1.java           |   7 +-
 .../task/stage/SubscriptionTaskConnectorStage.java |   2 +-
 .../SubscriptionConnectorSubtaskManager.java       |  12 +-
 .../cache/dualkeycache/DualKeyCacheTest.java       | 114 ++++
 .../inner/InnerSpaceCompactionExceptionTest.java   |   5 +-
 .../src/assembly/resources/sbin/health_check.bat   | 641 +++++++++++++++++++++
 .../src/assembly/resources/sbin/health_check.sh    | 388 +++++++++++++
 .../iotdb/commons/pipe/event/EnrichedEvent.java    |  24 +-
 .../pipe/progress/PipeEventCommitManager.java      |  26 +-
 .../commons/pipe/progress/PipeEventCommitter.java  |  15 +-
 .../commons/pipe/receiver/IoTDBFileReceiver.java   | 263 ++++++---
 .../commons/pipe/receiver/IoTDBReceiverAgent.java  |  46 +-
 .../task/subtask/PipeAbstractConnectorSubtask.java |   2 +-
 .../pipe/task/subtask/PipeReportableSubtask.java   |   2 +-
 .../commons/pipe/task/subtask/PipeSubtask.java     |  18 +-
 .../iotdb/commons/schema/SchemaConstant.java       |   6 +
 .../apache/iotdb/commons/schema/table/TsTable.java | 144 +++++
 .../schema/table/TsTableInternalRPCType.java       |  64 ++
 .../schema/table/TsTableInternalRPCUtil.java       |  98 ++++
 .../schema/table/column/AttributeColumnSchema.java |  57 ++
 .../schema/table/column/IdColumnSchema.java        |  57 ++
 .../table/column/MeasurementColumnSchema.java      | 101 ++++
 .../schema/table/column/TimeColumnSchema.java      |  57 ++
 .../schema/table/column/TsTableColumnCategory.java |  73 +++
 .../schema/table/column/TsTableColumnSchema.java   |  74 +++
 .../table/column/TsTableColumnSchemaUtil.java      |  80 +++
 .../meta/consumer/ConsumerGroupMeta.java           |   2 +-
 ... => IoTConsensusDeleteLocalPeerKillPoints.java} |   8 +-
 ...a => IoTConsensusInactivatePeerKillPoints.java} |   8 +-
 ...TConsensusRemovePeerCoordinatorKillPoints.java} |   2 +-
 ...nsusRemovePeerKillPoints.java => KillNode.java} |  11 +-
 .../consumer/ConsumerGroupDeSerTest.java           |   2 +-
 .../src/main/thrift/confignode.thrift              |  16 +-
 .../src/main/thrift/iotconsensus.thrift            |   1 +
 .../src/main/thrift/datanode.thrift                |  10 +
 pom.xml                                            |   2 +-
 220 files changed, 7510 insertions(+), 1243 deletions(-)