PHOENIX-2139 LIKE '%' is not filtering out null columns
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 1ee0669..1d93341 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
@@ -85,4 +85,42 @@
testLikeExpression(conn, "%A%", 3, 42);
conn.close();
}
+
+ @Test
+ public void testLikeEverythingExpression() throws Exception {
+ Connection conn = DriverManager.getConnection(getUrl());
+ String ddl = "CREATE TABLE t (k1 VARCHAR, k2 VARCHAR, CONSTRAINT pk PRIMARY KEY (k1,k2))";
+ conn.createStatement().execute(ddl);
+ conn.createStatement().execute("UPSERT INTO t VALUES('aa','bb')");
+ conn.createStatement().execute("UPSERT INTO t VALUES('ab','bc')");
+ conn.createStatement().execute("UPSERT INTO t VALUES(null,'cc')");
+ conn.createStatement().execute("UPSERT INTO t VALUES('dd',null)");
+ conn.commit();
+
+ ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM t WHERE k1 LIKE '%'");
+ assertTrue(rs.next());
+ assertEquals("aa", rs.getString(1));
+ assertEquals("bb", rs.getString(2));
+ assertTrue(rs.next());
+ assertEquals("ab", rs.getString(1));
+ assertEquals("bc", rs.getString(2));
+ assertTrue(rs.next());
+ assertEquals("dd", rs.getString(1));
+ assertEquals(null, rs.getString(2));
+ assertFalse(rs.next());
+
+ rs = conn.createStatement().executeQuery("SELECT * FROM t WHERE k2 LIKE '%'");
+ assertTrue(rs.next());
+ assertEquals(null, rs.getString(1));
+ assertEquals("cc", rs.getString(2));
+ assertTrue(rs.next());
+ assertEquals("aa", rs.getString(1));
+ assertEquals("bb", rs.getString(2));
+ assertTrue(rs.next());
+ assertEquals("ab", rs.getString(1));
+ assertEquals("bc", rs.getString(2));
+ assertFalse(rs.next());
+
+ conn.close();
+ }
}
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 2f786ec..1278494 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
@@ -513,6 +513,8 @@
return new ComparisonExpression(Arrays.asList(lhs,rhs), op);
}
}
+ } else if (index == 0 && pattern.length() == 1) {
+ return IsNullExpression.create(lhs, true, context.getTempPtr());
}
}
QueryServices services = context.getConnection().getQueryServices();
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java
index 314af2e..d27a349 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java
@@ -491,7 +491,7 @@
where.append(COLUMN_NAME + " like '" + StringUtil.escapeStringConstant(colPattern) + "'" );
}
}
- if (colPattern == null) {
+ if (colPattern == null || colPattern.length() == 0) {
appendConjunction(where);
where.append(COLUMN_NAME + " is not null" );
}