Repository: calcite
Updated Branches:
  refs/heads/master 55d7c6d80 -> 69e9fe7c2


[CALCITE-1674] LIKE does not match value that contains newline (Mark Payne)

Use (?s:.*) for regex that matches % wildcard for LIKE operators.
This allows the % character to match newlines.

Close apache/calcite#390


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/58217cb2
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/58217cb2
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/58217cb2

Branch: refs/heads/master
Commit: 58217cb2122b508016a1b8c4278a21a2e890b861
Parents: 55d7c6d
Author: Mark Payne <[email protected]>
Authored: Tue Mar 7 14:44:23 2017 -0500
Committer: Julian Hyde <[email protected]>
Committed: Thu Mar 9 13:10:10 2017 -0800

----------------------------------------------------------------------
 .../main/java/org/apache/calcite/runtime/Like.java    |  6 ++----
 .../apache/calcite/sql/test/SqlOperatorBaseTest.java  | 14 ++++++++++++++
 2 files changed, 16 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/58217cb2/core/src/main/java/org/apache/calcite/runtime/Like.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/runtime/Like.java 
b/core/src/main/java/org/apache/calcite/runtime/Like.java
index 91fa4d3..74b2c82 100644
--- a/core/src/main/java/org/apache/calcite/runtime/Like.java
+++ b/core/src/main/java/org/apache/calcite/runtime/Like.java
@@ -92,8 +92,7 @@ public class Like {
       } else if (c == '_') {
         javaPattern.append('.');
       } else if (c == '%') {
-        javaPattern.append(".");
-        javaPattern.append('*');
+        javaPattern.append("(?s:.*)");
       } else {
         javaPattern.append(c);
       }
@@ -264,8 +263,7 @@ public class Like {
           javaPattern.append('.');
           break;
         case '%':
-          javaPattern.append('.');
-          javaPattern.append('*');
+          javaPattern.append("(?s:.*)");
           break;
         case '[':
           javaPattern.append('[');

http://git-wip-us.apache.org/repos/asf/calcite/blob/58217cb2/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java 
b/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
index 1fd1933..f8efa3e 100644
--- a/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
@@ -3183,6 +3183,10 @@ public abstract class SqlOperatorBaseTest {
   @Test public void testNotLikeOperator() {
     tester.setFor(SqlStdOperatorTable.NOT_LIKE, VM_EXPAND);
     tester.checkBoolean("'abc' not like '_b_'", Boolean.FALSE);
+    tester.checkBoolean("'ab\ncd' not like 'ab%'", Boolean.FALSE);
+    tester.checkBoolean("'123\n\n45\n' not like '%'", Boolean.FALSE);
+    tester.checkBoolean("'ab\ncd\nef' not like '%cd%'", Boolean.FALSE);
+    tester.checkBoolean("'ab\ncd\nef' not like '%cde%'", Boolean.TRUE);
   }
 
   @Test public void testLikeEscape() {
@@ -3220,6 +3224,11 @@ public abstract class SqlOperatorBaseTest {
     tester.checkBoolean("'ab'   like '_b'", Boolean.TRUE);
     tester.checkBoolean("'abcd' like '_d'", Boolean.FALSE);
     tester.checkBoolean("'abcd' like '%d'", Boolean.TRUE);
+    tester.checkBoolean("'ab\ncd' like 'ab%'", Boolean.TRUE);
+    tester.checkBoolean("'abc\ncd' like 'ab%'", Boolean.TRUE);
+    tester.checkBoolean("'123\n\n45\n' like '%'", Boolean.TRUE);
+    tester.checkBoolean("'ab\ncd\nef' like '%cd%'", Boolean.TRUE);
+    tester.checkBoolean("'ab\ncd\nef' like '%cde%'", Boolean.FALSE);
   }
 
   @Test public void testNotSimilarToOperator() {
@@ -3255,6 +3264,11 @@ public abstract class SqlOperatorBaseTest {
     tester.checkBoolean("'ab'   similar to '_b'", Boolean.TRUE);
     tester.checkBoolean("'abcd' similar to '_d'", Boolean.FALSE);
     tester.checkBoolean("'abcd' similar to '%d'", Boolean.TRUE);
+    tester.checkBoolean("'ab\ncd' similar to 'ab%'", Boolean.TRUE);
+    tester.checkBoolean("'abc\ncd' similar to 'ab%'", Boolean.TRUE);
+    tester.checkBoolean("'123\n\n45\n' similar to '%'", Boolean.TRUE);
+    tester.checkBoolean("'ab\ncd\nef' similar to '%cd%'", Boolean.TRUE);
+    tester.checkBoolean("'ab\ncd\nef' similar to '%cde%'", Boolean.FALSE);
 
     // simple regular expressions
     // ab*c+d matches acd, abcd, acccd, abcccd but not abd, aabc

Reply via email to