You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2021/05/28 04:14:01 UTC

[iotdb] 04/06: support + - * / %

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

rong pushed a commit to branch iotdb-1400
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 83034d5efa8f8b53756769c8e301f7dfd1d478b5
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Thu May 27 21:39:57 2021 +0800

    support + - * / %
---
 .../apache/iotdb/db/qp/physical/crud/UDTFPlan.java | 31 +++++++++-
 .../apache/iotdb/db/query/dataset/UDTFDataSet.java | 72 +++++++++++++++++++++-
 .../iotdb/db/query/expression/Expression.java      |  5 --
 .../query/expression/binary/BinaryExpression.java  | 18 +++---
 .../query/expression/unary/FunctionExpression.java | 18 ------
 .../query/expression/unary/NegationExpression.java |  6 +-
 .../query/expression/unary/TimeSeriesOperand.java  | 10 ---
 .../transformer/ArithmeticAdditionTransformer.java |  2 +-
 .../transformer/ArithmeticBinaryTransformer.java   |  7 ++-
 .../transformer/ArithmeticDivisionTransformer.java |  2 +-
 .../transformer/ArithmeticModuloTransformer.java   |  2 +-
 .../ArithmeticMultiplicationTransformer.java       |  2 +-
 .../ArithmeticSubtractionTransformer.java          |  2 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  9 +--
 14 files changed, 121 insertions(+), 65 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/UDTFPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/UDTFPlan.java
index bd2cc94..856319f 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/UDTFPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/UDTFPlan.java
@@ -26,12 +26,15 @@ import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ResultColumn;
+import org.apache.iotdb.db.query.expression.binary.BinaryExpression;
 import org.apache.iotdb.db.query.expression.unary.FunctionExpression;
+import org.apache.iotdb.db.query.expression.unary.NegationExpression;
 import org.apache.iotdb.db.query.expression.unary.TimeSeriesOperand;
 import org.apache.iotdb.db.query.udf.core.executor.UDTFExecutor;
 import org.apache.iotdb.db.query.udf.service.UDFClassLoaderManager;
 import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.service.IoTDB;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.Pair;
 
 import java.time.ZoneId;
@@ -152,6 +155,27 @@ public class UDTFPlan extends RawDataQueryPlan implements UDFPlan {
     }
   }
 
+  public TSDataType getOriginalOutputColumnDataType(int originalOutputColumn) {
+    Expression expression = resultColumns.get(originalOutputColumn).getExpression();
+    // UDF query
+    if (expression instanceof FunctionExpression) {
+      return getExecutorByOriginalOutputColumnIndex(originalOutputColumn)
+          .getConfigurations()
+          .getOutputDataType();
+    }
+    // arithmetic binary query
+    if (expression instanceof BinaryExpression) {
+      return TSDataType.DOUBLE;
+    }
+    // arithmetic negation query
+    if (expression instanceof NegationExpression) {
+      return getDeduplicatedDataTypes()
+          .get(getReaderIndex(((NegationExpression) expression).getExpression().toString()));
+    }
+    // raw query
+    return getDeduplicatedDataTypes().get(getReaderIndex(expression.toString()));
+  }
+
   public UDTFExecutor getExecutorByOriginalOutputColumnIndex(int originalOutputColumn) {
     return originalOutputColumnIndex2Executor.get(originalOutputColumn);
   }
