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);
+ }
+}