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

corgy pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git


The following commit(s) were added to refs/heads/dev by this push:
     new d3571e3541 [Feature][Transform-V2] Add `TRIM_SCALE` function for sql 
transform (#9700)
d3571e3541 is described below

commit d3571e354100d573aca02a8783feebe14889d2a9
Author: Jia Fan <[email protected]>
AuthorDate: Fri Aug 15 18:15:19 2025 +0800

    [Feature][Transform-V2] Add `TRIM_SCALE` function for sql transform (#9700)
---
 docs/en/transform-v2/sql-functions.md              | 10 +++
 docs/zh/transform-v2/sql-functions.md              | 10 +++
 .../transform/sql/zeta/ZetaSQLFunction.java        |  3 +
 .../seatunnel/transform/sql/zeta/ZetaSQLType.java  |  1 +
 .../sql/zeta/functions/NumericFunction.java        | 15 ++++
 .../transform/sql/zeta/NumericFunctionTest.java    | 81 ++++++++++++++++++++++
 6 files changed, 120 insertions(+)

diff --git a/docs/en/transform-v2/sql-functions.md 
b/docs/en/transform-v2/sql-functions.md
index 1c580097e0..0e659688c8 100644
--- a/docs/en/transform-v2/sql-functions.md
+++ b/docs/en/transform-v2/sql-functions.md
@@ -647,6 +647,16 @@ Example:
 
 TRUNC(N, 2)
 
+### TRIM_SCALE
+
+```TRIM_SCALE(numeric)```
+
+Reduce the scale of a number by removing trailing zeroes. This method returns 
a value of string, and with adjusted scale.
+
+Example:
+
+TRIM_SCALE(N)
+
 ## Time and Date Functions
 
 ### CURRENT_DATE
diff --git a/docs/zh/transform-v2/sql-functions.md 
b/docs/zh/transform-v2/sql-functions.md
index ca8aaf5c2a..add6809b5a 100644
--- a/docs/zh/transform-v2/sql-functions.md
+++ b/docs/zh/transform-v2/sql-functions.md
@@ -649,6 +649,16 @@ SIGN(N)
 
 TRUNC(N, 2)
 
+### TRIM_SCALE
+
+```TRIM_SCALE(numeric)```
+
+通过删除尾数部分的零来降低值的刻度(小数位数)。此方法返回一个字符串值,并调整小数位数。
+
+示例:
+
+TRIM_SCALE(N)
+
 ## Time and Date Functions
 
 ### CURRENT_DATE
diff --git 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java
 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java
index 6d55b74d7b..af01127cd7 100644
--- 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java
+++ 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java
@@ -155,6 +155,7 @@ public class ZetaSQLFunction {
     public static final String TRUNCATE = "TRUNCATE";
     public static final String ARRAY_MAX = "ARRAY_MAX";
     public static final String ARRAY_MIN = "ARRAY_MIN";
+    public static final String TRIM_SCALE = "TRIM_SCALE";
 
     // -------------------------time and date 
functions----------------------------
     public static final String CURRENT_DATE = "CURRENT_DATE";
@@ -532,6 +533,8 @@ public class ZetaSQLFunction {
             case TRUNC:
             case TRUNCATE:
                 return NumericFunction.trunc(args);
+            case TRIM_SCALE:
+                return NumericFunction.trimScale(args);
             case NOW:
                 return DateTimeFunction.currentTimestamp();
             case DATEADD:
diff --git 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java
 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java
index bf40565aa8..62fdd97dc7 100644
--- 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java
+++ 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java
@@ -347,6 +347,7 @@ public class ZetaSQLType {
             case ZetaSQLFunction.FORMATDATETIME:
             case ZetaSQLFunction.FROM_UNIXTIME:
             case ZetaSQLFunction.UUID:
+            case ZetaSQLFunction.TRIM_SCALE:
                 return BasicType.STRING_TYPE;
             case ZetaSQLFunction.ASCII:
             case ZetaSQLFunction.LOCATE:
diff --git 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/NumericFunction.java
 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/NumericFunction.java
index 055116430c..64e1c20d60 100644
--- 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/NumericFunction.java
+++ 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/NumericFunction.java
@@ -443,4 +443,19 @@ public class NumericFunction {
         }
         return round(v1, v2, RoundingMode.DOWN);
     }
+
+    public static String trimScale(List<Object> args) {
+        Number v1 = (Number) args.get(0);
+        if (v1 == null) {
+            return null;
+        }
+        BigDecimal bd;
+        if (v1 instanceof BigDecimal) {
+            bd = (BigDecimal) v1;
+        } else {
+            bd = new BigDecimal(v1.toString());
+        }
+        bd = bd.stripTrailingZeros();
+        return bd.toPlainString();
+    }
 }
diff --git 
a/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/zeta/NumericFunctionTest.java
 
b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/zeta/NumericFunctionTest.java
new file mode 100644
index 0000000000..bf60b0aa57
--- /dev/null
+++ 
b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/zeta/NumericFunctionTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.seatunnel.transform.sql.zeta;
+
+import org.apache.seatunnel.api.table.type.BasicType;
+import org.apache.seatunnel.api.table.type.DecimalType;
+import org.apache.seatunnel.api.table.type.SeaTunnelDataType;
+import org.apache.seatunnel.api.table.type.SeaTunnelRow;
+import org.apache.seatunnel.api.table.type.SeaTunnelRowType;
+import org.apache.seatunnel.transform.sql.SQLEngine;
+import org.apache.seatunnel.transform.sql.SQLEngineFactory;
+import org.apache.seatunnel.transform.sql.zeta.functions.NumericFunction;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+
+public class NumericFunctionTest {
+
+    @Test
+    public void testTrimScale() {
+
+        SQLEngine sqlEngine = 
SQLEngineFactory.getSQLEngine(SQLEngineFactory.EngineType.ZETA);
+        SeaTunnelRowType rowType =
+                new SeaTunnelRowType(
+                        new String[] {"int_v", "long_v", "float_v", 
"double_v", "decimal_v"},
+                        new SeaTunnelDataType[] {
+                            BasicType.INT_TYPE,
+                            BasicType.LONG_TYPE,
+                            BasicType.FLOAT_TYPE,
+                            BasicType.DOUBLE_TYPE,
+                            new DecimalType(20, 10)
+                        });
+
+        SeaTunnelRow inputRow =
+                new SeaTunnelRow(
+                        new Object[] {20, -99L, 1.20f, 1.230d, new 
BigDecimal("1.0000010000")});
+
+        sqlEngine.init(
+                "test",
+                null,
+                rowType,
+                "select TRIM_SCALE(int_v) as new_int_v, TRIM_SCALE(long_v) as 
new_long_v, TRIM_SCALE(float_v) as new_float_v, TRIM_SCALE(double_v) as 
new_double_v, TRIM_SCALE(decimal_v) as new_decimal_v from test");
+        SeaTunnelRow outRow = sqlEngine.transformBySQL(inputRow, 
rowType).get(0);
+        Assertions.assertEquals("20", outRow.getField(0));
+        Assertions.assertEquals("-99", outRow.getField(1));
+        Assertions.assertEquals("1.2", outRow.getField(2));
+        Assertions.assertEquals("1.23", outRow.getField(3));
+        Assertions.assertEquals("1.000001", outRow.getField(4));
+
+        Assertions.assertEquals("123", 
NumericFunction.trimScale(Collections.singletonList(123)));
+        Assertions.assertEquals(
+                "123.45", 
NumericFunction.trimScale(Collections.singletonList(123.45000)));
+        Assertions.assertEquals(
+                "123", 
NumericFunction.trimScale(Collections.singletonList(123.0000)));
+        Assertions.assertEquals(
+                "-123.4", 
NumericFunction.trimScale(Collections.singletonList(-123.4000)));
+        Assertions.assertEquals(
+                "0.1",
+                NumericFunction.trimScale(Collections.singletonList(new 
BigDecimal("0.1000"))));
+        Assertions.assertEquals("0", 
NumericFunction.trimScale(Collections.singletonList(0)));
+        
Assertions.assertNull(NumericFunction.trimScale(Collections.singletonList((Object)
 null)));
+    }
+}

Reply via email to