@@ -165,7 +189,12 @@ public class UDTFPlan extends RawDataQueryPlan implements UDFPlan {
   }
 
   public boolean isUdfColumn(int datasetOutputIndex) {
-    return datasetOutputColumnIndex2UdfColumnName.get(datasetOutputIndex) != null;
+    return resultColumns.get(datasetOutputIndex).getExpression() instanceof FunctionExpression;
+  }
+
+  public boolean isArithmeticColumn(int datasetOutputIndex) {
+    Expression expression = resultColumns.get(datasetOutputIndex).getExpression();
+    return expression instanceof BinaryExpression || expression instanceof NegationExpression;
   }
 
   public int getReaderIndex(String pathName) {
diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java
index 4fa2db9..79226f5 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java
@@ -24,12 +24,27 @@ import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.expression.Expression;
+import org.apache.iotdb.db.query.expression.binary.AdditionExpression;
+import org.apache.iotdb.db.query.expression.binary.BinaryExpression;
+import org.apache.iotdb.db.query.expression.binary.DivisionExpression;
+import org.apache.iotdb.db.query.expression.binary.ModuloExpression;
+import org.apache.iotdb.db.query.expression.binary.MultiplicationExpression;
+import org.apache.iotdb.db.query.expression.binary.SubtractionExpression;
+import org.apache.iotdb.db.query.expression.unary.NegationExpression;
 import org.apache.iotdb.db.query.reader.series.IReaderByTimestamp;
 import org.apache.iotdb.db.query.reader.series.ManagedSeriesReader;
 import org.apache.iotdb.db.query.udf.api.customizer.strategy.AccessStrategy;
 import org.apache.iotdb.db.query.udf.core.executor.UDTFExecutor;
 import org.apache.iotdb.db.query.udf.core.input.InputLayer;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
+import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticAdditionTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticDivisionTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticModuloTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticMultiplicationTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticNegationTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticSubtractionTransformer;
 import org.apache.iotdb.db.query.udf.core.transformer.RawQueryPointTransformer;
 import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
 import org.apache.iotdb.db.query.udf.core.transformer.UDFQueryRowTransformer;
@@ -113,6 +128,8 @@ public abstract class UDTFDataSet extends QueryDataSet {
     for (int i = 0; i < size; ++i) {
       if (udtfPlan.isUdfColumn(i)) {
         constructUDFTransformer(i, memoryBudgetForSingleWindowTransformer);
+      } else if (udtfPlan.isArithmeticColumn(i)) {
+        constructArithmeticTransformer(i);
       } else {
         constructRawQueryTransformer(i);
       }
@@ -175,12 +192,61 @@ public abstract class UDTFDataSet extends QueryDataSet {
     return readerIndexes;
   }
 
+  private void constructArithmeticTransformer(int columnIndex) {
+    Expression expression = udtfPlan.getResultColumns().get(columnIndex).getExpression();
+
+    // unary expression
+    if (expression instanceof NegationExpression) {
+      transformers[columnIndex] =
+          new ArithmeticNegationTransformer(
+              constructPointReaderBySeriesName(
+                  ((NegationExpression) expression).getExpression().toString()));
+      return;
+    }
+
+    // binary expression
+    ArithmeticBinaryTransformer transformer;
+    BinaryExpression binaryExpression = (BinaryExpression) expression;
+    if (binaryExpression instanceof AdditionExpression) {
+      transformer =
+          new ArithmeticAdditionTransformer(
+              constructPointReaderBySeriesName(binaryExpression.getLeftExpression().toString()),
+              constructPointReaderBySeriesName(binaryExpression.getRightExpression().toString()));
+    } else if (binaryExpression instanceof SubtractionExpression) {
+      transformer =
+          new ArithmeticSubtractionTransformer(
+              constructPointReaderBySeriesName(binaryExpression.getLeftExpression().toString()),
+              constructPointReaderBySeriesName(binaryExpression.getRightExpression().toString()));
+    } else if (binaryExpression instanceof MultiplicationExpression) {
+      transformer =
+          new ArithmeticMultiplicationTransformer(
+              constructPointReaderBySeriesName(binaryExpression.getLeftExpression().toString()),
+              constructPointReaderBySeriesName(binaryExpression.getRightExpression().toString()));
+    } else if (binaryExpression instanceof DivisionExpression) {
+      transformer =
+          new ArithmeticDivisionTransformer(
+              constructPointReaderBySeriesName(binaryExpression.getLeftExpression().toString()),
+              constructPointReaderBySeriesName(binaryExpression.getRightExpression().toString()));
+    } else if (binaryExpression instanceof ModuloExpression) {
+      transformer =
+          new ArithmeticModuloTransformer(
+              constructPointReaderBySeriesName(binaryExpression.getLeftExpression().toString()),
+              constructPointReaderBySeriesName(binaryExpression.getRightExpression().toString()));
+    } else {
+      throw new UnsupportedOperationException(binaryExpression.toString());
+    }
+    transformers[columnIndex] = transformer;
+  }
+
   private void constructRawQueryTransformer(int columnIndex) {
     transformers[columnIndex] =
         new RawQueryPointTransformer(
-            inputLayer.constructPointReader(
-                udtfPlan.getReaderIndex(
-                    udtfPlan.getRawQueryColumnNameByDatasetOutputColumnIndex(columnIndex))));
+            constructPointReaderBySeriesName(
+                udtfPlan.getRawQueryColumnNameByDatasetOutputColumnIndex(columnIndex)));
+  }
+
+  private LayerPointReader constructPointReaderBySeriesName(String seriesName) {
+    return inputLayer.constructPointReader(udtfPlan.getReaderIndex(seriesName));
   }
 
   public void finalizeUDFs(long queryId) {
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
index b0c5f60..f610c5a 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
@@ -19,11 +19,9 @@
 
 package org.apache.iotdb.db.query.expression;
 
-import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.utils.WildcardsRemover;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.util.List;
 import java.util.Set;
@@ -38,9 +36,6 @@ public interface Expression {
     return false;
   }
 
-  // TODO: implement this method
-  TSDataType dataType() throws MetadataException;
-
   void concat(List<PartialPath> prefixPaths, List<Expression> resultExpressions);
 
   void removeWildcards(WildcardsRemover wildcardsRemover, List<Expression> resultExpressions)
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
index cff5bc3..48f94f8 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
@@ -23,7 +23,6 @@ import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.utils.WildcardsRemover;
 import org.apache.iotdb.db.query.expression.Expression;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -39,14 +38,9 @@ public abstract class BinaryExpression implements Expression {
     this.rightExpression = rightExpression;
   }
 
-  /**
-   * The result data type of all arithmetic operations will be DOUBLE.
-   *
-   * <p>TODO: This is just a simple implementation and should be optimized later.
-   */
   @Override
-  public final TSDataType dataType() {
-    return TSDataType.DOUBLE;
+  public boolean isTimeSeriesGeneratingFunctionExpression() {
+    return true;
   }
 
   @Override
@@ -108,6 +102,14 @@ public abstract class BinaryExpression implements Expression {
     rightExpression.collectPaths(pathSet);
   }
 
+  public Expression getLeftExpression() {
+    return leftExpression;
+  }
+
+  public Expression getRightExpression() {
+    return rightExpression;
+  }
+
   @Override
   public final String toString() {
     return String.format(
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
index a321f97..1920e32 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
@@ -19,14 +19,12 @@
 
 package org.apache.iotdb.db.query.expression.unary;
 
-import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
 import org.apache.iotdb.db.qp.strategy.optimizer.ConcatPathOptimizer;
 import org.apache.iotdb.db.qp.utils.WildcardsRemover;
 import org.apache.iotdb.db.query.expression.Expression;
-import org.apache.iotdb.tsfile.exception.NotImplementedException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.util.ArrayList;
@@ -113,12 +111,6 @@ public class FunctionExpression implements Expression {
   }
 
   @Override
-  public TSDataType dataType() {
-    // TODO: the expression type is determined in runtime
-    throw new NotImplementedException();
-  }
-
-  @Override
   public void concat(List<PartialPath> prefixPaths, List<Expression> resultExpressions) {
     List<List<Expression>> resultExpressionsForRecursionList = new ArrayList<>();
 
@@ -153,16 +145,6 @@ public class FunctionExpression implements Expression {
     }
   }
 
-  public List<TSDataType> getDataTypes() throws MetadataException {
-    if (dataTypes == null) {
-      dataTypes = new ArrayList<>();
-      for (Expression expression : expressions) {
-        dataTypes.add(expression.dataType());
-      }
-    }
-    return dataTypes;
-  }
-
   public List<PartialPath> getPaths() {
     if (paths == null) {
       paths = new ArrayList<>();
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
index ea63365..675adb9 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
@@ -19,12 +19,10 @@
 
 package org.apache.iotdb.db.query.expression.unary;
 
-import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.utils.WildcardsRemover;
 import org.apache.iotdb.db.query.expression.Expression;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -43,8 +41,8 @@ public class NegationExpression implements Expression {
   }
 
   @Override
-  public TSDataType dataType() throws MetadataException {
-    return expression.dataType();
+  public boolean isTimeSeriesGeneratingFunctionExpression() {
+    return true;
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
index e69353c..232d031 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
@@ -19,12 +19,10 @@
 
 package org.apache.iotdb.db.query.expression.unary;
 
-import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.utils.WildcardsRemover;
 import org.apache.iotdb.db.query.expression.Expression;
-import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.util.List;
@@ -48,14 +46,6 @@ public class TimeSeriesOperand implements Expression {
   }
 
   @Override
-  public TSDataType dataType() throws MetadataException {
-    if (dataType == null) {
-      dataType = IoTDB.metaManager.getSeriesType(path);
-    }
-    return dataType;
-  }
-
-  @Override
   public void concat(List<PartialPath> prefixPaths, List<Expression> resultExpressions) {
     for (PartialPath prefixPath : prefixPaths) {
       resultExpressions.add(new TimeSeriesOperand(prefixPath.concatPath(path)));
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticAdditionTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticAdditionTransformer.java
index 15aa3cc..031f58d 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticAdditionTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticAdditionTransformer.java
@@ -23,7 +23,7 @@ import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
 public class ArithmeticAdditionTransformer extends ArithmeticBinaryTransformer {
 
-  protected ArithmeticAdditionTransformer(
+  public ArithmeticAdditionTransformer(
       LayerPointReader leftPointReader, LayerPointReader rightPointReader) {
     super(leftPointReader, rightPointReader);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java
index a1e52b8..d29e2da 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java
@@ -45,9 +45,10 @@ public abstract class ArithmeticBinaryTransformer extends Transformer {
     if (!cacheTime()) {
       return false;
     }
-    evaluate(
-        castCurrentValueToDoubleOperand(leftPointReader),
-        castCurrentValueToDoubleOperand(rightPointReader));
+    cachedDouble =
+        evaluate(
+            castCurrentValueToDoubleOperand(leftPointReader),
+            castCurrentValueToDoubleOperand(rightPointReader));
     leftPointReader.readyForNext();
     rightPointReader.readyForNext();
     return true;
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticDivisionTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticDivisionTransformer.java
index c4bfd28..c603003 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticDivisionTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticDivisionTransformer.java
@@ -23,7 +23,7 @@ import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
 public class ArithmeticDivisionTransformer extends ArithmeticBinaryTransformer {
 
-  protected ArithmeticDivisionTransformer(
+  public ArithmeticDivisionTransformer(
       LayerPointReader leftPointReader, LayerPointReader rightPointReader) {
     super(leftPointReader, rightPointReader);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticModuloTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticModuloTransformer.java
index 9a2ca0d..561974a 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticModuloTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticModuloTransformer.java
@@ -23,7 +23,7 @@ import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
 public class ArithmeticModuloTransformer extends ArithmeticBinaryTransformer {
 
-  protected ArithmeticModuloTransformer(
+  public ArithmeticModuloTransformer(
       LayerPointReader leftPointReader, LayerPointReader rightPointReader) {
     super(leftPointReader, rightPointReader);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticMultiplicationTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticMultiplicationTransformer.java
index 2298767..566108b 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticMultiplicationTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticMultiplicationTransformer.java
@@ -23,7 +23,7 @@ import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
 public class ArithmeticMultiplicationTransformer extends ArithmeticBinaryTransformer {
 
-  protected ArithmeticMultiplicationTransformer(
+  public ArithmeticMultiplicationTransformer(
       LayerPointReader leftPointReader, LayerPointReader rightPointReader) {
     super(leftPointReader, rightPointReader);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticSubtractionTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticSubtractionTransformer.java
index 4ccde7a..5ce2a58 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticSubtractionTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticSubtractionTransformer.java
@@ -23,7 +23,7 @@ import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
 public class ArithmeticSubtractionTransformer extends ArithmeticBinaryTransformer {
 
-  protected ArithmeticSubtractionTransformer(
+  public ArithmeticSubtractionTransformer(
       LayerPointReader leftPointReader, LayerPointReader rightPointReader) {
     super(leftPointReader, rightPointReader);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index fc8c344..0761dad 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -83,7 +83,6 @@ import org.apache.iotdb.db.query.dataset.DirectAlignByTimeDataSet;
 import org.apache.iotdb.db.query.dataset.DirectNonAlignDataSet;
 import org.apache.iotdb.db.query.dataset.UDTFDataSet;
 import org.apache.iotdb.db.query.expression.ResultColumn;
-import org.apache.iotdb.db.query.expression.unary.TimeSeriesOperand;
 import org.apache.iotdb.db.tools.watermark.GroupedLSBWatermarkEncoder;
 import org.apache.iotdb.db.tools.watermark.WatermarkEncoder;
 import org.apache.iotdb.db.utils.QueryDataSetUtils;
@@ -1022,13 +1021,7 @@ public class TSServiceImpl implements TSIService.Iface {
         UDTFPlan udtfPlan = (UDTFPlan) plan;
         for (int i = 0; i < paths.size(); i++) {
           respColumns.add(resultColumns.get(i).getResultColumnName());
-          seriesTypes.add(
-              resultColumns.get(i).getExpression() instanceof TimeSeriesOperand
-                  ? udtfPlan.getDataTypes().get(i)
-                  : udtfPlan
-                      .getExecutorByOriginalOutputColumnIndex(i)
-                      .getConfigurations()
-                      .getOutputDataType());
+          seriesTypes.add(udtfPlan.getOriginalOutputColumnDataType(i));
         }
         break;
       default: