This is an automated email from the ASF dual-hosted git repository.
wanghailin 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 f41e882a22 [Improve][Sql] Support boolean fields in case-when
condition clauses (#9073)
f41e882a22 is described below
commit f41e882a22564fcc56bd28a1dc5967dcd380db7e
Author: hailin0 <[email protected]>
AuthorDate: Sat Mar 29 10:07:11 2025 +0800
[Improve][Sql] Support boolean fields in case-when condition clauses (#9073)
---
docs/en/transform-v2/sql-functions.md | 6 +++-
.../transform/sql/zeta/ZetaSQLFilter.java | 4 +++
.../seatunnel/transform/sql/SQLTransformTest.java | 33 ++++++++++++++++++++++
3 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/docs/en/transform-v2/sql-functions.md
b/docs/en/transform-v2/sql-functions.md
index 48a3112e4b..3d79ebbccc 100644
--- a/docs/en/transform-v2/sql-functions.md
+++ b/docs/en/transform-v2/sql-functions.md
@@ -991,7 +991,11 @@ select
case
when c_tinyint <> 117 then 1
else 0
- end as c_number_0
+ end as c_number_0,
+ case
+ when c_boolean then 1
+ else 0
+ end as c_boolean_0
from
dual
```
diff --git
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFilter.java
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFilter.java
index 7e84093bf4..0a0293ee14 100644
---
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFilter.java
+++
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFilter.java
@@ -39,6 +39,7 @@ import
net.sf.jsqlparser.expression.operators.relational.MinorThan;
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
import
net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
+import net.sf.jsqlparser.schema.Column;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -114,6 +115,9 @@ public class ZetaSQLFilter {
if (whereExpr instanceof Parenthesis) {
return parenthesisExpr((Parenthesis) whereExpr, inputFields);
}
+ if (whereExpr instanceof Column) {
+ return (boolean) zetaSQLFunction.computeForValue(whereExpr,
inputFields);
+ }
throw new TransformException(
CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION,
String.format("Unsupported SQL Expression: %s ", whereExpr));
diff --git
a/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/SQLTransformTest.java
b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/SQLTransformTest.java
index 2d48f7b28a..2bf47c36c2 100644
---
a/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/SQLTransformTest.java
+++
b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/SQLTransformTest.java
@@ -282,4 +282,37 @@ public class SQLTransformTest {
BasicType.STRING_TYPE,
tableSchema.getColumns().get(1).getDataType());
Assertions.assertEquals("a", result.get(0).getField(1));
}
+
+ @Test
+ public void tesCaseWhenClausesWithBooleanField() {
+ String tableName = "test";
+ String[] fields = new String[] {"id", "bool"};
+ CatalogTable table =
+ CatalogTableUtil.getCatalogTable(
+ tableName,
+ new SeaTunnelRowType(
+ fields,
+ new SeaTunnelDataType[] {
+ BasicType.INT_TYPE, BasicType.BOOLEAN_TYPE
+ }));
+ ReadonlyConfig config =
+ ReadonlyConfig.fromMap(
+ Collections.singletonMap(
+ "query",
+ "select `id`, `bool`, case when bool then 1
else 2 end as bool_1 from dual"));
+ SQLTransform sqlTransform = new SQLTransform(config, table);
+ List<SeaTunnelRow> result =
+ sqlTransform.transformRow(
+ new SeaTunnelRow(new Object[] {Integer.valueOf(1),
true}));
+ Assertions.assertEquals(1, result.get(0).getField(0));
+ Assertions.assertEquals(true, result.get(0).getField(1));
+ Assertions.assertEquals(1, result.get(0).getField(2));
+
+ result =
+ sqlTransform.transformRow(
+ new SeaTunnelRow(new Object[] {Integer.valueOf(1),
false}));
+ Assertions.assertEquals(1, result.get(0).getField(0));
+ Assertions.assertEquals(false, result.get(0).getField(1));
+ Assertions.assertEquals(2, result.get(0).getField(2));
+ }
}