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

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


The following commit(s) were added to refs/heads/ty/TableModelGrammar by this 
push:
     new 0bef1d93f86 Support new data type in table branch
0bef1d93f86 is described below

commit 0bef1d93f865d1c7b0dc65b3ccc0bb3b2fb42077
Author: Jackie Tien <[email protected]>
AuthorDate: Fri Jun 28 10:35:17 2024 +0800

    Support new data type in table branch
---
 .../load/subscriber/NodeStatisticsChangeEvent.java | 31 ------------
 .../relational/ColumnTransformerBuilder.java       | 55 +++++++++++++---------
 .../relational/analyzer/ExpressionAnalyzer.java    | 43 +++++++----------
 .../predicate/ConvertPredicateToFilterVisitor.java |  8 ++++
 .../plan/relational/metadata/ColumnSchema.java     | 12 +++++
 .../relational/metadata/TableMetadataImpl.java     | 35 ++++++++------
 .../plan/relational/planner/LogicalPlanner.java    | 27 +----------
 .../plan/relational/type/InternalTypeManager.java  | 16 +++++++
 .../dag/column/CaseWhenThenColumnTransformer.java  | 13 ++---
 .../dag/column/ColumnTransformer.java              |  8 ++--
 .../binary/CompareBinaryColumnTransformer.java     |  4 +-
 .../binary/CompareEqualToColumnTransformer.java    | 12 ++---
 .../binary/CompareNonEqualColumnTransformer.java   | 12 ++---
 .../column/ternary/BetweenColumnTransformer.java   |  5 +-
 .../ternary/CompareTernaryColumnTransformer.java   |  9 ++--
 .../dag/column/unary/InColumnTransformer.java      |  8 ++++
 .../dag/column/unary/RegularColumnTransformer.java |  5 +-
 .../scalar/CastFunctionColumnTransformer.java      | 38 +++++++++++++++
 .../execution/operator/OperatorMemoryTest.java     | 19 +++-----
 .../plan/relational/analyzer/TestMatadata.java     | 42 ++---------------
 20 files changed, 201 insertions(+), 201 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/load/subscriber/NodeStatisticsChangeEvent.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/load/subscriber/NodeStatisticsChangeEvent.java
index fc20b510bed..11da0dc2998 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/load/subscriber/NodeStatisticsChangeEvent.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/load/subscriber/NodeStatisticsChangeEvent.java
@@ -21,15 +21,6 @@ package org.apache.iotdb.confignode.manager.load.subscriber;
 
 import org.apache.iotdb.confignode.manager.load.cache.node.NodeStatistics;
 
-import org.apache.tsfile.read.common.type.BinaryType;
-import org.apache.tsfile.read.common.type.BooleanType;
-import org.apache.tsfile.read.common.type.DoubleType;
-import org.apache.tsfile.read.common.type.FloatType;
-import org.apache.tsfile.read.common.type.IntType;
-import org.apache.tsfile.read.common.type.LongType;
-import org.apache.tsfile.read.common.type.Type;
-import org.apache.tsfile.read.common.type.TypeEnum;
-import org.apache.tsfile.read.common.type.UnknownType;
 import org.apache.tsfile.utils.Pair;
 
 import java.util.Map;
