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
