This is an automated email from the ASF dual-hosted git repository. stoty pushed a commit to branch 4.x in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/4.x by this push: new f4d96c0 PHOENIX-3633 null pointer exception when subsquery for not exists returns empty result set f4d96c0 is described below commit f4d96c0c6c5191b357e9aba2c118d520f54ea45f 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 69e8008..e563ca6 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 @@ -508,10 +508,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); @@ -528,10 +528,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 d430427..a993cea 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 @@ -1217,8 +1217,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