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

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

commit c215e63e0bedd5d80318d8e05814b40f0fcb5efc
Author: Chen YZ <[email protected]>
AuthorDate: Wed Nov 20 11:10:44 2024 +0800

    fix it
---
 .../apache/iotdb/udf/ScalarFunctionExample.java    | 44 ++++++++++
 .../confignode/it/IoTDBConfigNodeSnapshotIT.java   |  2 +
 .../iotdb/udf/api/relational/access/Record.java    |  9 ++
 .../execution/aggregation/UDAFAccumulator.java     |  3 +-
 .../execution/config/TableConfigTaskVisitor.java   |  2 +-
 .../config/executor/ClusterConfigTaskExecutor.java | 12 +--
 .../config/metadata/ShowFunctionsTask.java         | 96 +++++++++++++++++++++-
 .../plan/relational/sql/parser/AstBuilder.java     |  5 +-
 .../unary/scalar/TableBuiltinScalarFunction.java   | 15 ++++
 .../transformation/dag/udf/UDTFExecutor.java       |  3 +-
 .../apache/iotdb/commons/conf/IoTDBConstant.java   | 11 +++
 .../iotdb/commons/udf/access/RecordIterator.java   |  5 ++
 .../udf/builtin/UDTFEqualSizeBucketSample.java     |  3 +-
 .../apache/iotdb/commons/udf/builtin/UDTFJexl.java |  3 +-
 .../apache/iotdb/commons/udf/builtin/UDTFM4.java   |  6 +-
 .../commons/udf/service/UDFManagementService.java  |  5 +-
 16 files changed, 197 insertions(+), 27 deletions(-)

