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 <wanghai...@apache.org> 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)); + } }