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)

Reply via email to