This is an automated email from the ASF dual-hosted git repository.

snuyanzin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new 07958d75456 [FLINK-39396][table] Simplify early return condition in 
`SqlLikeChainChecker`
07958d75456 is described below

commit 07958d75456f4cb5ca567a96c6410fac8f99eb67
Author: Au-Miner <[email protected]>
AuthorDate: Tue May 12 04:13:21 2026 +0800

    [FLINK-39396][table] Simplify early return condition in 
`SqlLikeChainChecker`
---
 .../table/planner/functions/LikeFunctionITCase.java   | 16 +++++++++++++++-
 .../table/runtime/functions/SqlLikeChainChecker.java  | 19 +++++++------------
 2 files changed, 22 insertions(+), 13 deletions(-)

diff --git 
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/LikeFunctionITCase.java
 
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/LikeFunctionITCase.java
index 17981f0fd8c..61d9362231a 100644
--- 
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/LikeFunctionITCase.java
+++ 
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/LikeFunctionITCase.java
@@ -148,8 +148,22 @@ class LikeFunctionITCase extends BuiltInFunctionTestBase {
                                 DataTypes.STRING(),
                                 DataTypes.STRING())
                         // Empty strings in pattern or escape
-                        .testSqlResult("f0 LIKE 'test\"end' ESCAPE ''", false, 
DataTypes.BOOLEAN())
                         .testSqlResult("f0 LIKE '' ESCAPE ''", false, 
DataTypes.BOOLEAN())
+                        .testSqlResult("f0 LIKE '' ESCAPE '!'", false, 
DataTypes.BOOLEAN())
+                        .testSqlResult("f0 LIKE 'test\"end' ESCAPE ''", false, 
DataTypes.BOOLEAN())
+                        // Escaped _ in quick path: startsWith (BEGIN_PATTERN)
+                        .testSqlResult("f2 LIKE 'te!_%' ESCAPE '!'", true, 
DataTypes.BOOLEAN())
+                        .testSqlResult("f0 LIKE 'te!_%' ESCAPE '!'", false, 
DataTypes.BOOLEAN())
+
+                        // Escaped _ in quick path: endsWith (END_PATTERN)
+                        .testSqlResult("f2 LIKE '%!_st' ESCAPE '!'", true, 
DataTypes.BOOLEAN())
+
+                        // Escaped _ in quick path: contains (MIDDLE_PATTERN)
+                        .testSqlResult("f2 LIKE '%!_s%' ESCAPE '!'", true, 
DataTypes.BOOLEAN())
+
+                        // Escaped _ in quick path: multi-segment 
(ChainChecker)
+                        .testSqlResult("f2 LIKE 'te!_%st' ESCAPE '!'", true, 
DataTypes.BOOLEAN())
+                        .testSqlResult("f0 LIKE 'te!_%st' ESCAPE '!'", false, 
DataTypes.BOOLEAN())
                         // Escaping with emoji
                         .testSqlResult("f0 LIKE 'test' ESCAPE '✅'", true, 
DataTypes.BOOLEAN())
                         .testSqlResult("f1 LIKE 'test✅%' ESCAPE '✅'", true, 
DataTypes.BOOLEAN())
diff --git 
a/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/functions/SqlLikeChainChecker.java
 
b/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/functions/SqlLikeChainChecker.java
index 06068031bfc..2be97b48a0d 100644
--- 
a/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/functions/SqlLikeChainChecker.java
+++ 
b/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/functions/SqlLikeChainChecker.java
@@ -45,13 +45,13 @@ public class SqlLikeChainChecker {
     private final int[] midLens;
     private final int beginLen;
     private final int endLen;
-    private final boolean leftAnchor;
-    private final boolean rightAnchor;
+    private final boolean isEmptyPattern;
 
     public SqlLikeChainChecker(String pattern) {
         final StringTokenizer tokens = new StringTokenizer(pattern, "%");
-        leftAnchor = !pattern.startsWith("%");
-        rightAnchor = !pattern.endsWith("%");
+        boolean leftAnchor = !pattern.startsWith("%");
+        boolean rightAnchor = !pattern.endsWith("%");
+        isEmptyPattern = pattern.isEmpty();
         int len = 0;
         // at least 2 checkers always
         BinaryStringData leftPattern = null;
@@ -63,7 +63,7 @@ public class SqlLikeChainChecker {
 
         for (int i = 0; tokens.hasMoreTokens(); i++) {
             String chunk = tokens.nextToken();
-            if (chunk.length() == 0) {
+            if (chunk.isEmpty()) {
                 // %% is folded in the .*?.*? regex usually into .*?
                 continue;
             }
@@ -97,13 +97,8 @@ public class SqlLikeChainChecker {
         int mark = str.getSizeInBytes();
         // Returns false early if either:
         // the input is too short to match the pattern, or
-        // the pattern is empty (or anchored with no literals) but the input 
is not empty.
-        if (mark < minLen
-                || beginPattern == null
-                        && endPattern == null
-                        && middlePatterns.length == 0
-                        && mark > 0
-                        && (leftAnchor || rightAnchor)) {
+        // the pattern is empty but the input is not.
+        if (mark < minLen || mark > 0 && isEmptyPattern) {
             return false;
         }
         // prefix, extend start

Reply via email to