Skip to content

Commit 721af2a

Browse files
committed
[FLINK-38565][table] Reduce TRY_CAST chain if source and target types are same
1 parent 5e45679 commit 721af2a

File tree

3 files changed

+93
-1
lines changed

3 files changed

+93
-1
lines changed

flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/calcite/FlinkConvertletTable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ private RexNode convertTryCast(SqlRexContext cx, final SqlCall call) {
101101
}
102102
type = typeFactory.createTypeWithNullability(type, true);
103103

104-
if (SqlUtil.isNullLiteral(leftNode, false)) {
104+
if (SqlUtil.isNullLiteral(leftNode, false) || type.equals(valueRex.getType())) {
105105
final SqlValidatorImpl validator = (SqlValidatorImpl) cx.getValidator();
106106
validator.setValidatedNodeType(leftNode, type);
107107
return cx.convertExpression(leftNode);

flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/stream/sql/CalcTest.xml

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,74 @@ LogicalProject(EXPR$0=[ROW(1, _UTF-16LE'Hi', $0)])
532532
<![CDATA[
533533
Calc(select=[ROW(1, 'Hi', a) AS EXPR$0])
534534
+- TableSourceScan(table=[[default_catalog, default_database, MyTable]], fields=[a, b, c])
535+
]]>
536+
</Resource>
537+
</TestCase>
538+
<TestCase name="testRepeatedTryCast">
539+
<Resource name="sql">
540+
<![CDATA[SELECT TRY_CAST(TRY_CAST(a AS STRING) AS STRING) FROM MyTable]]>
541+
</Resource>
542+
<Resource name="ast">
543+
<![CDATA[
544+
LogicalProject(EXPR$0=[TRY_CAST($0)])
545+
+- LogicalTableScan(table=[[default_catalog, default_database, MyTable]])
546+
]]>
547+
</Resource>
548+
<Resource name="optimized exec plan">
549+
<![CDATA[
550+
Calc(select=[TRY_CAST(a AS VARCHAR(2147483647)) AS EXPR$0])
551+
+- TableSourceScan(table=[[default_catalog, default_database, MyTable]], fields=[a, b, c])
552+
]]>
553+
</Resource>
554+
</TestCase>
555+
<TestCase name="testRepeatedTryCastAfterCast">
556+
<Resource name="sql">
557+
<![CDATA[SELECT TRY_CAST(CAST(a AS STRING) AS STRING) FROM MyTable]]>
558+
</Resource>
559+
<Resource name="ast">
560+
<![CDATA[
561+
LogicalProject(EXPR$0=[CAST($0):VARCHAR(2147483647) CHARACTER SET "UTF-16LE"])
562+
+- LogicalTableScan(table=[[default_catalog, default_database, MyTable]])
563+
]]>
564+
</Resource>
565+
<Resource name="optimized exec plan">
566+
<![CDATA[
567+
Calc(select=[CAST(a AS VARCHAR(2147483647)) AS EXPR$0])
568+
+- TableSourceScan(table=[[default_catalog, default_database, MyTable]], fields=[a, b, c])
569+
]]>
570+
</Resource>
571+
</TestCase>
572+
<TestCase name="testRepeatedTryCastSameType">
573+
<Resource name="sql">
574+
<![CDATA[SELECT TRY_CAST(a AS BIGINT) FROM MyTable]]>
575+
</Resource>
576+
<Resource name="ast">
577+
<![CDATA[
578+
LogicalProject(EXPR$0=[$0])
579+
+- LogicalTableScan(table=[[default_catalog, default_database, MyTable]])
580+
]]>
581+
</Resource>
582+
<Resource name="optimized exec plan">
583+
<![CDATA[
584+
Calc(select=[a AS EXPR$0])
585+
+- TableSourceScan(table=[[default_catalog, default_database, MyTable]], fields=[a, b, c])
586+
]]>
587+
</Resource>
588+
</TestCase>
589+
<TestCase name="testRepeatedTryCastDifferentType">
590+
<Resource name="sql">
591+
<![CDATA[SELECT TRY_CAST(TRY_CAST(a AS STRING) AS INTEGER) FROM MyTable]]>
592+
</Resource>
593+
<Resource name="ast">
594+
<![CDATA[
595+
LogicalProject(EXPR$0=[TRY_CAST(TRY_CAST($0))])
596+
+- LogicalTableScan(table=[[default_catalog, default_database, MyTable]])
597+
]]>
598+
</Resource>
599+
<Resource name="optimized exec plan">
600+
<![CDATA[
601+
Calc(select=[TRY_CAST(TRY_CAST(a AS VARCHAR(2147483647)) AS INTEGER) AS EXPR$0])
602+
+- TableSourceScan(table=[[default_catalog, default_database, MyTable]], fields=[a, b, c])
535603
]]>
536604
</Resource>
537605
</TestCase>

flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/plan/stream/sql/CalcTest.scala

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,4 +230,28 @@ class CalcTest extends TableTestBase {
230230
|SELECT my_row = ROW(1, 'str') from src
231231
|""".stripMargin)
232232
}
233+
234+
@Test
235+
def testRepeatedTryCast(): Unit = {
236+
val sqlQuery = "SELECT TRY_CAST(TRY_CAST(a AS STRING) AS STRING) FROM MyTable"
237+
util.verifyExecPlan(sqlQuery)
238+
}
239+
240+
@Test
241+
def testRepeatedTryCastAfterCast(): Unit = {
242+
val sqlQuery = "SELECT TRY_CAST(CAST(a AS STRING) AS STRING) FROM MyTable"
243+
util.verifyExecPlan(sqlQuery)
244+
}
245+
246+
@Test
247+
def testRepeatedTryCastSameType(): Unit = {
248+
val sqlQuery = "SELECT TRY_CAST(a AS BIGINT) FROM MyTable"
249+
util.verifyExecPlan(sqlQuery)
250+
}
251+
252+
@Test
253+
def testRepeatedTryCastDifferentType(): Unit = {
254+
val sqlQuery = "SELECT TRY_CAST(TRY_CAST(a AS STRING) AS INTEGER) FROM MyTable"
255+
util.verifyExecPlan(sqlQuery)
256+
}
233257
}

0 commit comments

Comments
 (0)