This is an automated email from the ASF dual-hosted git repository. stoty pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/master by this push: new 8df1dbc PHOENIX-3633 null pointer exception when subsquery for not exists returns empty result set 8df1dbc is described below commit 8df1dbc25ebd594ff7cf1d622e2ea30d4a63f580 Author: Istvan Toth <st...@apache.org> AuthorDate: Wed Jan 6 11:03:06 2021 +0100 PHOENIX-3633 null pointer exception when subsquery for not exists returns empty result set Co-authored-by: Jerry He <jerry...@apache.org> --- .../apache/phoenix/end2end/join/SubqueryIT.java | 24 +++++++++++++++++++--- .../apache/phoenix/compile/ExpressionCompiler.java | 6 ++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SubqueryIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SubqueryIT.java index 4816cbf..8c7ea04 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SubqueryIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SubqueryIT.java @@ -510,10 +510,10 @@ public class SubqueryIT extends BaseJoinIT { assertEquals(rs.getString(2), "T5"); assertFalse(rs.next()); - + rs = conn.createStatement().executeQuery("EXPLAIN " + query); assertPlansEqual(plans[3], QueryUtil.getExplainPlan(rs)); - + query = "SELECT * FROM " + tableName5 + " co WHERE EXISTS (SELECT 1 FROM " + tableName1 + " i WHERE NOT EXISTS (SELECT 1 FROM " + tableName4 + " WHERE \"item_id\" = i.\"item_id\") AND co.item_id = \"item_id\" AND name = co.item_name)" + " OR EXISTS (SELECT 1 FROM " + tableName1 + " WHERE \"item_id\" IN (SELECT \"item_id\" FROM " + tableName4 + ") AND co.co_item_id = \"item_id\" AND name = co.co_item_name)"; statement = conn.prepareStatement(query); @@ -530,10 +530,28 @@ public class SubqueryIT extends BaseJoinIT { assertEquals(rs.getString(4), "T1"); assertFalse(rs.next()); - + rs = conn.createStatement().executeQuery("EXPLAIN " + query); String plan = QueryUtil.getExplainPlan(rs); assertPlansMatch(plans[2], plan); + + //PHOENIX-3633 + query = "SELECT * FROM " + tableName4 + " o WHERE NOT EXISTS (SELECT 1 FROM " + tableName1 + " i WHERE \"item_id\" = 'does not exist')"; + statement = conn.prepareStatement(query); + rs = statement.executeQuery(); + assertTrue (rs.next()); + assertEquals(rs.getString(1), "000000000000001"); + assertTrue (rs.next()); + assertEquals(rs.getString(1), "000000000000002"); + assertTrue (rs.next()); + assertEquals(rs.getString(1), "000000000000003"); + assertTrue (rs.next()); + assertEquals(rs.getString(1), "000000000000004"); + assertTrue (rs.next()); + assertEquals(rs.getString(1), "000000000000005"); + + assertFalse(rs.next()); + } finally { 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 c39621f..ff731bd 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 @@ -1222,8 +1222,10 @@ public class ExpressionCompiler extends UnsupportedAllParseNodeVisitor<Expressio @Override public Expression visitLeave(ExistsParseNode node, List<Expression> l) throws SQLException { LiteralExpression child = (LiteralExpression) l.get(0); - PhoenixArray array = (PhoenixArray) child.getValue(); - return LiteralExpression.newConstant(array.getDimensions() > 0 ^ node.isNegate(), PBoolean.INSTANCE); + boolean elementExists = child != null + && child.getValue() != null + && ((PhoenixArray)child.getValue()).getDimensions() > 0; + return LiteralExpression.newConstant(elementExists ^ node.isNegate(), PBoolean.INSTANCE); } @Override