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

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


The following commit(s) were added to refs/heads/rel/1.1 by this push:
     new 16e96283dd7 [To rel/1.1] Override existing jar instead of deleting it 
when registering UDF
16e96283dd7 is described below

commit 16e96283dd7d4ffc67fb6f4f5f9225ffb3a89c8e
Author: Liao Lanyu <[email protected]>
AuthorDate: Sat Aug 19 11:08:20 2023 +0800

    [To rel/1.1] Override existing jar instead of deleting it when registering 
UDF
---
 .../iotdb/db/it/udf/IoTDBUDFManagementIT.java      | 48 ++++++++++++++++++++--
 .../commons/executable/ExecutableManager.java      | 11 ++++-
 2 files changed, 53 insertions(+), 6 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDFManagementIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDFManagementIT.java
index 2362af361fb..752e17e3ef8 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDFManagementIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDFManagementIT.java
@@ -32,6 +32,7 @@ import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.junit.runner.RunWith;
 
+import java.io.File;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -54,6 +55,16 @@ public class IoTDBUDFManagementIT {
   private static final String FUNCTION_TYPE_BUILTIN_UDTF = "built-in UDTF";
   private static final String FUNCTION_TYPE_EXTERNAL_UDTF = "external UDTF";
 
+  private static final String UDF_LIB_PREFIX =
+      System.getProperty("user.dir")
+          + File.separator
+          + "target"
+          + File.separator
+          + "test-classes"
+          + File.separator;
+
+  private static final String UDF_JAR_PREFIX = new 
File(UDF_LIB_PREFIX).toURI().toString();
+
   @Before
   public void setUp() throws Exception {
     EnvFactory.getEnv().initClusterEnvironment();
@@ -208,6 +219,35 @@ public class IoTDBUDFManagementIT {
     }
   }
 
+  @Test
+  public void testCreateFunctionWithURI() throws SQLException {
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(
+          String.format(
+              "create function udf as 
'org.apache.iotdb.db.query.udf.example.Adder' using URI '%s'",
+              UDF_JAR_PREFIX + "udf-example.jar"));
+
+      statement.execute(
+          String.format(
+              "create function udf1 as 
'org.apache.iotdb.db.query.udf.example.Adder' using URI '%s'",
+              UDF_JAR_PREFIX + "udf-example.jar"));
+
+      try (ResultSet resultSet = statement.executeQuery("show functions")) {
+        int count = 0;
+        while (resultSet.next()) {
+          ++count;
+        }
+        Assert.assertEquals(2 + NATIVE_FUNCTIONS_COUNT + 
BUILTIN_FUNCTIONS_COUNT, count);
+        assertEquals(3, resultSet.getMetaData().getColumnCount());
+        statement.execute("drop function udf");
+        statement.execute("drop function udf1");
+      } catch (Exception e) {
+        fail();
+      }
+    }
+  }
+
   @Test
   public void testCreateFunctionWithInvalidURI() {
     try (Connection connection = EnvFactory.getEnv().getConnection();
@@ -215,8 +255,8 @@ public class IoTDBUDFManagementIT {
       try {
         statement.execute(
             String.format(
-                "create stateless trigger %s before insert on 
root.test.stateless.* as '%s' using URI '%s' with (\"name\"=\"%s\")",
-                "a", "org.apache.iotdb.test", "", "test"));
+                "create function udf as 
'org.apache.iotdb.db.query.udf.example.Adder' using URI '%s'",
+                ""));
         fail();
       } catch (Exception e) {
         assertTrue(e.getMessage().contains("URI"));
@@ -225,8 +265,8 @@ public class IoTDBUDFManagementIT {
       try {
         statement.execute(
             String.format(
-                "create stateless trigger %s before insert on 
root.test.stateless.* as '%s' using URI '%s' with (\"name\"=\"%s\")",
-                "a", "org.apache.iotdb.test", 
"file:///data/udf/upload-test.jar", "test"));
+                "create function udf as 
'org.apache.iotdb.db.query.udf.example.Adder' using URI '%s'",
+                "file:///data/udf/upload-test.jar"));
         fail();
       } catch (Exception e) {
         assertTrue(e.getMessage().contains("URI"));
diff --git 
a/node-commons/src/main/java/org/apache/iotdb/commons/executable/ExecutableManager.java
 
b/node-commons/src/main/java/org/apache/iotdb/commons/executable/ExecutableManager.java
index 0f195086230..4a730d2a5fa 100644
--- 
a/node-commons/src/main/java/org/apache/iotdb/commons/executable/ExecutableManager.java
+++ 
b/node-commons/src/main/java/org/apache/iotdb/commons/executable/ExecutableManager.java
@@ -223,11 +223,18 @@ public class ExecutableManager {
     }
   }
 
+  /**
+   * Create and save the file if the specified file does not exist, or this 
method will override the
+   * existing file.
+   */
   protected void saveToDir(ByteBuffer byteBuffer, String destination) throws 
IOException {
     try {
       Path path = Paths.get(destination);
-      Files.deleteIfExists(path);
-      Files.createFile(path);
+      if (!Files.exists(path)) {
+        Files.createFile(path);
+      }
+      // FileOutPutStream is not in append mode by default, so the file will 
be overridden if it
+      // already exists.
       try (FileOutputStream outputStream = new FileOutputStream(destination)) {
         outputStream.getChannel().write(byteBuffer);
       }

Reply via email to