diff --git 
a/example/udf/src/main/java/org/apache/iotdb/udf/ScalarFunctionExample.java 
b/example/udf/src/main/java/org/apache/iotdb/udf/ScalarFunctionExample.java
new file mode 100644
index 00000000000..b0718a5fc20
--- /dev/null
+++ b/example/udf/src/main/java/org/apache/iotdb/udf/ScalarFunctionExample.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.udf;
+
+import org.apache.iotdb.udf.api.customizer.parameter.FunctionParameters;
+import org.apache.iotdb.udf.api.relational.ScalarFunction;
+import org.apache.iotdb.udf.api.relational.access.Record;
+import org.apache.iotdb.udf.api.type.Type;
+
+public class ScalarFunctionExample implements ScalarFunction {
+  @Override
+  public void validate(FunctionParameters parameters) throws Exception {
+    if (parameters.getChildExpressionsSize() > 1) {
+      throw new Exception("Only one child expression is allowed");
+    }
+  }
+
+  @Override
+  public Type inferOutputType(FunctionParameters parameters) {
+    return parameters.getChildExpressionDataTypes().get(0);
+  }
+
+  @Override
+  public Object evaluate(Record input) throws Exception {
+    return input.getObject(0);
+  }
+}
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java
index 7a9d99006a8..046f3418c0f 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java
@@ -285,12 +285,14 @@ public class IoTDBConfigNodeSnapshotIT {
 
     TCreateFunctionReq createFunctionReq1 =
         new TCreateFunctionReq("test1", "org.apache.iotdb.udf.UDTFExample", 
true)
+            .setModel(Model.TREE)
             .setJarName(jarName)
             .setJarFile(jarFile)
             .setJarMD5(jarMD5);
 
     TCreateFunctionReq createFunctionReq2 =
         new TCreateFunctionReq("test2", "org.apache.iotdb.udf.UDTFExample", 
true)
+            .setModel(Model.TREE)
             .setJarName(jarName)
             .setJarFile(jarFile)
             .setJarMD5(jarMD5);
diff --git 
a/iotdb-api/udf-api/src/main/java/org/apache/iotdb/udf/api/relational/access/Record.java
 
b/iotdb-api/udf-api/src/main/java/org/apache/iotdb/udf/api/relational/access/Record.java
index 98d3b6b80c5..e230b8bed37 100644
--- 
a/iotdb-api/udf-api/src/main/java/org/apache/iotdb/udf/api/relational/access/Record.java
+++ 
b/iotdb-api/udf-api/src/main/java/org/apache/iotdb/udf/api/relational/access/Record.java
@@ -104,6 +104,15 @@ public interface Record {
    */
   String getString(int columnIndex) throws IOException;
 
+  /**
+   * Returns the object value at the specified column in this row.
+   *
+   * @param columnIndex index of the specified column
+   * @return the object value at the specified column in this row
+   * @throws IOException if an I/O error occurs
+   */
+  Object getObject(int columnIndex) throws IOException;
+
   /**
    * Returns the actual data type of the value at the specified column in this 
row.
    *
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/UDAFAccumulator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/UDAFAccumulator.java
index a56d6e9bd03..a0b78cc8cd6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/UDAFAccumulator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/UDAFAccumulator.java
@@ -199,8 +199,7 @@ public class UDAFAccumulator implements Accumulator {
 
   @Override
   public TSDataType getFinalType() {
-    return UDFDataTypeTransformer.transformToTsDataType(
-        configurations.getOutputDataType());
+    return 
UDFDataTypeTransformer.transformToTsDataType(configurations.getOutputDataType());
   }
 
   private void onError(String methodName, Exception e) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
index cc514c7c04f..3f74ca1b988 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
@@ -674,7 +674,7 @@ public class TableConfigTaskVisitor extends 
AstVisitor<IConfigTask, MPPQueryCont
 
   @Override
   protected IConfigTask visitShowFunctions(ShowFunctions node, MPPQueryContext 
context) {
-    context.setQueryType(QueryType.WRITE);
+    context.setQueryType(QueryType.READ);
     return new ShowFunctionsTask(Model.TABLE);
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index 82476db718a..68421b93094 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -628,8 +628,8 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
                 getUDFTableResp.getStatus().message, 
getUDFTableResp.getStatus().code));
         return future;
       }
-      // convert UDFTable and buildTsBlock
-      ShowFunctionsTask.buildTsBlock(getUDFTableResp.getAllUDFInformation(), 
future);
+      // convert UDFTable and buildTreeModelTsBlock
+      ShowFunctionsTask.buildTsBlock(model, 
getUDFTableResp.getAllUDFInformation(), future);
     } catch (ClientManagerException | TException e) {
       future.setException(e);
     }
@@ -803,7 +803,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
                 getTriggerTableResp.getStatus().message, 
getTriggerTableResp.getStatus().code));
         return future;
       }
-      // convert triggerTable and buildTsBlock
+      // convert triggerTable and buildTreeModelTsBlock
       
ShowTriggersTask.buildTsBlock(getTriggerTableResp.getAllTriggerInformation(), 
future);
     } catch (ClientManagerException | TException e) {
       future.setException(e);
@@ -978,7 +978,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
                 getPipePluginTableResp.getStatus().code));
         return future;
       }
-      // convert PipePluginTable and buildTsBlock
+      // convert PipePluginTable and buildTreeModelTsBlock
       
ShowPipePluginsTask.buildTsBlock(getPipePluginTableResp.getAllPipePluginMeta(), 
future);
     } catch (ClientManagerException | TException e) {
       future.setException(e);
@@ -2826,7 +2826,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
             new IoTDBException(showCQResp.getStatus().message, 
showCQResp.getStatus().code));
         return future;
       }
-      // convert cqList and buildTsBlock
+      // convert cqList and buildTreeModelTsBlock
       ShowContinuousQueriesTask.buildTsBlock(showCQResp.getCqList(), future);
     } catch (ClientManagerException | TException e) {
       future.setException(e);
@@ -2893,7 +2893,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
             new IoTDBException(showModelResp.getStatus().message, 
showModelResp.getStatus().code));
         return future;
       }
-      // convert model info list and buildTsBlock
+      // convert model info list and buildTreeModelTsBlock
       ShowModelsTask.buildTsBlock(showModelResp.getModelInfoList(), future);
     } catch (ClientManagerException | TException e) {
       future.setException(e);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/ShowFunctionsTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/ShowFunctionsTask.java
index a0a8506d0b6..3295b20350f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/ShowFunctionsTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/ShowFunctionsTask.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.commons.udf.UDFType;
 import org.apache.iotdb.commons.udf.builtin.BuiltinAggregationFunction;
 import org.apache.iotdb.commons.udf.builtin.BuiltinScalarFunction;
 import 
org.apache.iotdb.commons.udf.builtin.BuiltinTimeSeriesGeneratingFunction;
+import org.apache.iotdb.commons.udf.utils.TableUDFUtils;
 import org.apache.iotdb.commons.udf.utils.TreeUDFUtils;
 import org.apache.iotdb.db.queryengine.common.header.ColumnHeader;
 import org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant;
@@ -33,6 +34,8 @@ import 
org.apache.iotdb.db.queryengine.common.header.DatasetHeaderFactory;
 import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
 import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
+import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableBuiltinAggregationFunction;
+import 
org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.TableBuiltinScalarFunction;
 import org.apache.iotdb.rpc.TSStatusCode;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -44,6 +47,7 @@ import org.apache.tsfile.utils.BytesUtils;
 
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
@@ -52,12 +56,18 @@ import java.util.stream.Collectors;
 
 import static 
org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_STATE_AVAILABLE;
 import static 
org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_STATE_UNAVAILABLE;
+import static 
org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_BUILTIN_AGG_FUNC;
 import static 
org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_BUILTIN_SCALAR;
+import static 
org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_BUILTIN_SCALAR_FUNC;
+import static 
org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_BUILTIN_TABLE_FUNC;
 import static 
org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_BUILTIN_UDTF;
 import static 
org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_EXTERNAL_UDAF;
 import static 
org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_EXTERNAL_UDTF;
 import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_NATIVE;
 import static 
org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_UNKNOWN;
+import static 
org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_USER_DEFINED_AGG_FUNC;
+import static 
org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_USER_DEFINED_SCALAR_FUNC;
+import static 
org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_USER_DEFINED_TABLE_FUNC;
 
 public class ShowFunctionsTask implements IConfigTask {
 
@@ -69,9 +79,27 @@ public class ShowFunctionsTask implements IConfigTask {
     BINARY_MAP.put(FUNCTION_TYPE_EXTERNAL_UDTF, 
BytesUtils.valueOf(FUNCTION_TYPE_EXTERNAL_UDTF));
     BINARY_MAP.put(FUNCTION_TYPE_EXTERNAL_UDAF, 
BytesUtils.valueOf(FUNCTION_TYPE_EXTERNAL_UDAF));
     BINARY_MAP.put(FUNCTION_TYPE_BUILTIN_SCALAR, 
BytesUtils.valueOf(FUNCTION_TYPE_BUILTIN_SCALAR));
+
+    BINARY_MAP.put(
+        FUNCTION_TYPE_BUILTIN_SCALAR_FUNC, 
BytesUtils.valueOf(FUNCTION_TYPE_BUILTIN_SCALAR_FUNC));
+    BINARY_MAP.put(
+        FUNCTION_TYPE_BUILTIN_AGG_FUNC, 
BytesUtils.valueOf(FUNCTION_TYPE_BUILTIN_AGG_FUNC));
+    BINARY_MAP.put(
+        FUNCTION_TYPE_BUILTIN_TABLE_FUNC, 
BytesUtils.valueOf(FUNCTION_TYPE_BUILTIN_TABLE_FUNC));
+    BINARY_MAP.put(
+        FUNCTION_TYPE_USER_DEFINED_SCALAR_FUNC,
+        BytesUtils.valueOf(FUNCTION_TYPE_USER_DEFINED_SCALAR_FUNC));
+    BINARY_MAP.put(
+        FUNCTION_TYPE_USER_DEFINED_AGG_FUNC,
+        BytesUtils.valueOf(FUNCTION_TYPE_USER_DEFINED_AGG_FUNC));
+    BINARY_MAP.put(
+        FUNCTION_TYPE_USER_DEFINED_TABLE_FUNC,
+        BytesUtils.valueOf(FUNCTION_TYPE_USER_DEFINED_TABLE_FUNC));
+
     BINARY_MAP.put(FUNCTION_TYPE_UNKNOWN, 
BytesUtils.valueOf(FUNCTION_TYPE_UNKNOWN));
     BINARY_MAP.put(FUNCTION_STATE_AVAILABLE, 
BytesUtils.valueOf(FUNCTION_STATE_AVAILABLE));
     BINARY_MAP.put(FUNCTION_STATE_UNAVAILABLE, 
BytesUtils.valueOf(FUNCTION_STATE_UNAVAILABLE));
+
     BINARY_MAP.put("", BytesUtils.valueOf(""));
   }
 
@@ -87,6 +115,48 @@ public class ShowFunctionsTask implements IConfigTask {
   }
 
   public static void buildTsBlock(
+      Model model, List<ByteBuffer> allUDFInformation, 
SettableFuture<ConfigTaskResult> future) {
+    if (Model.TREE.equals(model)) {
+      buildTreeModelTsBlock(allUDFInformation, future);
+    } else {
+      buildTableModelTsBlock(allUDFInformation, future);
+    }
+  }
+
+  private static void buildTableModelTsBlock(
+      List<ByteBuffer> allUDFInformation, SettableFuture<ConfigTaskResult> 
future) {
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showFunctionsColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
+    List<UDFInformation> udfInformations = new ArrayList<>();
+    if (allUDFInformation != null && !allUDFInformation.isEmpty()) {
+      for (ByteBuffer udfInformationByteBuffer : allUDFInformation) {
+        UDFInformation udfInformation = 
UDFInformation.deserialize(udfInformationByteBuffer);
+        udfInformations.add(udfInformation);
+      }
+    }
+
+    
udfInformations.sort(Comparator.comparing(UDFInformation::getFunctionName));
+    for (UDFInformation udfInformation : udfInformations) {
+      appendUDFInformation(builder, udfInformation);
+    }
+    appendFunctions(
+        builder,
+        TableBuiltinScalarFunction.getNativeFunctionNames(),
+        BINARY_MAP.get(FUNCTION_TYPE_BUILTIN_SCALAR_FUNC),
+        BINARY_MAP.get(FUNCTION_STATE_AVAILABLE));
+    appendFunctions(
+        builder,
+        TableBuiltinAggregationFunction.getNativeFunctionNames(),
+        BINARY_MAP.get(FUNCTION_TYPE_BUILTIN_AGG_FUNC),
+        BINARY_MAP.get(FUNCTION_STATE_AVAILABLE));
+    DatasetHeader datasetHeader = 
DatasetHeaderFactory.getShowFunctionsHeader();
+    future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, 
builder.build(), datasetHeader));
+  }
+
+  private static void buildTreeModelTsBlock(
       List<ByteBuffer> allUDFInformation, SettableFuture<ConfigTaskResult> 
future) {
     List<TSDataType> outputDataTypes =
         ColumnHeaderConstant.showFunctionsColumnHeaders.stream()
@@ -118,10 +188,25 @@ public class ShowFunctionsTask implements IConfigTask {
     builder.getColumnBuilder(1).writeBinary(getFunctionType(udfInformation));
     
builder.getColumnBuilder(2).writeBinary(BytesUtils.valueOf(udfInformation.getClassName()));
     builder.getColumnBuilder(3).writeBinary(getFunctionState(udfInformation));
-
     builder.declarePosition();
   }
 
+  private static void appendFunctions(
+      TsBlockBuilder builder,
+      Collection<String> functionNames,
+      Binary functionType,
+      Binary functionState) {
+    final Binary className = BINARY_MAP.get("");
+    for (String functionName : functionNames) {
+      builder.getTimeColumnBuilder().writeLong(0L);
+      
builder.getColumnBuilder(0).writeBinary(BytesUtils.valueOf(functionName.toUpperCase()));
+      builder.getColumnBuilder(1).writeBinary(functionType);
+      builder.getColumnBuilder(2).writeBinary(className);
+      builder.getColumnBuilder(3).writeBinary(functionState);
+      builder.declarePosition();
+    }
+  }
+
   private static void 
appendBuiltInTimeSeriesGeneratingFunctions(TsBlockBuilder builder) {
     final Binary functionType = BINARY_MAP.get(FUNCTION_TYPE_BUILTIN_UDTF);
     final Binary functionState = BINARY_MAP.get(FUNCTION_STATE_AVAILABLE);
@@ -175,6 +260,15 @@ public class ShowFunctionsTask implements IConfigTask {
         } else if (TreeUDFUtils.isUDAF(udfInformation.getFunctionName())) {
           return BINARY_MAP.get(FUNCTION_TYPE_EXTERNAL_UDAF);
         }
+      } else {
+        if 
(TableUDFUtils.tryGetScalarFunction(udfInformation.getFunctionName()) != null) {
+          return BINARY_MAP.get(FUNCTION_TYPE_USER_DEFINED_SCALAR_FUNC);
+        } else if 
(TableUDFUtils.tryGetAggregateFunction(udfInformation.getFunctionName())
+            != null) {
+          return BINARY_MAP.get(FUNCTION_TYPE_USER_DEFINED_AGG_FUNC);
+        } else if 
(TableUDFUtils.tryGetTableFunction(udfInformation.getFunctionName()) != null) {
+          return BINARY_MAP.get(FUNCTION_TYPE_USER_DEFINED_TABLE_FUNC);
+        }
       }
     }
     return BINARY_MAP.get(FUNCTION_TYPE_UNKNOWN);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
index c079a00439a..1a7237d4989 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
@@ -166,7 +166,6 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.util.AstUtil;
 import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
 import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowStatement;
 import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowsStatement;
-import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.CreateFunctionStatement;
 import org.apache.iotdb.db.queryengine.plan.statement.sys.FlushStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.TableBuiltinScalarFunction;
@@ -584,10 +583,10 @@ public class AstBuilder extends 
RelationalSqlBaseVisitor<Node> {
     final String udfName = ((Identifier) visit(ctx.udfName)).getValue();
     final String className = ((Identifier) visit(ctx.className)).getValue();
     if (ctx.uriClause() == null) {
-      return new CreateFunction(getLocation(ctx),udfName, className);
+      return new CreateFunction(getLocation(ctx), udfName, className);
     } else {
       String uriString = parseAndValidateURI(ctx.uriClause());
-      return new CreateFunction(getLocation(ctx),udfName, className, 
uriString);
+      return new CreateFunction(getLocation(ctx), udfName, className, 
uriString);
     }
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/TableBuiltinScalarFunction.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/TableBuiltinScalarFunction.java
index c58182a3f27..237e4e4a793 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/TableBuiltinScalarFunction.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/TableBuiltinScalarFunction.java
@@ -19,6 +19,11 @@
 
 package org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar;
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 public enum TableBuiltinScalarFunction {
   DIFF("diff"),
   CAST("cast"),
@@ -70,4 +75,14 @@ public enum TableBuiltinScalarFunction {
   public String getFunctionName() {
     return functionName;
   }
+
+  private static final Set<String> NATIVE_FUNCTION_NAMES =
+      new HashSet<>(
+          Arrays.stream(TableBuiltinScalarFunction.values())
+              .map(TableBuiltinScalarFunction::getFunctionName)
+              .collect(Collectors.toList()));
+
+  public static Set<String> getNativeFunctionNames() {
+    return NATIVE_FUNCTION_NAMES;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/udf/UDTFExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/udf/UDTFExecutor.java
index a9ab775360b..f93de5c1dc4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/udf/UDTFExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/udf/UDTFExecutor.java
@@ -80,8 +80,7 @@ public class UDTFExecutor {
         configurations.getAccessStrategy().getAccessStrategyType())) {
       outputStorage =
           ElasticSerializableTVList.construct(
-              UDFDataTypeTransformer.transformToTsDataType(
-                  configurations.getOutputDataType()),
+              
UDFDataTypeTransformer.transformToTsDataType(configurations.getOutputDataType()),
               queryId,
               collectorMemoryBudgetInMB,
               1);
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
index b3de41b0664..cc6150f3400 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
@@ -178,12 +178,23 @@ public class IoTDBConstant {
 
   public static final String COLUMN_SCHEMA_TEMPLATE = "template name";
 
+  // for tree model
   public static final String FUNCTION_TYPE_NATIVE = "native";
   public static final String FUNCTION_TYPE_BUILTIN_SCALAR = "built-in scalar";
   public static final String FUNCTION_TYPE_BUILTIN_UDAF = "built-in UDAF";
   public static final String FUNCTION_TYPE_BUILTIN_UDTF = "built-in UDTF";
   public static final String FUNCTION_TYPE_EXTERNAL_UDAF = "external UDAF";
   public static final String FUNCTION_TYPE_EXTERNAL_UDTF = "external UDTF";
+  // for table model
+  public static final String FUNCTION_TYPE_BUILTIN_SCALAR_FUNC = "built-in 
scalar function";
+  public static final String FUNCTION_TYPE_BUILTIN_AGG_FUNC = "built-in 
aggregate function";
+  public static final String FUNCTION_TYPE_BUILTIN_TABLE_FUNC = "built-in 
table function";
+  public static final String FUNCTION_TYPE_USER_DEFINED_SCALAR_FUNC =
+      "user-defined scalar function";
+  public static final String FUNCTION_TYPE_USER_DEFINED_AGG_FUNC =
+      "user-defined aggregate function";
+  public static final String FUNCTION_TYPE_USER_DEFINED_TABLE_FUNC = 
"user-defined table function";
+  // common
   public static final String FUNCTION_TYPE_UNKNOWN = "UNKNOWN";
   public static final String FUNCTION_STATE_AVAILABLE = "AVAILABLE";
   public static final String FUNCTION_STATE_UNAVAILABLE = "UNAVAILABLE";
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/access/RecordIterator.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/access/RecordIterator.java
index 29f473b3c9d..49feb6d6b84 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/access/RecordIterator.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/access/RecordIterator.java
@@ -85,6 +85,11 @@ public class RecordIterator implements Iterator<Record> {
         return childrenColumns.get(columnIndex).getBinary(index).toString();
       }
 
+      @Override
+      public Object getObject(int columnIndex) throws IOException {
+        return childrenColumns.get(columnIndex).getObject(index);
+      }
+
       @Override
       public Type getDataType(int columnIndex) {
         return UDFDataTypeTransformer.transformToUDFDataType(
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFEqualSizeBucketSample.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFEqualSizeBucketSample.java
index d3492ecbe2e..306d35e110f 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFEqualSizeBucketSample.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFEqualSizeBucketSample.java
@@ -45,8 +45,7 @@ public abstract class UDTFEqualSizeBucketSample implements 
UDTF {
             "Illegal sample proportion. proportion > 0 and proportion <= 1",
             proportion);
     dataType =
-        UDFDataTypeTransformer.transformToTsDataType(
-            validator.getParameters().getDataType(0));
+        
UDFDataTypeTransformer.transformToTsDataType(validator.getParameters().getDataType(0));
     bucketSize = (int) (1 / proportion);
   }
 }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFJexl.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFJexl.java
index 404ab2f26e7..d554cfe2572 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFJexl.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFJexl.java
@@ -70,8 +70,7 @@ public class UDTFJexl implements UDTF {
 
     inputDataType = new TSDataType[inputSeriesNumber];
     for (int i = 0; i < inputSeriesNumber; i++) {
-      inputDataType[i] =
-          
UDFDataTypeTransformer.transformToTsDataType(parameters.getDataType(i));
+      inputDataType[i] = 
UDFDataTypeTransformer.transformToTsDataType(parameters.getDataType(i));
     }
     outputDataType = probeOutputDataType();
 
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFM4.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFM4.java
index ccbb2848a01..824740b8c9b 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFM4.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFM4.java
@@ -94,16 +94,14 @@ public class UDTFM4 implements UDTF {
     }
 
     dataType =
-        UDFDataTypeTransformer.transformToTsDataType(
-            validator.getParameters().getDataType(0));
+        
UDFDataTypeTransformer.transformToTsDataType(validator.getParameters().getDataType(0));
   }
 
   @Override
   public void beforeStart(UDFParameters parameters, UDTFConfigurations 
configurations)
       throws MetadataException {
     // set data type
-    configurations.setOutputDataType(
-        UDFDataTypeTransformer.transformToUDFDataType(dataType));
+    
configurations.setOutputDataType(UDFDataTypeTransformer.transformToUDFDataType(dataType));
 
     // set access strategy
     if (accessStrategy == AccessStrategy.SIZE_WINDOW) {
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFManagementService.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFManagementService.java
index aa3e512294a..bbc7e2b436e 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFManagementService.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFManagementService.java
@@ -224,10 +224,7 @@ public class UDFManagementService {
 
     try {
       return clazz.cast(
-          udfTable
-              .getFunctionClass(Model.TREE, functionName)
-              .getDeclaredConstructor()
-              .newInstance());
+          udfTable.getFunctionClass(model, 
functionName).getDeclaredConstructor().newInstance());
     } catch (InstantiationException
         | InvocationTargetException
         | NoSuchMethodException

Reply via email to