@@ -48,26 +39,4 @@ public class NodeStatisticsChangeEvent {
   public Map<Integer, Pair<NodeStatistics, NodeStatistics>> 
getDifferentNodeStatisticsMap() {
     return differentNodeStatisticsMap;
   }
-
-  public static Type getType(TypeEnum typeEnum) {
-    switch (typeEnum) {
-      case INT32:
-        return IntType.getInstance();
-      case INT64:
-        return LongType.getInstance();
-      case FLOAT:
-        return FloatType.getInstance();
-      case DOUBLE:
-        return DoubleType.getInstance();
-      case BOOLEAN:
-        return BooleanType.getInstance();
-      case TEXT:
-        return BinaryType.getInstance();
-      case UNKNOWN:
-        return UnknownType.getInstance();
-      default:
-        throw new UnsupportedOperationException(
-            String.format("Invalid TypeEnum for TypeFactory: %s", typeEnum));
-    }
-  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
index c5c656c07ab..d95391632e7 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
@@ -116,10 +116,11 @@ import static 
com.google.common.base.Preconditions.checkArgument;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.PredicatePushIntoMetadataChecker.isStringLiteral;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager.getTSDataType;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.type.TypeSignatureTranslator.toTypeSignature;
-import static org.apache.tsfile.read.common.type.BinaryType.TEXT;
+import static org.apache.tsfile.read.common.type.BlobType.BLOB;
 import static org.apache.tsfile.read.common.type.BooleanType.BOOLEAN;
 import static org.apache.tsfile.read.common.type.DoubleType.DOUBLE;
 import static org.apache.tsfile.read.common.type.LongType.INT64;
+import static org.apache.tsfile.read.common.type.StringType.STRING;
 import static org.apache.tsfile.utils.RegexUtils.compileRegex;
 import static org.apache.tsfile.utils.RegexUtils.parseLikePatternToRegex;
 
@@ -287,7 +288,20 @@ public class ColumnTransformerBuilder
 
   @Override
   protected ColumnTransformer visitBinaryLiteral(BinaryLiteral node, Context 
context) {
-    throw new UnsupportedOperationException();
+    ColumnTransformer res =
+        context.cache.computeIfAbsent(
+            node,
+            e -> {
+              ConstantColumnTransformer columnTransformer =
+                  new ConstantColumnTransformer(
+                      BLOB,
+                      new BinaryColumn(
+                          1, Optional.empty(), new Binary[] {new 
Binary(node.getValue())}));
+              context.leafList.add(columnTransformer);
+              return columnTransformer;
+            });
+    res.addReferenceCount();
+    return res;
   }
 
   @Override
@@ -298,7 +312,7 @@ public class ColumnTransformerBuilder
             e -> {
               ConstantColumnTransformer columnTransformer =
                   new ConstantColumnTransformer(
-                      TEXT,
+                      STRING,
                       new BinaryColumn(
                           1,
                           Optional.empty(),
@@ -424,7 +438,7 @@ public class ColumnTransformerBuilder
                         e -> {
                           ConstantColumnTransformer columnTransformer =
                               new ConstantColumnTransformer(
-                                  TEXT,
+                                  STRING,
                                   new BinaryColumn(
                                       1,
                                       Optional.empty(),
@@ -459,7 +473,7 @@ public class ColumnTransformerBuilder
             e -> {
               ConstantColumnTransformer columnTransformer =
                   new ConstantColumnTransformer(
-                      TEXT,
+                      STRING,
                       new BinaryColumn(
                           1,
                           Optional.empty(),
@@ -528,57 +542,56 @@ public class ColumnTransformerBuilder
       return new RoundFunctionColumnTransformer(
           DOUBLE, this.process(children.get(0), context), places);
     } else if 
(BuiltinScalarFunction.REPLACE.getFunctionName().equalsIgnoreCase(functionName))
 {
+      ColumnTransformer first = this.process(children.get(0), context);
       if (children.size() == 2) {
         if (isStringLiteral(children.get(1))) {
           return new ReplaceFunctionColumnTransformer(
-              TEXT,
-              this.process(children.get(0), context),
-              ((StringLiteral) children.get(1)).getValue(),
-              "");
+              first.getType(), first, ((StringLiteral) 
children.get(1)).getValue(), "");
         } else {
           return new Replace2ColumnTransformer(
-              TEXT, this.process(children.get(0), context), 
this.process(children.get(1), context));
+              first.getType(), first, this.process(children.get(1), context));
         }
       } else {
         // size == 3
         if (isStringLiteral(children.get(1)) && 
isStringLiteral(children.get(2))) {
           return new ReplaceFunctionColumnTransformer(
-              TEXT,
-              this.process(children.get(0), context),
+              first.getType(),
+              first,
               ((StringLiteral) children.get(1)).getValue(),
               ((StringLiteral) children.get(2)).getValue());
         } else {
           return new Replace3ColumnTransformer(
-              TEXT,
-              this.process(children.get(0), context),
+              first.getType(),
+              first,
               this.process(children.get(1), context),
               this.process(children.get(2), context));
         }
       }
     } else if 
(BuiltinScalarFunction.SUBSTRING.getFunctionName().equalsIgnoreCase(functionName))
 {
+      ColumnTransformer first = this.process(children.get(0), context);
       if (children.size() == 2) {
         if (isLongLiteral(children.get(1))) {
           return new SubStringFunctionColumnTransformer(
-              TEXT,
-              this.process(children.get(0), context),
+              first.getType(),
+              first,
               (int) ((LongLiteral) children.get(1)).getParsedValue(),
               Integer.MAX_VALUE);
         } else {
           return new SubString2ColumnTransformer(
-              TEXT, this.process(children.get(0), context), 
this.process(children.get(1), context));
+              first.getType(), first, this.process(children.get(1), context));
         }
       } else {
         // size == 3
         if (isLongLiteral(children.get(1)) && isLongLiteral(children.get(2))) {
           return new SubStringFunctionColumnTransformer(
-              TEXT,
-              this.process(children.get(0), context),
+              first.getType(),
+              first,
               (int) ((LongLiteral) children.get(1)).getParsedValue(),
               (int) ((LongLiteral) children.get(2)).getParsedValue());
         } else {
           return new SubString3ColumnTransformer(
-              TEXT,
-              this.process(children.get(0), context),
+              first.getType(),
+              first,
               this.process(children.get(1), context),
               this.process(children.get(2), context));
         }
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 f5969d4e40d..ac712bbf8c1 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
@@ -79,7 +79,6 @@ import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.LinkedHashMultimap;
 import com.google.common.collect.Multimap;
-import org.apache.tsfile.read.common.type.BinaryType;
 import org.apache.tsfile.read.common.type.RowType;
 import org.apache.tsfile.read.common.type.Type;
 import org.apache.tsfile.read.common.type.UnknownType;
@@ -87,6 +86,7 @@ import org.apache.tsfile.read.common.type.UnknownType;
 import javax.annotation.Nullable;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -103,14 +103,17 @@ import static java.lang.String.format;
 import static java.util.Collections.unmodifiableMap;
 import static java.util.Collections.unmodifiableSet;
 import static java.util.Objects.requireNonNull;
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isCharType;
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isNumericType;
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isTwoTypeComparable;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DereferenceExpression.isQualifiedAllFieldsReference;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.type.TypeSignatureTranslator.toTypeSignature;
-import static org.apache.tsfile.read.common.type.BinaryType.TEXT;
+import static org.apache.tsfile.read.common.type.BlobType.BLOB;
 import static org.apache.tsfile.read.common.type.BooleanType.BOOLEAN;
 import static org.apache.tsfile.read.common.type.DoubleType.DOUBLE;
-import static org.apache.tsfile.read.common.type.FloatType.FLOAT;
 import static org.apache.tsfile.read.common.type.IntType.INT32;
 import static org.apache.tsfile.read.common.type.LongType.INT64;
+import static org.apache.tsfile.read.common.type.StringType.STRING;
 import static org.apache.tsfile.read.common.type.UnknownType.UNKNOWN;
 
 public class ExpressionAnalyzer {
@@ -651,27 +654,27 @@ public class ExpressionAnalyzer {
     protected Type visitLikePredicate(
         LikePredicate node, StackableAstVisitorContext<Context> context) {
       Type valueType = process(node.getValue(), context);
-      if (!(valueType instanceof BinaryType)) {
+      if (!isCharType(valueType)) {
         throw new SemanticException(
             String.format(
-                "Left side of LIKE expression must evaluate to a BinaryType 
(actual: %s)",
+                "Left side of LIKE expression must evaluate to TEXT or STRING 
Type (actual: %s)",
                 valueType));
       }
 
       Type patternType = process(node.getPattern(), context);
-      if (!(patternType instanceof BinaryType)) {
+      if (!isCharType(patternType)) {
         throw new SemanticException(
             String.format(
-                "Pattern for LIKE expression must evaluate to a BinaryType 
(actual: %s)",
+                "Pattern for LIKE expression must evaluate to TEXT or STRING 
Type (actual: %s)",
                 patternType));
       }
       if (node.getEscape().isPresent()) {
         Expression escape = node.getEscape().get();
         Type escapeType = process(escape, context);
-        if (!(escapeType instanceof BinaryType)) {
+        if (!isCharType(escapeType)) {
           throw new SemanticException(
               String.format(
-                  "Escape for LIKE expression must evaluate to a BinaryType 
(actual: %s)",
+                  "Escape for LIKE expression must evaluate to TEXT or STRING 
Type (actual: %s)",
                   escapeType));
         }
       }
@@ -682,13 +685,13 @@ public class ExpressionAnalyzer {
     @Override
     protected Type visitStringLiteral(
         StringLiteral node, StackableAstVisitorContext<Context> context) {
-      return setExpressionType(node, TEXT);
+      return setExpressionType(node, STRING);
     }
 
     @Override
     protected Type visitBinaryLiteral(
         BinaryLiteral node, StackableAstVisitorContext<Context> context) {
-      throw new SemanticException("BinaryLiteral is not supported yet.");
+      return setExpressionType(node, BLOB);
     }
 
     @Override
@@ -799,12 +802,12 @@ public class ExpressionAnalyzer {
     @Override
     protected Type visitCurrentDatabase(
         CurrentDatabase node, StackableAstVisitorContext<Context> context) {
-      return setExpressionType(node, TEXT);
+      return setExpressionType(node, STRING);
     }
 
     @Override
     protected Type visitCurrentUser(CurrentUser node, 
StackableAstVisitorContext<Context> context) {
-      return setExpressionType(node, TEXT);
+      return setExpressionType(node, STRING);
     }
 
     @Override
@@ -1171,7 +1174,7 @@ public class ExpressionAnalyzer {
         if (superType == UNKNOWN) {
           superType = type;
         } else {
-          if (!superType.equals(type)) {
+          if (!isTwoTypeComparable(Arrays.asList(superType, type))) {
             throw new SemanticException(
                 String.format(
                     "%s must be the same type or coercible to a common type. 
Cannot find common type between %s and %s, all types (without duplicates): %s",
@@ -1479,22 +1482,10 @@ public class ExpressionAnalyzer {
         });
   }
 
-  public static boolean isNumericType(Type type) {
-    return type.equals(INT32) || type.equals(INT64) || type.equals(FLOAT) || 
type.equals(DOUBLE);
-  }
-
   private static boolean isExactNumericWithScaleZero(Type type) {
     return type.equals(INT32) || type.equals(INT64);
   }
 
-  public static boolean isStringType(Type type) {
-    return isCharacterStringType(type);
-  }
-
-  public static boolean isCharacterStringType(Type type) {
-    return type instanceof BinaryType;
-  }
-
   public static class LabelPrefixedReference {
     private final String label;
     private final Optional<Identifier> column;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertPredicateToFilterVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertPredicateToFilterVisitor.java
index 434785863f0..3c520aae3f7 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertPredicateToFilterVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertPredicateToFilterVisitor.java
@@ -23,6 +23,7 @@ import 
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnSchema;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BetweenPredicate;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BinaryLiteral;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BooleanLiteral;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ComparisonExpression;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DoubleLiteral;
@@ -164,7 +165,10 @@ public class ConvertPredicateToFilterVisitor
         case BOOLEAN:
           return (T) Boolean.valueOf(getBooleanValue(value));
         case TEXT:
+        case STRING:
           return (T) new Binary(getStringValue(value), 
TSFileConfig.STRING_CHARSET);
+        case BLOB:
+          return (T) new Binary(getBlobValue(value));
         default:
           throw new UnsupportedOperationException(
               String.format("Unsupported data type %s", dataType));
@@ -333,6 +337,10 @@ public class ConvertPredicateToFilterVisitor
     return ((StringLiteral) expression).getValue();
   }
 
+  public static byte[] getBlobValue(Expression expression) {
+    return ((BinaryLiteral) expression).getValue();
+  }
+
   public static class Context {
 
     private final Map<String, Integer> measuremrntsMap;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/ColumnSchema.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/ColumnSchema.java
index bb460c61423..36afc7d1461 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/ColumnSchema.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/ColumnSchema.java
@@ -22,9 +22,13 @@ package 
org.apache.iotdb.db.queryengine.plan.relational.metadata;
 import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
 
 import org.apache.tsfile.read.common.type.BinaryType;
+import org.apache.tsfile.read.common.type.BlobType;
 import org.apache.tsfile.read.common.type.BooleanType;
+import org.apache.tsfile.read.common.type.DateType;
 import org.apache.tsfile.read.common.type.DoubleType;
 import org.apache.tsfile.read.common.type.FloatType;
+import org.apache.tsfile.read.common.type.StringType;
+import org.apache.tsfile.read.common.type.TimestampType;
 import org.apache.tsfile.read.common.type.Type;
 import org.apache.tsfile.read.common.type.TypeEnum;
 import org.apache.tsfile.read.common.type.UnknownType;
@@ -138,6 +142,14 @@ public class ColumnSchema {
         return DoubleType.DOUBLE;
       case TEXT:
         return BinaryType.TEXT;
+      case STRING:
+        return StringType.STRING;
+      case BLOB:
+        return BlobType.BLOB;
+      case TIMESTAMP:
+        return TimestampType.TIMESTAMP;
+      case DATE:
+        return DateType.DATE;
       default:
         return UnknownType.UNKNOWN;
     }
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 16a1d2df8ee..dcc5f671687 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
@@ -44,6 +44,7 @@ import 
org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
 import org.apache.iotdb.db.utils.constant.SqlConstant;
 
 import org.apache.tsfile.file.metadata.IDeviceID;
+import org.apache.tsfile.read.common.type.StringType;
 import org.apache.tsfile.read.common.type.Type;
 import org.apache.tsfile.read.common.type.TypeFactory;
 
@@ -164,19 +165,19 @@ public class TableMetadataImpl implements Metadata {
       return DOUBLE;
     } else if 
(BuiltinScalarFunction.REPLACE.getFunctionName().equalsIgnoreCase(functionName))
 {
 
-      if (!isTwoTextType(argumentTypes) && !isThreeTextType(argumentTypes)) {
+      if (!isTwoCharType(argumentTypes) && !isThreeCharType(argumentTypes)) {
         throw new SemanticException(
             "Scalar function: "
                 + functionName.toLowerCase(Locale.ENGLISH)
                 + " only supports text data type.");
       }
-      return TEXT;
+      return argumentTypes.get(0);
     } else if 
(BuiltinScalarFunction.SUBSTRING.getFunctionName().equalsIgnoreCase(functionName))
 {
       if (!(argumentTypes.size() == 2
-              && TEXT.equals(argumentTypes.get(0))
+              && isCharType(argumentTypes.get(0))
               && isNumericType(argumentTypes.get(1)))
           && !(argumentTypes.size() == 3
-              && TEXT.equals(argumentTypes.get(0))
+              && isCharType(argumentTypes.get(0))
               && isNumericType(argumentTypes.get(1))
               && isNumericType(argumentTypes.get(2)))) {
         throw new SemanticException(
@@ -184,7 +185,7 @@ public class TableMetadataImpl implements Metadata {
                 + functionName.toLowerCase(Locale.ENGLISH)
                 + " only supports text data type.");
       }
-      return TEXT;
+      return argumentTypes.get(0);
     }
 
     // builtin aggregation function
@@ -368,21 +369,25 @@ public class TableMetadataImpl implements Metadata {
     return argumentTypes.size() == 1 && BOOLEAN.equals(argumentTypes.get(0));
   }
 
-  public static boolean isOneTextType(List<? extends Type> argumentTypes) {
-    return argumentTypes.size() == 1 && TEXT.equals(argumentTypes.get(0));
+  public static boolean isOneCharType(List<? extends Type> argumentTypes) {
+    return argumentTypes.size() == 1 && isCharType(argumentTypes.get(0));
   }
 
-  public static boolean isTwoTextType(List<? extends Type> argumentTypes) {
+  public static boolean isTwoCharType(List<? extends Type> argumentTypes) {
     return argumentTypes.size() == 2
-        && TEXT.equals(argumentTypes.get(0))
-        && TEXT.equals(argumentTypes.get(1));
+        && isCharType(argumentTypes.get(0))
+        && isCharType(argumentTypes.get(1));
   }
 
-  public static boolean isThreeTextType(List<? extends Type> argumentTypes) {
+  public static boolean isThreeCharType(List<? extends Type> argumentTypes) {
     return argumentTypes.size() == 3
-        && TEXT.equals(argumentTypes.get(0))
-        && TEXT.equals(argumentTypes.get(1))
-        && TEXT.equals(argumentTypes.get(2));
+        && isCharType(argumentTypes.get(0))
+        && isCharType(argumentTypes.get(1))
+        && isCharType(argumentTypes.get(2));
+  }
+
+  public static boolean isCharType(Type type) {
+    return TEXT.equals(type) || StringType.STRING.equals(type);
   }
 
   public static boolean isNumericType(Type type) {
@@ -400,6 +405,6 @@ public class TableMetadataImpl implements Metadata {
     }
 
     // Boolean type and Binary Type can not be compared with other types
-    return isNumericType(left) && isNumericType(right);
+    return (isNumericType(left) && isNumericType(right)) || (isCharType(left) 
&& isCharType(right));
   }
 }
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 987afe90162..76d76fd000a 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
@@ -50,9 +50,6 @@ import 
org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.read.common.type.Type;
-import org.apache.tsfile.write.UnSupportedDataTypeException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -62,6 +59,7 @@ import java.util.List;
 
 import static java.util.Objects.requireNonNull;
 import static 
org.apache.iotdb.db.queryengine.plan.expression.leaf.TimestampOperand.TIMESTAMP_EXPRESSION_STRING;
+import static 
org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager.getTSDataType;
 
 public class LogicalPlanner {
   private static final Logger LOG = 
LoggerFactory.getLogger(LogicalPlanner.class);
@@ -140,8 +138,7 @@ public class LogicalPlanner {
       outputs.add(symbol);
 
       if (!TIMESTAMP_EXPRESSION_STRING.equalsIgnoreCase(name)) {
-        columnHeaders.add(
-            new ColumnHeader(symbol.getName(), 
transferTypeToTsDataType(field.getType())));
+        columnHeaders.add(new ColumnHeader(symbol.getName(), 
getTSDataType(field.getType())));
       }
 
       columnNumber++;
@@ -169,26 +166,6 @@ public class LogicalPlanner {
     return new RelationPlanner(analysis, symbolAllocator, context, 
sessionInfo, ImmutableMap.of());
   }
 
-  public TSDataType transferTypeToTsDataType(Type type) {
-    switch (type.getTypeEnum()) {
-      case INT32:
-        return TSDataType.INT32;
-      case INT64:
-        return TSDataType.INT64;
-      case BOOLEAN:
-        return TSDataType.BOOLEAN;
-      case FLOAT:
-        return TSDataType.FLOAT;
-      case DOUBLE:
-        return TSDataType.DOUBLE;
-      case TEXT:
-        return TSDataType.TEXT;
-      default:
-        throw new UnSupportedDataTypeException(
-            String.format("Cannot transfer type: %s to TSDataType.", 
type.getTypeEnum()));
-    }
-  }
-
   private enum Stage {
     CREATED,
     OPTIMIZED,
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/type/InternalTypeManager.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/type/InternalTypeManager.java
index 26315889460..72defb5155e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/type/InternalTypeManager.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/type/InternalTypeManager.java
@@ -28,11 +28,15 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 import static org.apache.tsfile.read.common.type.BinaryType.TEXT;
+import static org.apache.tsfile.read.common.type.BlobType.BLOB;
 import static org.apache.tsfile.read.common.type.BooleanType.BOOLEAN;
+import static org.apache.tsfile.read.common.type.DateType.DATE;
 import static org.apache.tsfile.read.common.type.DoubleType.DOUBLE;
 import static org.apache.tsfile.read.common.type.FloatType.FLOAT;
 import static org.apache.tsfile.read.common.type.IntType.INT32;
 import static org.apache.tsfile.read.common.type.LongType.INT64;
+import static org.apache.tsfile.read.common.type.StringType.STRING;
+import static org.apache.tsfile.read.common.type.TimestampType.TIMESTAMP;
 
 public class InternalTypeManager implements TypeManager {
 
@@ -45,6 +49,10 @@ public class InternalTypeManager implements TypeManager {
     types.put(new 
TypeSignature(TypeEnum.INT32.name().toLowerCase(Locale.ENGLISH)), INT32);
     types.put(new 
TypeSignature(TypeEnum.BOOLEAN.name().toLowerCase(Locale.ENGLISH)), BOOLEAN);
     types.put(new 
TypeSignature(TypeEnum.TEXT.name().toLowerCase(Locale.ENGLISH)), TEXT);
+    types.put(new 
TypeSignature(TypeEnum.STRING.name().toLowerCase(Locale.ENGLISH)), STRING);
+    types.put(new 
TypeSignature(TypeEnum.BLOB.name().toLowerCase(Locale.ENGLISH)), BLOB);
+    types.put(new 
TypeSignature(TypeEnum.DATE.name().toLowerCase(Locale.ENGLISH)), DATE);
+    types.put(new 
TypeSignature(TypeEnum.TIMESTAMP.name().toLowerCase(Locale.ENGLISH)), 
TIMESTAMP);
   }
 
   @Override
@@ -83,6 +91,14 @@ public class InternalTypeManager implements TypeManager {
         return TSDataType.BOOLEAN;
       case UNKNOWN:
         return TSDataType.UNKNOWN;
+      case DATE:
+        return TSDataType.DATE;
+      case TIMESTAMP:
+        return TSDataType.TIMESTAMP;
+      case BLOB:
+        return TSDataType.BLOB;
+      case STRING:
+        return TSDataType.STRING;
       default:
         throw new IllegalArgumentException();
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/CaseWhenThenColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/CaseWhenThenColumnTransformer.java
index 68910f2aa4b..ea1ba432fa2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/CaseWhenThenColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/CaseWhenThenColumnTransformer.java
@@ -22,12 +22,13 @@ package 
org.apache.iotdb.db.queryengine.transformation.dag.column;
 import org.apache.commons.lang3.Validate;
 import org.apache.tsfile.block.column.Column;
 import org.apache.tsfile.block.column.ColumnBuilder;
-import org.apache.tsfile.read.common.type.BinaryType;
+import org.apache.tsfile.read.common.type.AbstractIntType;
+import org.apache.tsfile.read.common.type.AbstractLongType;
+import org.apache.tsfile.read.common.type.AbstractVarcharType;
+import org.apache.tsfile.read.common.type.BlobType;
 import org.apache.tsfile.read.common.type.BooleanType;
 import org.apache.tsfile.read.common.type.DoubleType;
 import org.apache.tsfile.read.common.type.FloatType;
-import org.apache.tsfile.read.common.type.IntType;
-import org.apache.tsfile.read.common.type.LongType;
 import org.apache.tsfile.read.common.type.Type;
 import org.apache.tsfile.utils.Pair;
 
@@ -66,15 +67,15 @@ public class CaseWhenThenColumnTransformer extends 
ColumnTransformer {
       ColumnTransformer childTransformer, Column column, int index, 
ColumnBuilder builder) {
     if (returnType instanceof BooleanType) {
       builder.writeBoolean(childTransformer.getType().getBoolean(column, 
index));
-    } else if (returnType instanceof IntType) {
+    } else if (returnType instanceof AbstractIntType) {
       builder.writeInt(childTransformer.getType().getInt(column, index));
-    } else if (returnType instanceof LongType) {
+    } else if (returnType instanceof AbstractLongType) {
       builder.writeLong(childTransformer.getType().getLong(column, index));
     } else if (returnType instanceof FloatType) {
       builder.writeFloat(childTransformer.getType().getFloat(column, index));
     } else if (returnType instanceof DoubleType) {
       builder.writeDouble(childTransformer.getType().getDouble(column, index));
-    } else if (returnType instanceof BinaryType) {
+    } else if (returnType instanceof AbstractVarcharType || returnType 
instanceof BlobType) {
       builder.writeBinary(childTransformer.getType().getBinary(column, index));
     } else {
       throw new UnsupportedOperationException("Unsupported Type");
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ColumnTransformer.java
index 922e95e85f6..cc8a8ba11fd 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ColumnTransformer.java
@@ -25,6 +25,8 @@ import org.apache.tsfile.block.column.Column;
 import org.apache.tsfile.read.common.type.Type;
 import org.apache.tsfile.read.common.type.TypeEnum;
 
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isNumericType;
+
 public abstract class ColumnTransformer {
 
   protected final Type returnType;
@@ -69,11 +71,7 @@ public abstract class ColumnTransformer {
     if (returnType == null) {
       return true;
     }
-    TypeEnum typeEnum = returnType.getTypeEnum();
-    return typeEnum.equals(TypeEnum.INT32)
-        || typeEnum.equals(TypeEnum.INT64)
-        || typeEnum.equals(TypeEnum.FLOAT)
-        || typeEnum.equals(TypeEnum.DOUBLE);
+    return isNumericType(returnType);
   }
 
   /**
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java
index 2ff1fd3daa9..17c4abe41e7 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java
@@ -28,6 +28,8 @@ import 
org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn;
 import org.apache.tsfile.read.common.type.Type;
 import org.apache.tsfile.read.common.type.TypeEnum;
 
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isCharType;
+
 public abstract class CompareBinaryColumnTransformer extends 
BinaryColumnTransformer {
 
   protected CompareBinaryColumnTransformer(
@@ -49,7 +51,7 @@ public abstract class CompareBinaryColumnTransformer extends 
BinaryColumnTransfo
       if (!leftColumn.isNull(i) && !rightColumn.isNull(i)) {
         boolean flag = false;
         // compare binary type
-        if (TypeEnum.TEXT.equals(leftTransformer.getType().getTypeEnum())) {
+        if (isCharType(leftTransformer.getType())) {
           flag =
               transform(
                   TransformUtils.compare(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareEqualToColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareEqualToColumnTransformer.java
index 76715d42829..f777180e9f0 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareEqualToColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareEqualToColumnTransformer.java
@@ -23,6 +23,10 @@ import 
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransform
 
 import org.apache.tsfile.read.common.type.Type;
 
+import java.util.Arrays;
+
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isTwoTypeComparable;
+
 public class CompareEqualToColumnTransformer extends 
CompareBinaryColumnTransformer {
   public CompareEqualToColumnTransformer(
       Type returnType, ColumnTransformer leftTransformer, ColumnTransformer 
rightTransformer) {
@@ -31,12 +35,8 @@ public class CompareEqualToColumnTransformer extends 
CompareBinaryColumnTransfor
 
   @Override
   protected final void checkType() {
-    if (typeEquals(leftTransformer, rightTransformer)) {
-      return;
-    }
-
-    // Boolean type and Binary Type can not be compared with other types
-    if (!leftTransformer.isReturnTypeNumeric() || 
!rightTransformer.isReturnTypeNumeric()) {
+    if (!isTwoTypeComparable(
+        Arrays.asList(leftTransformer.getType(), rightTransformer.getType()))) 
{
       throw new UnsupportedOperationException("Unsupported Type");
     }
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareNonEqualColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareNonEqualColumnTransformer.java
index b4c4a297809..9f0cd152ebe 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareNonEqualColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareNonEqualColumnTransformer.java
@@ -23,6 +23,10 @@ import 
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransform
 
 import org.apache.tsfile.read.common.type.Type;
 
+import java.util.Arrays;
+
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isTwoTypeComparable;
+
 public class CompareNonEqualColumnTransformer extends 
CompareBinaryColumnTransformer {
   public CompareNonEqualColumnTransformer(
       Type returnType, ColumnTransformer leftTransformer, ColumnTransformer 
rightTransformer) {
@@ -31,12 +35,8 @@ public class CompareNonEqualColumnTransformer extends 
CompareBinaryColumnTransfo
 
   @Override
   protected final void checkType() {
-    if (typeEquals(leftTransformer, rightTransformer)) {
-      return;
-    }
-
-    // Boolean type and Binary Type can not be compared with other types
-    if (!leftTransformer.isReturnTypeNumeric() || 
!rightTransformer.isReturnTypeNumeric()) {
+    if (!isTwoTypeComparable(
+        Arrays.asList(leftTransformer.getType(), rightTransformer.getType()))) 
{
       throw new UnsupportedOperationException("Unsupported Type");
     }
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
index eb77148edd9..889c742b895 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
@@ -24,9 +24,10 @@ import 
org.apache.iotdb.db.queryengine.transformation.dag.util.TransformUtils;
 
 import org.apache.tsfile.block.column.Column;
 import org.apache.tsfile.block.column.ColumnBuilder;
-import org.apache.tsfile.read.common.type.BinaryType;
 import org.apache.tsfile.read.common.type.Type;
 
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isCharType;
+
 public class BetweenColumnTransformer extends CompareTernaryColumnTransformer {
   private final boolean isNotBetween;
 
@@ -50,7 +51,7 @@ public class BetweenColumnTransformer extends 
CompareTernaryColumnTransformer {
     for (int i = 0; i < positionCount; i++) {
       if (!firstColumn.isNull(i) && !secondColumn.isNull(i) && 
!thirdColumn.isNull(i)) {
         boolean flag;
-        if (firstColumnTransformer.getType() instanceof BinaryType) {
+        if (isCharType(firstColumnTransformer.getType())) {
           flag =
               ((TransformUtils.compare(
                               
firstColumnTransformer.getType().getBinary(firstColumn, i),
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/CompareTernaryColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/CompareTernaryColumnTransformer.java
index f4401c37a2a..86ab67d5cd1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/CompareTernaryColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/CompareTernaryColumnTransformer.java
@@ -22,7 +22,8 @@ package 
org.apache.iotdb.db.queryengine.transformation.dag.column.ternary;
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer;
 
 import org.apache.tsfile.read.common.type.Type;
-import org.apache.tsfile.read.common.type.TypeEnum;
+
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isCharType;
 
 public abstract class CompareTernaryColumnTransformer extends 
TernaryColumnTransformer {
   protected CompareTernaryColumnTransformer(
@@ -38,9 +39,9 @@ public abstract class CompareTernaryColumnTransformer extends 
TernaryColumnTrans
     if (firstColumnTransformer.isReturnTypeNumeric()
             && secondColumnTransformer.isReturnTypeNumeric()
             && thirdColumnTransformer.isReturnTypeNumeric()
-        || firstColumnTransformer.typeEquals(TypeEnum.TEXT)
-            && secondColumnTransformer.typeEquals(TypeEnum.TEXT)
-            && thirdColumnTransformer.typeEquals(TypeEnum.TEXT)) {
+        || isCharType(firstColumnTransformer.getType())
+            && isCharType(secondColumnTransformer.getType())
+            && isCharType(thirdColumnTransformer.getType())) {
       return;
     }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/InColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/InColumnTransformer.java
index 0ff3625ffd9..d7e32db83e4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/InColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/InColumnTransformer.java
@@ -80,9 +80,11 @@ public class InColumnTransformer extends 
UnaryColumnTransformer {
       if (!column.isNull(i)) {
         switch (childType) {
           case INT32:
+          case DATE:
             returnType.writeBoolean(columnBuilder, 
satisfy.of(column.getInt(i)));
             break;
           case INT64:
+          case TIMESTAMP:
             returnType.writeBoolean(columnBuilder, 
satisfy.of(column.getLong(i)));
             break;
           case FLOAT:
@@ -94,6 +96,7 @@ public class InColumnTransformer extends 
UnaryColumnTransformer {
           case BOOLEAN:
             returnType.writeBoolean(columnBuilder, 
satisfy.of(column.getBoolean(i)));
             break;
+          case STRING:
           case TEXT:
             returnType.writeBoolean(
                 columnBuilder,
@@ -125,6 +128,7 @@ public class InColumnTransformer extends 
UnaryColumnTransformer {
         }
         break;
       case INT64:
+      case TIMESTAMP:
         longSet = new HashSet<>();
         for (String value : values) {
           try {
@@ -161,6 +165,7 @@ public class InColumnTransformer extends 
UnaryColumnTransformer {
         }
         break;
       case TEXT:
+      case STRING:
         stringSet = values;
         break;
       default:
@@ -175,6 +180,7 @@ public class InColumnTransformer extends 
UnaryColumnTransformer {
     String errorMsg = "\"%s\" cannot be cast to [%s]";
     switch (childType) {
       case INT32:
+      case DATE:
         intSet = new HashSet<>();
         for (Literal value : values) {
           try {
@@ -185,6 +191,7 @@ public class InColumnTransformer extends 
UnaryColumnTransformer {
         }
         break;
       case INT64:
+      case TIMESTAMP:
         longSet = new HashSet<>();
         for (Literal value : values) {
           try {
@@ -221,6 +228,7 @@ public class InColumnTransformer extends 
UnaryColumnTransformer {
         }
         break;
       case TEXT:
+      case STRING:
         stringSet = new HashSet<>();
         for (Literal value : values) {
           stringSet.add(((StringLiteral) value).getValue());
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/RegularColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/RegularColumnTransformer.java
index 5c86d9def0e..9f06b456190 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/RegularColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/RegularColumnTransformer.java
@@ -25,10 +25,11 @@ import org.apache.tsfile.block.column.Column;
 import org.apache.tsfile.block.column.ColumnBuilder;
 import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.read.common.type.Type;
-import org.apache.tsfile.read.common.type.TypeEnum;
 
 import java.util.regex.Pattern;
 
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isCharType;
+
 public class RegularColumnTransformer extends UnaryColumnTransformer {
   private final Pattern pattern;
 
@@ -59,7 +60,7 @@ public class RegularColumnTransformer extends 
UnaryColumnTransformer {
 
   @Override
   protected void checkType() {
-    if (!childColumnTransformer.typeEquals(TypeEnum.TEXT)) {
+    if (!isCharType(childColumnTransformer.getType())) {
       throw new UnsupportedOperationException(
           "Unsupported Type: " + 
childColumnTransformer.getType().getTypeEnum());
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/CastFunctionColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/CastFunctionColumnTransformer.java
index b123975cc68..7ef2b156935 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/CastFunctionColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/CastFunctionColumnTransformer.java
@@ -47,9 +47,11 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
       if (!column.isNull(i)) {
         switch (sourceType) {
           case INT32:
+          case DATE:
             cast(columnBuilder, childType.getInt(column, i));
             break;
           case INT64:
+          case TIMESTAMP:
             cast(columnBuilder, childType.getLong(column, i));
             break;
           case FLOAT:
@@ -62,6 +64,8 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
             cast(columnBuilder, childType.getBoolean(column, i));
             break;
           case TEXT:
+          case STRING:
+          case BLOB:
             cast(columnBuilder, childType.getBinary(column, i));
             break;
           default:
@@ -79,9 +83,11 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
   private void cast(ColumnBuilder columnBuilder, int value) {
     switch (returnType.getTypeEnum()) {
       case INT32:
+      case DATE:
         returnType.writeInt(columnBuilder, value);
         break;
       case INT64:
+      case TIMESTAMP:
         returnType.writeLong(columnBuilder, value);
         break;
       case FLOAT:
@@ -94,8 +100,12 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
         returnType.writeBoolean(columnBuilder, value != 0);
         break;
       case TEXT:
+      case STRING:
         returnType.writeBinary(columnBuilder, 
BytesUtils.valueOf(String.valueOf(value)));
         break;
+      case BLOB:
+        returnType.writeBinary(columnBuilder, new 
Binary(BytesUtils.intToBytes(value)));
+        break;
       default:
         throw new UnsupportedOperationException(String.format(ERROR_MSG, 
returnType.getTypeEnum()));
     }
@@ -104,9 +114,11 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
   private void cast(ColumnBuilder columnBuilder, long value) {
     switch (returnType.getTypeEnum()) {
       case INT32:
+      case DATE:
         returnType.writeInt(columnBuilder, 
(CastFunctionHelper.castLongToInt(value)));
         break;
       case INT64:
+      case TIMESTAMP:
         returnType.writeLong(columnBuilder, value);
         break;
       case FLOAT:
@@ -119,8 +131,12 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
         returnType.writeBoolean(columnBuilder, value != 0L);
         break;
       case TEXT:
+      case STRING:
         returnType.writeBinary(columnBuilder, 
BytesUtils.valueOf(String.valueOf(value)));
         break;
+      case BLOB:
+        returnType.writeBinary(columnBuilder, new 
Binary(BytesUtils.longToBytes(value)));
+        break;
       default:
         throw new UnsupportedOperationException(String.format(ERROR_MSG, 
returnType.getTypeEnum()));
     }
@@ -129,9 +145,11 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
   private void cast(ColumnBuilder columnBuilder, float value) {
     switch (returnType.getTypeEnum()) {
       case INT32:
+      case DATE:
         returnType.writeInt(columnBuilder, 
CastFunctionHelper.castFloatToInt(value));
         break;
       case INT64:
+      case TIMESTAMP:
         returnType.writeLong(columnBuilder, 
CastFunctionHelper.castFloatToLong(value));
         break;
       case FLOAT:
@@ -144,8 +162,12 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
         returnType.writeBoolean(columnBuilder, value != 0.0f);
         break;
       case TEXT:
+      case STRING:
         returnType.writeBinary(columnBuilder, 
BytesUtils.valueOf(String.valueOf(value)));
         break;
+      case BLOB:
+        returnType.writeBinary(columnBuilder, new 
Binary(BytesUtils.floatToBytes(value)));
+        break;
       default:
         throw new UnsupportedOperationException(String.format(ERROR_MSG, 
returnType.getTypeEnum()));
     }
@@ -154,9 +176,11 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
   private void cast(ColumnBuilder columnBuilder, double value) {
     switch (returnType.getTypeEnum()) {
       case INT32:
+      case DATE:
         returnType.writeInt(columnBuilder, 
CastFunctionHelper.castDoubleToInt(value));
         break;
       case INT64:
+      case TIMESTAMP:
         returnType.writeLong(columnBuilder, 
CastFunctionHelper.castDoubleToLong(value));
         break;
       case FLOAT:
@@ -169,8 +193,12 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
         returnType.writeBoolean(columnBuilder, value != 0.0);
         break;
       case TEXT:
+      case STRING:
         returnType.writeBinary(columnBuilder, 
BytesUtils.valueOf(String.valueOf(value)));
         break;
+      case BLOB:
+        returnType.writeBinary(columnBuilder, new 
Binary(BytesUtils.doubleToBytes(value)));
+        break;
       default:
         throw new UnsupportedOperationException(String.format(ERROR_MSG, 
returnType.getTypeEnum()));
     }
@@ -179,9 +207,11 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
   private void cast(ColumnBuilder columnBuilder, boolean value) {
     switch (returnType.getTypeEnum()) {
       case INT32:
+      case DATE:
         returnType.writeInt(columnBuilder, value ? 1 : 0);
         break;
       case INT64:
+      case TIMESTAMP:
         returnType.writeLong(columnBuilder, value ? 1L : 0);
         break;
       case FLOAT:
@@ -194,8 +224,12 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
         returnType.writeBoolean(columnBuilder, value);
         break;
       case TEXT:
+      case STRING:
         returnType.writeBinary(columnBuilder, 
BytesUtils.valueOf(String.valueOf(value)));
         break;
+      case BLOB:
+        returnType.writeBinary(columnBuilder, new 
Binary(BytesUtils.boolToBytes(value)));
+        break;
       default:
         throw new UnsupportedOperationException(String.format(ERROR_MSG, 
returnType.getTypeEnum()));
     }
@@ -205,9 +239,11 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
     String stringValue = value.getStringValue(TSFileConfig.STRING_CHARSET);
     switch (returnType.getTypeEnum()) {
       case INT32:
+      case DATE:
         returnType.writeInt(columnBuilder, Integer.parseInt(stringValue));
         break;
       case INT64:
+      case TIMESTAMP:
         returnType.writeLong(columnBuilder, Long.parseLong(stringValue));
         break;
       case FLOAT:
@@ -220,6 +256,8 @@ public class CastFunctionColumnTransformer extends 
UnaryColumnTransformer {
         returnType.writeBoolean(columnBuilder, 
CastFunctionHelper.castTextToBoolean(stringValue));
         break;
       case TEXT:
+      case STRING:
+      case BLOB:
         returnType.writeBinary(columnBuilder, value);
         break;
       default:
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
index 4a7a271e64a..4f9316dc5bd 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
@@ -98,8 +98,6 @@ import org.apache.tsfile.read.common.block.column.IntColumn;
 import org.apache.tsfile.read.common.block.column.LongColumn;
 import org.apache.tsfile.read.common.block.column.TimeColumn;
 import org.apache.tsfile.read.common.type.BooleanType;
-import org.apache.tsfile.read.common.type.LongType;
-import org.apache.tsfile.read.common.type.TypeEnum;
 import org.apache.tsfile.utils.TimeDuration;
 import org.apache.tsfile.write.schema.MeasurementSchema;
 import org.junit.Test;
@@ -117,6 +115,7 @@ import java.util.concurrent.ExecutorService;
 import static 
org.apache.iotdb.db.queryengine.execution.fragment.FragmentInstanceContext.createFragmentInstanceContext;
 import static 
org.apache.iotdb.db.queryengine.execution.operator.AggregationUtil.initTimeRangeIterator;
 import static 
org.apache.iotdb.db.queryengine.execution.operator.process.last.LastQueryMergeOperator.MAP_NODE_RETRAINED_SIZE;
+import static org.apache.tsfile.read.common.type.LongType.INT64;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
@@ -628,24 +627,20 @@ public class OperatorMemoryTest {
     Mockito.when(child.calculateMaxPeekMemory()).thenReturn(2048L);
     Mockito.when(child.calculateMaxReturnSize()).thenReturn(1024L);
     
Mockito.when(child.calculateRetainedSizeAfterCallingNext()).thenReturn(512L);
-    BooleanType booleanType = Mockito.mock(BooleanType.class);
-    Mockito.when(booleanType.getTypeEnum()).thenReturn(TypeEnum.BOOLEAN);
-    LongType longType = Mockito.mock(LongType.class);
-    Mockito.when(longType.getTypeEnum()).thenReturn(TypeEnum.INT64);
     ColumnTransformer filterColumnTransformer =
         new CompareLessEqualColumnTransformer(
-            booleanType,
-            new TimeColumnTransformer(longType),
-            new ConstantColumnTransformer(longType, 
Mockito.mock(IntColumn.class)));
+            BooleanType.BOOLEAN,
+            new TimeColumnTransformer(INT64),
+            new ConstantColumnTransformer(INT64, 
Mockito.mock(IntColumn.class)));
     List<TSDataType> filterOutputTypes = new ArrayList<>();
     filterOutputTypes.add(TSDataType.INT32);
     filterOutputTypes.add(TSDataType.INT64);
     List<ColumnTransformer> projectColumnTransformers = new ArrayList<>();
     projectColumnTransformers.add(
         new ArithmeticAdditionColumnTransformer(
-            booleanType,
-            new TimeColumnTransformer(longType),
-            new ConstantColumnTransformer(longType, 
Mockito.mock(IntColumn.class))));
+            BooleanType.BOOLEAN,
+            new TimeColumnTransformer(INT64),
+            new ConstantColumnTransformer(INT64, 
Mockito.mock(IntColumn.class))));
 
     FilterAndProjectOperator operator =
         new FilterAndProjectOperator(
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 55fbeacb86c..faa5509c9c2 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
@@ -54,11 +54,11 @@ import java.util.Map;
 import java.util.Optional;
 
 import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.getFunctionType;
-import static org.apache.tsfile.read.common.type.BinaryType.TEXT;
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isOneNumericType;
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isTwoNumericType;
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isTwoTypeComparable;
 import static org.apache.tsfile.read.common.type.BooleanType.BOOLEAN;
 import static org.apache.tsfile.read.common.type.DoubleType.DOUBLE;
-import static org.apache.tsfile.read.common.type.FloatType.FLOAT;
-import static org.apache.tsfile.read.common.type.IntType.INT32;
 import static org.apache.tsfile.read.common.type.LongType.INT64;
 
 public class TestMatadata implements Metadata {
@@ -241,42 +241,6 @@ public class TestMatadata implements Metadata {
     return DATA_PARTITION;
   }
 
-  public static boolean isTwoNumericType(List<? extends Type> argumentTypes) {
-    return argumentTypes.size() == 2
-        && isNumericType(argumentTypes.get(0))
-        && isNumericType(argumentTypes.get(1));
-  }
-
-  public static boolean isOneNumericType(List<? extends Type> argumentTypes) {
-    return argumentTypes.size() == 1 && isNumericType(argumentTypes.get(0));
-  }
-
-  public static boolean isOneBooleanType(List<? extends Type> argumentTypes) {
-    return argumentTypes.size() == 1 && BOOLEAN.equals(argumentTypes.get(0));
-  }
-
-  public static boolean isOneTextType(List<? extends Type> argumentTypes) {
-    return argumentTypes.size() == 1 && TEXT.equals(argumentTypes.get(0));
-  }
-
-  public static boolean isNumericType(Type type) {
-    return DOUBLE.equals(type) || FLOAT.equals(type) || INT32.equals(type) || 
INT64.equals(type);
-  }
-
-  public static boolean isTwoTypeComparable(List<? extends Type> 
argumentTypes) {
-    if (argumentTypes.size() != 2) {
-      return false;
-    }
-    Type left = argumentTypes.get(0);
-    Type right = argumentTypes.get(1);
-    if (left.equals(right)) {
-      return true;
-    }
-
-    // Boolean type and Binary Type can not be compared with other types
-    return isNumericType(left) && isNumericType(right);
-  }
-
   private static final DataPartition DATA_PARTITION = 
MockTablePartition.constructDataPartition();
   private static final SchemaPartition SCHEMA_PARTITION =
       MockTablePartition.constructSchemaPartition();

Reply via email to