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 7fe6faf0c5 [Improve][Transform][SQL] Support cast to TINYINT/SMALLINT 
(#9347)
7fe6faf0c5 is described below

commit 7fe6faf0c5f7e7f0dd3efd77a07e4cedbffd9ba5
Author: hailin0 <[email protected]>
AuthorDate: Thu Jun 5 09:33:50 2025 +0800

    [Improve][Transform][SQL] Support cast to TINYINT/SMALLINT (#9347)
---
 docs/en/transform-v2/sql-functions.md              |  4 +-
 docs/zh/transform-v2/sql-functions.md              |  4 +-
 .../seatunnel/transform/sql/zeta/ZetaSQLType.java  |  6 +++
 .../sql/zeta/functions/SystemFunction.java         |  4 ++
 .../transform/sql/zeta/CastFunctionTest.java       | 57 ++++++++++++++++++++++
 5 files changed, 71 insertions(+), 4 deletions(-)

diff --git a/docs/en/transform-v2/sql-functions.md 
b/docs/en/transform-v2/sql-functions.md
index e92913c3d0..dd7bdd2b46 100644
--- a/docs/en/transform-v2/sql-functions.md
+++ b/docs/en/transform-v2/sql-functions.md
@@ -961,7 +961,7 @@ CALL FROM_UNIXTIME(1672502400, 'yyyy-MM-dd 
HH:mm:ss','UTC+6')
 
 Converts a value to another data type.
 
-Supported data types: STRING | VARCHAR, INT | INTEGER, LONG | BIGINT, BYTE, 
FLOAT, DOUBLE, DECIMAL(p,s), TIMESTAMP, DATE, TIME, BYTES, BOOLEAN
+Supported data types: STRING | VARCHAR, TINYINT, SMALLINT, INT | INTEGER, LONG 
| BIGINT, BYTE, FLOAT, DOUBLE, DECIMAL(p,s), TIMESTAMP, DATE, TIME, BYTES, 
BOOLEAN
 
 Example:
 * CAST(NAME AS INT)
@@ -979,7 +979,7 @@ Converts a value to a BOOLEAN data type according to the 
following rules:
 
 This function is similar to CAST, but when the conversion fails, it returns 
NULL instead of throwing an exception.
 
-Supported data types: STRING | VARCHAR, INT | INTEGER, LONG | BIGINT, BYTE, 
FLOAT, DOUBLE, DECIMAL(p,s), TIMESTAMP, DATE, TIME, BYTES
+Supported data types: STRING | VARCHAR, TINYINT, SMALLINT, INT | INTEGER, LONG 
| BIGINT, BYTE, FLOAT, DOUBLE, DECIMAL(p,s), TIMESTAMP, DATE, TIME, BYTES
 
 Example:
 
diff --git a/docs/zh/transform-v2/sql-functions.md 
b/docs/zh/transform-v2/sql-functions.md
index 46107f8112..561fceba38 100644
--- a/docs/zh/transform-v2/sql-functions.md
+++ b/docs/zh/transform-v2/sql-functions.md
@@ -954,7 +954,7 @@ CALL FROM_UNIXTIME(1672502400, 'yyyy-MM-dd 
HH:mm:ss','UTC+6')
 
 将一个值转换为另一个数据类型。
 
-支持的数据类型有:STRING | VARCHAR,INT | INTEGER,LONG | 
BIGINT,BYTE,FLOAT,DOUBLE,DECIMAL(p,s),TIMESTAMP,DATE,TIME,BYTES
+支持的数据类型有:STRING | VARCHAR,TINYINT,SMALLINT,INT | INTEGER,LONG | 
BIGINT,BYTE,FLOAT,DOUBLE,DECIMAL(p,s),TIMESTAMP,DATE,TIME,BYTES
 
 示例:
 
@@ -974,7 +974,7 @@ CAST(FLAG AS BOOLEAN)
 
 该函数类似于 CAST,但当转换失败时,它返回 NULL 而不是抛出异常。
 
-支持的数据类型有:STRING | VARCHAR,INT | INTEGER,LONG | 
BIGINT,BYTE,FLOAT,DOUBLE,DECIMAL(p,s),TIMESTAMP,DATE,TIME,BYTES
+支持的数据类型有:STRING | VARCHAR,TINYINT,SMALLINT,INT | INTEGER,LONG | 
BIGINT,BYTE,FLOAT,DOUBLE,DECIMAL(p,s),TIMESTAMP,DATE,TIME,BYTES
 
 示例:
 
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 6c402247d1..82031dd1e5 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
@@ -68,6 +68,8 @@ public class ZetaSQLType {
     public static final String DECIMAL = "DECIMAL";
     public static final String VARCHAR = "VARCHAR";
     public static final String STRING = "STRING";
+    public static final String TINYINT = "TINYINT";
+    public static final String SMALLINT = "SMALLINT";
     public static final String INT = "INT";
     public static final String INTEGER = "INTEGER";
     public static final String BIGINT = "BIGINT";
@@ -335,6 +337,10 @@ public class ZetaSQLType {
             case VARCHAR:
             case STRING:
                 return BasicType.STRING_TYPE;
+            case TINYINT:
+                return BasicType.BYTE_TYPE;
+            case SMALLINT:
+                return BasicType.SHORT_TYPE;
             case INT:
             case INTEGER:
                 return BasicType.INT_TYPE;
diff --git 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/SystemFunction.java
 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/SystemFunction.java
index 579d91ce17..c7b79b9baf 100644
--- 
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/SystemFunction.java
+++ 
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/SystemFunction.java
@@ -103,6 +103,10 @@ public class SystemFunction {
             case "VARCHAR":
             case "STRING":
                 return v1.toString();
+            case "TINYINT":
+                return Byte.parseByte(v1.toString());
+            case "SMALLINT":
+                return Short.parseShort(v1.toString());
             case "INT":
             case "INTEGER":
                 return Integer.parseInt(v1.toString());
diff --git 
a/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/zeta/CastFunctionTest.java
 
b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/zeta/CastFunctionTest.java
new file mode 100644
index 0000000000..b5c5ae377e
--- /dev/null
+++ 
b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/zeta/CastFunctionTest.java
@@ -0,0 +1,57 @@
+/*
+ * 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.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.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class CastFunctionTest {
+
+    @Test
+    public void testCastFunction() {
+
+        SQLEngine sqlEngine = 
SQLEngineFactory.getSQLEngine(SQLEngineFactory.EngineType.ZETA);
+
+        SeaTunnelRowType rowType =
+                new SeaTunnelRowType(
+                        new String[] {"f1"}, new SeaTunnelDataType[] 
{BasicType.STRING_TYPE});
+
+        String f1 = "1";
+        SeaTunnelRow inputRow = new SeaTunnelRow(new Object[] {f1});
+
+        sqlEngine.init(
+                "test",
+                null,
+                rowType,
+                "select f1, cast(f1 as TINYINT) as f2, cast(f1 as SMALLINT) as 
f3 from test");
+        SeaTunnelRow outRow = sqlEngine.transformBySQL(inputRow, 
rowType).get(0);
+        Object f1Object = outRow.getField(0);
+        Object f2Object = outRow.getField(1);
+        Object f3Object = outRow.getField(2);
+        Assertions.assertEquals("1", f1Object);
+        Assertions.assertEquals(Byte.parseByte("1"), f2Object);
+        Assertions.assertEquals(Short.parseShort("1"), f3Object);
+    }
+}

Reply via email to