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

Reply via email to