Skip to content

Commit f41e882

Browse files
authored
[Improve][Sql] Support boolean fields in case-when condition clauses (#9073)
1 parent ed14215 commit f41e882

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

Diff for: docs/en/transform-v2/sql-functions.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -991,7 +991,11 @@ select
991991
case
992992
when c_tinyint <> 117 then 1
993993
else 0
994-
end as c_number_0
994+
end as c_number_0,
995+
case
996+
when c_boolean then 1
997+
else 0
998+
end as c_boolean_0
995999
from
9961000
dual
9971001
```

Diff for: seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFilter.java

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
4040
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
4141
import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
42+
import net.sf.jsqlparser.schema.Column;
4243

4344
import java.time.LocalDate;
4445
import java.time.LocalDateTime;
@@ -114,6 +115,9 @@ public boolean executeFilter(Expression whereExpr, Object[] inputFields) {
114115
if (whereExpr instanceof Parenthesis) {
115116
return parenthesisExpr((Parenthesis) whereExpr, inputFields);
116117
}
118+
if (whereExpr instanceof Column) {
119+
return (boolean) zetaSQLFunction.computeForValue(whereExpr, inputFields);
120+
}
117121
throw new TransformException(
118122
CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION,
119123
String.format("Unsupported SQL Expression: %s ", whereExpr));

Diff for: seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/SQLTransformTest.java

+33
Original file line numberDiff line numberDiff line change
@@ -282,4 +282,37 @@ public void testEscapeIdentifier() {
282282
BasicType.STRING_TYPE, tableSchema.getColumns().get(1).getDataType());
283283
Assertions.assertEquals("a", result.get(0).getField(1));
284284
}
285+
286+
@Test
287+
public void tesCaseWhenClausesWithBooleanField() {
288+
String tableName = "test";
289+
String[] fields = new String[] {"id", "bool"};
290+
CatalogTable table =
291+
CatalogTableUtil.getCatalogTable(
292+
tableName,
293+
new SeaTunnelRowType(
294+
fields,
295+
new SeaTunnelDataType[] {
296+
BasicType.INT_TYPE, BasicType.BOOLEAN_TYPE
297+
}));
298+
ReadonlyConfig config =
299+
ReadonlyConfig.fromMap(
300+
Collections.singletonMap(
301+
"query",
302+
"select `id`, `bool`, case when bool then 1 else 2 end as bool_1 from dual"));
303+
SQLTransform sqlTransform = new SQLTransform(config, table);
304+
List<SeaTunnelRow> result =
305+
sqlTransform.transformRow(
306+
new SeaTunnelRow(new Object[] {Integer.valueOf(1), true}));
307+
Assertions.assertEquals(1, result.get(0).getField(0));
308+
Assertions.assertEquals(true, result.get(0).getField(1));
309+
Assertions.assertEquals(1, result.get(0).getField(2));
310+
311+
result =
312+
sqlTransform.transformRow(
313+
new SeaTunnelRow(new Object[] {Integer.valueOf(1), false}));
314+
Assertions.assertEquals(1, result.get(0).getField(0));
315+
Assertions.assertEquals(false, result.get(0).getField(1));
316+
Assertions.assertEquals(2, result.get(0).getField(2));
317+
}
285318
}

0 commit comments

Comments
 (0)