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

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

commit 9e648fff9d0cde50f7f57ff60847d1a6f7d794f0
Author: JackieTien97 <[email protected]>
AuthorDate: Thu Jun 27 20:56:32 2024 +0800

    support new data type
---
 .../load/subscriber/NodeStatisticsChangeEvent.java | 31 -----------------
 .../relational/ColumnTransformerBuilder.java       | 39 +++++++++++-----------
 .../relational/analyzer/ExpressionAnalyzer.java    |  8 ++---
 .../predicate/ConvertPredicateToFilterVisitor.java |  8 +++++
 .../plan/relational/metadata/ColumnSchema.java     | 12 +++++++
 .../relational/metadata/TableMetadataImpl.java     | 33 ++++++++++--------
 .../plan/relational/planner/LogicalPlanner.java    | 27 ++-------------
 .../plan/relational/type/InternalTypeManager.java  | 16 +++++++++
 .../binary/CompareBinaryColumnTransformer.java     |  4 ++-
 .../ternary/CompareTernaryColumnTransformer.java   |  9 ++---
 .../dag/column/unary/InColumnTransformer.java      |  5 +++
 .../dag/column/unary/RegularColumnTransformer.java |  5 +--
 .../scalar/CastFunctionColumnTransformer.java      | 38 +++++++++++++++++++++
 13 files changed, 134 insertions(+), 101 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..c003fabd2bc 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,10 @@ 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.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;
 
@@ -298,7 +298,7 @@ public class ColumnTransformerBuilder
             e -> {
               ConstantColumnTransformer columnTransformer =
                   new ConstantColumnTransformer(
-                      TEXT,
+                      STRING,
                       new BinaryColumn(
                           1,
                           Optional.empty(),
@@ -424,7 +424,7 @@ public class ColumnTransformerBuilder
                         e -> {
                           ConstantColumnTransformer columnTransformer =
                               new ConstantColumnTransformer(
-                                  TEXT,
+                                  STRING,
                                   new BinaryColumn(
                                       1,
                                       Optional.empty(),
@@ -459,7 +459,7 @@ public class ColumnTransformerBuilder
             e -> {
               ConstantColumnTransformer columnTransformer =
                   new ConstantColumnTransformer(
-                      TEXT,
+                      STRING,
                       new BinaryColumn(
                           1,
                           Optional.empty(),
@@ -528,57 +528,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..27cae5a407c 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
@@ -105,12 +105,12 @@ import static java.util.Collections.unmodifiableSet;
 import static java.util.Objects.requireNonNull;
 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.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 {
@@ -682,7 +682,7 @@ public class ExpressionAnalyzer {
     @Override
     protected Type visitStringLiteral(
         StringLiteral node, StackableAstVisitorContext<Context> context) {
-      return setExpressionType(node, TEXT);
+      return setExpressionType(node, STRING);
     }
 
     @Override
@@ -799,12 +799,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
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..f3b46fced97 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) {
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/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/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..cdc639143ea 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:
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:


Reply via email to