You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by pb...@apache.org on 2019/05/01 07:36:40 UTC

[phoenix] 02/12: PHOENIX-5173: LIKE and ILIKE statements return empty result list for search without wildcard

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

pboado pushed a commit to branch 5.x-cdh6
in repository https://gitbox.apache.org/repos/asf/phoenix.git

commit cbca95d870abe1e831f343263bcf750be330198f
Author: s.kadam <s....@salesforce.com>
AuthorDate: Fri Apr 19 23:53:54 2019 +0100

    PHOENIX-5173: LIKE and ILIKE statements return empty result list for search without wildcard
---
 .../apache/phoenix/end2end/LikeExpressionIT.java   | 24 ++++++++++++++++++++++
 .../apache/phoenix/compile/ExpressionCompiler.java |  3 ---
 .../apache/phoenix/compile/WhereOptimizerTest.java |  8 ++++++--
 3 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/LikeExpressionIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/LikeExpressionIT.java
index 0b061d5..65d55cc 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/LikeExpressionIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/LikeExpressionIT.java
@@ -430,4 +430,28 @@ public class LikeExpressionIT extends ParallelStatsDisabledIT {
         rs = select.executeQuery();
         assertFalse(rs.next());
     }
+    //associated to PHOENIX-5173 jira
+    @Test
+    public void testLikeExpressionWithoutWildcards() throws Exception {
+        String table = generateUniqueName();
+        final String createTable = "CREATE TABLE "
+                + table + " (ID BIGINT NOT NULL PRIMARY KEY, USER_NAME VARCHAR(255))";
+        final String upsertTable = "UPSERT INTO " + table + " VALUES(1, 'Some Name')";
+        String likeSelect = "SELECT * FROM " + table + " WHERE USER_NAME LIKE 'Some Name'";
+        String iLikeSelect = "SELECT * FROM " + table + " WHERE USER_NAME ILIKE 'soMe nAme'";
+
+        try(Connection conn = DriverManager.getConnection(getUrl())) {
+            conn.setAutoCommit(true);
+            conn.createStatement().execute(createTable);
+            conn.createStatement().executeUpdate(upsertTable);
+            try(ResultSet rs = conn.createStatement().executeQuery(likeSelect)) {
+                assertTrue(rs.next());
+                assertFalse(rs.next());
+            }
+            try(ResultSet rs = conn.createStatement().executeQuery(iLikeSelect)) {
+                assertTrue(rs.next());
+                assertFalse(rs.next());
+            }
+        }
+    }
 }
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionCompiler.java
index 3b0f6d7..807c2e2 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionCompiler.java
@@ -507,9 +507,6 @@ public class ExpressionCompiler extends UnsupportedAllParseNodeVisitor<Expressio
             }
             if (index == -1) {
                 String rhsLiteral = LikeExpression.unescapeLike(pattern);
-                if (lhsMaxLength != null && lhsMaxLength != rhsLiteral.length()) {
-                    return LiteralExpression.newConstant(false, rhs.getDeterminism());
-                }
                 if (node.getLikeType() == LikeType.CASE_SENSITIVE) {
                   CompareOp op = node.isNegate() ? CompareOp.NOT_EQUAL : CompareOp.EQUAL;
                   if (pattern.equals(rhsLiteral)) {
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/WhereOptimizerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/WhereOptimizerTest.java
index cc6f55a..f2d5cfe 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/compile/WhereOptimizerTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/WhereOptimizerTest.java
@@ -921,14 +921,18 @@ public class WhereOptimizerTest extends BaseConnectionlessQueryTest {
     }
 
     @Test
-    public void testDegenerateLikeNoWildcard() throws SQLException {
+    public void testLikeNoWildcardExpression() throws SQLException {
         String tenantId = "000000000000001";
         String keyPrefix = "002";
         String query = "select * from atable where organization_id LIKE ? and entity_id  LIKE '" + keyPrefix + "'";
         List<Object> binds = Arrays.<Object>asList(tenantId);
         StatementContext context = compileStatement(query, binds);
         Scan scan = context.getScan();
-        assertDegenerate(scan);
+        byte[] startRow = ByteUtil.concat(
+                PVarchar.INSTANCE.toBytes(tenantId),StringUtil.padChar(PVarchar.INSTANCE.toBytes(keyPrefix),15));
+        assertArrayEquals(startRow, scan.getStartRow());
+        byte[] stopRow = ByteUtil.nextKey(startRow);
+        assertArrayEquals(stopRow, scan.getStopRow());
     }
 
     @Test