This is an automated email from the ASF dual-hosted git repository. AHeise pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/flink.git
commit 6eb7720a3d09ce162606d26e6de7f00e5c943089 Author: Ramin Gharib <[email protected]> AuthorDate: Mon May 18 14:53:25 2026 +0200 [FLINK-39650][table] Route REGEXP_REPLACE through BridgingSqlFunction Migrates REGEXP_REPLACE to the modern BuiltInFunctionDefinition stack while keeping the existing StringCallGen codegen path. The function definition is renamed to name("REGEXP_REPLACE") (CoreModule looks up by name().toUpperCase(), so the previous "regexpReplace" key did not match SQL) and marked runtimeProvided() so it is exposed to both SQL and Table API conversion. A new arm in ExprCodeGenerator's BridgingSqlFunction block routes the BridgingSqlFunction to StringCallGen.generateRegexpReplace. The legacy FlinkSqlOperatorTable.REGEXP_REPLACE entry, the DirectConvertRule mapping, and the case REGEXP_REPLACE arm in StringCallGen are removed. Behavior is preserved: same arg types, same codegen call, same runtime helper. Only the registration path changes. --- flink-python/pyflink/table/tests/test_expression.py | 2 +- .../flink/table/functions/BuiltInFunctionDefinitions.java | 4 ++-- .../planner/expressions/converter/DirectConvertRule.java | 2 -- .../table/planner/functions/sql/FlinkSqlOperatorTable.java | 14 -------------- .../flink/table/planner/codegen/ExprCodeGenerator.scala | 3 +++ .../flink/table/planner/codegen/calls/StringCallGen.scala | 2 -- 6 files changed, 6 insertions(+), 21 deletions(-) diff --git a/flink-python/pyflink/table/tests/test_expression.py b/flink-python/pyflink/table/tests/test_expression.py index 47486894fb2..e3681e0a184 100644 --- a/flink-python/pyflink/table/tests/test_expression.py +++ b/flink-python/pyflink/table/tests/test_expression.py @@ -199,7 +199,7 @@ class PyFlinkBatchExpressionTests(PyFlinkTestCase): self.assertEqual('REGEXP_EXTRACT(a, b, 3)', str(expr1.regexp_extract(expr2, 3))) self.assertEqual('REGEXP_EXTRACT_ALL(a, b)', str(expr1.regexp_extract_all(expr2))) self.assertEqual('REGEXP_EXTRACT_ALL(a, b, 3)', str(expr1.regexp_extract_all(expr2, 3))) - self.assertEqual("regexpReplace(a, b, 'abc')", str(expr1.regexp_replace(expr2, 'abc'))) + self.assertEqual("REGEXP_REPLACE(a, b, 'abc')", str(expr1.regexp_replace(expr2, 'abc'))) self.assertEqual("REGEXP_INSTR(a, b)", str(expr1.regexp_instr(expr2))) self.assertEqual("REGEXP_SUBSTR(a, b)", str(expr1.regexp_substr(expr2))) diff --git a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/functions/BuiltInFunctionDefinitions.java b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/functions/BuiltInFunctionDefinitions.java index 6d17bf880e8..cbf39763cdb 100644 --- a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/functions/BuiltInFunctionDefinitions.java +++ b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/functions/BuiltInFunctionDefinitions.java @@ -1678,8 +1678,7 @@ public final class BuiltInFunctionDefinitions { public static final BuiltInFunctionDefinition REGEXP_REPLACE = BuiltInFunctionDefinition.newBuilder() - .name("regexpReplace") - .sqlName("REGEXP_REPLACE") + .name("REGEXP_REPLACE") .kind(SCALAR) .inputTypeStrategy( sequence( @@ -1687,6 +1686,7 @@ public final class BuiltInFunctionDefinitions { logical(LogicalTypeFamily.CHARACTER_STRING), logical(LogicalTypeFamily.CHARACTER_STRING))) .outputTypeStrategy(nullableIfArgs(explicit(DataTypes.STRING()))) + .runtimeProvided() .build(); public static final BuiltInFunctionDefinition REVERSE = diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/expressions/converter/DirectConvertRule.java b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/expressions/converter/DirectConvertRule.java index c8ee1cede21..a2d4f8b0df0 100644 --- a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/expressions/converter/DirectConvertRule.java +++ b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/expressions/converter/DirectConvertRule.java @@ -197,8 +197,6 @@ public class DirectConvertRule implements CallExpressionConvertRule { BuiltInFunctionDefinitions.REPEAT, FlinkSqlOperatorTable.REPEAT); definitionSqlOperatorHashMap.put( BuiltInFunctionDefinitions.REGEXP, FlinkSqlOperatorTable.REGEXP); - definitionSqlOperatorHashMap.put( - BuiltInFunctionDefinitions.REGEXP_REPLACE, FlinkSqlOperatorTable.REGEXP_REPLACE); definitionSqlOperatorHashMap.put( BuiltInFunctionDefinitions.REVERSE, FlinkSqlOperatorTable.REVERSE); definitionSqlOperatorHashMap.put( diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/sql/FlinkSqlOperatorTable.java b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/sql/FlinkSqlOperatorTable.java index 55dbcfa22cd..af57daf6b26 100644 --- a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/sql/FlinkSqlOperatorTable.java +++ b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/sql/FlinkSqlOperatorTable.java @@ -494,20 +494,6 @@ public class FlinkSqlOperatorTable extends ReflectiveSqlOperatorTable { SqlTypeFamily.INTEGER)), SqlFunctionCategory.STRING); - public static final SqlFunction REGEXP_REPLACE = - new SqlFunction( - "REGEXP_REPLACE", - SqlKind.OTHER_FUNCTION, - ReturnTypes.cascade( - ReturnTypes.explicit(SqlTypeName.VARCHAR), - SqlTypeTransforms.TO_NULLABLE), - null, - OperandTypes.family( - SqlTypeFamily.CHARACTER, - SqlTypeFamily.CHARACTER, - SqlTypeFamily.CHARACTER), - SqlFunctionCategory.STRING); - public static final SqlFunction HASH_CODE = new SqlFunction( "HASH_CODE", diff --git a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/ExprCodeGenerator.scala b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/ExprCodeGenerator.scala index c6abee0315a..c8023b3ac49 100644 --- a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/ExprCodeGenerator.scala +++ b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/ExprCodeGenerator.scala @@ -944,6 +944,9 @@ class ExprCodeGenerator( case BuiltInFunctionDefinitions.REGEXP_EXTRACT => StringCallGen.generateRegexpExtract(ctx, operands, resultType) + case BuiltInFunctionDefinitions.REGEXP_REPLACE => + StringCallGen.generateRegexpReplace(ctx, operands, resultType) + case _ => new BridgingSqlFunctionCallGen(call, rexProgram).generate(ctx, operands, resultType) } diff --git a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/StringCallGen.scala b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/StringCallGen.scala index 6cc0dfad092..72b3ce2e036 100644 --- a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/StringCallGen.scala +++ b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/StringCallGen.scala @@ -79,8 +79,6 @@ object StringCallGen { case NOT_SIMILAR_TO => generateNot(ctx, generateSimilarTo(ctx, operands, returnType), returnType) - case REGEXP_REPLACE => generateRegexpReplace(ctx, operands, returnType) - case IS_DECIMAL => generateIsDecimal(ctx, operands, returnType) case IS_DIGIT => generateIsDigit(ctx, operands, returnType)
