You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@phoenix.apache.org by "Josh Elser (JIRA)" <ji...@apache.org> on 2019/01/08 18:29:00 UTC

[jira] [Updated] (PHOENIX-5087) Inner Join Cursor Query fails with NullPointerException - JoinCompiler.java:187

     [ https://issues.apache.org/jira/browse/PHOENIX-5087?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Josh Elser updated PHOENIX-5087:
--------------------------------
    Description: 
I have come across an inner join query in my application that fails with the NullPointerException if executed as part of a Cursor, but executes fine if done without it. 
  
 To reproduce this issue, you can run the attached program (assuming you update the JDBC_URL to point to an instance you have running) or you can follow the steps below:
  
 Create the Table:
{code:java}
CREATE TABLE IF NOT EXISTS MY_STATS
(
   ID                   VARCHAR    NOT NULL,
   ENTRY_NAME                     VARCHAR    ,
   ENTRY_VALUE           DOUBLE     ,
   TRANSACTION_TIME               TIMESTAMP  ,
   CONSTRAINT pk PRIMARY KEY(ID)
) 
IMMUTABLE_STORAGE_SCHEME=ONE_CELL_PER_COLUMN,
UPDATE_CACHE_FREQUENCY=900000,
COLUMN_ENCODED_BYTES=NONE,
IMMUTABLE_ROWS=true{code}
  
 Execute a normal query (this works fine):
 
{code:java}
SELECT * FROM MY_STATS
   INNER JOIN 
   (
    SELECT ENTRY_NAME, MAX(TRANSACTION_TIME) AS TRANSACTION_TIME 
 FROM MY_STATS 
     GROUP BY ENTRY_NAME
   ) sub
   ON MY_STATS.ENTRY_NAME = sub.ENTRY_NAME AND MY_STATS.TRANSACTION_TIME = sub.TRANSACTION_TIME 
ORDER BY MY_STATS.TRANSACTION_TIME DESC  {code}
Now if you execute the same query, but with the cursor declaration at the top - 
  
 DECLARE MyCursor CURSOR FOR 
  
 It produces the following exception:
{noformat}
Exception in thread "main" java.lang.NullPointerException
  at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.resolveTable(JoinCompiler.java:187)
  at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.visit(JoinCompiler.java:224)
  at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.visit(JoinCompiler.java:181)
  at org.apache.phoenix.parse.DerivedTableNode.accept(DerivedTableNode.java:49)
  at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.visit(JoinCompiler.java:201)
  at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.visit(JoinCompiler.java:181)
  at org.apache.phoenix.parse.JoinTableNode.accept(JoinTableNode.java:81)
  at org.apache.phoenix.compile.JoinCompiler.compile(JoinCompiler.java:138)
  at org.apache.phoenix.compile.QueryCompiler.compileSelect(QueryCompiler.java:190)
  at org.apache.phoenix.compile.QueryCompiler.compile(QueryCompiler.java:153)
  at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:490)
  at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableDeclareCursorStatement.compilePlan(PhoenixStatement.java:950)
  at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableDeclareCursorStatement.compilePlan(PhoenixStatement.java:941)
  at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:401)
  at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:391)
  at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
  at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:390)
  at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:378)
  at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1825)
  at com.jsteenkamp.phoenix.PhoenixInnerJoinCursorTest.testCursorQuery(PhoenixInnerJoinCursorTest.java:68)
  at com.jsteenkamp.phoenix.PhoenixInnerJoinCursorTest.main(PhoenixInnerJoinCursorTest.java:20){noformat}

  was:
I have come across an inner join query in my application that fails with the NullPointerException if executed as part of a Cursor, but executes fine if done without it. 
 
To reproduce this issue, you can run the attached program (assuming you update the JDBC_URL to point to an instance you have running) or you can follow the steps below:
 
Create the Table:
 
CREATE TABLE IF NOT EXISTS MY_STATS
( 
   ID                   VARCHAR    NOT NULL,
   ENTRY_NAME                     VARCHAR    ,
   ENTRY_VALUE           DOUBLE     ,
   TRANSACTION_TIME               TIMESTAMP  ,
   CONSTRAINT pk PRIMARY KEY(ID)
) 
IMMUTABLE_STORAGE_SCHEME=ONE_CELL_PER_COLUMN,
UPDATE_CACHE_FREQUENCY=900000,
COLUMN_ENCODED_BYTES=NONE,
IMMUTABLE_ROWS=true
 
Execute a normal query (this works fine):
 
SELECT * FROM MY_STATS
   INNER JOIN 
   (
    SELECT ENTRY_NAME, MAX(TRANSACTION_TIME) AS TRANSACTION_TIME 
  FROM MY_STATS 
     GROUP BY ENTRY_NAME
   ) sub
   ON MY_STATS.ENTRY_NAME = sub.ENTRY_NAME AND MY_STATS.TRANSACTION_TIME = sub.TRANSACTION_TIME 
ORDER BY MY_STATS.TRANSACTION_TIME DESC 
 
Now if you execute the same query, but with the cursor declaration at the top - 
 
DECLARE MyCursor CURSOR FOR 
 
It produces the following exception:
 
Exception in thread "main" java.lang.NullPointerException
 at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.resolveTable(JoinCompiler.java:187)
 at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.visit(JoinCompiler.java:224)
 at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.visit(JoinCompiler.java:181)
 at org.apache.phoenix.parse.DerivedTableNode.accept(DerivedTableNode.java:49)
 at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.visit(JoinCompiler.java:201)
 at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.visit(JoinCompiler.java:181)
 at org.apache.phoenix.parse.JoinTableNode.accept(JoinTableNode.java:81)
 at org.apache.phoenix.compile.JoinCompiler.compile(JoinCompiler.java:138)
 at org.apache.phoenix.compile.QueryCompiler.compileSelect(QueryCompiler.java:190)
 at org.apache.phoenix.compile.QueryCompiler.compile(QueryCompiler.java:153)
 at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:490)
 at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableDeclareCursorStatement.compilePlan(PhoenixStatement.java:950)
 at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableDeclareCursorStatement.compilePlan(PhoenixStatement.java:941)
 at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:401)
 at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:391)
 at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
 at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:390)
 at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:378)
 at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1825)
 at com.jsteenkamp.phoenix.PhoenixInnerJoinCursorTest.testCursorQuery(PhoenixInnerJoinCursorTest.java:68)
 at com.jsteenkamp.phoenix.PhoenixInnerJoinCursorTest.main(PhoenixInnerJoinCursorTest.java:20)


> Inner Join Cursor Query fails with NullPointerException - JoinCompiler.java:187
> -------------------------------------------------------------------------------
>
>                 Key: PHOENIX-5087
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-5087
>             Project: Phoenix
>          Issue Type: Bug
>    Affects Versions: 4.14.1
>            Reporter: Jack Steenkamp
>            Assignee: Swaroopa Kadam
>            Priority: Major
>         Attachments: PhoenixInnerJoinCursorTest.java
>
>
> I have come across an inner join query in my application that fails with the NullPointerException if executed as part of a Cursor, but executes fine if done without it. 
>   
>  To reproduce this issue, you can run the attached program (assuming you update the JDBC_URL to point to an instance you have running) or you can follow the steps below:
>   
>  Create the Table:
> {code:java}
> CREATE TABLE IF NOT EXISTS MY_STATS
> (
>    ID                   VARCHAR    NOT NULL,
>    ENTRY_NAME                     VARCHAR    ,
>    ENTRY_VALUE           DOUBLE     ,
>    TRANSACTION_TIME               TIMESTAMP  ,
>    CONSTRAINT pk PRIMARY KEY(ID)
> ) 
> IMMUTABLE_STORAGE_SCHEME=ONE_CELL_PER_COLUMN,
> UPDATE_CACHE_FREQUENCY=900000,
> COLUMN_ENCODED_BYTES=NONE,
> IMMUTABLE_ROWS=true{code}
>   
>  Execute a normal query (this works fine):
>  
> {code:java}
> SELECT * FROM MY_STATS
>    INNER JOIN 
>    (
>     SELECT ENTRY_NAME, MAX(TRANSACTION_TIME) AS TRANSACTION_TIME 
>  FROM MY_STATS 
>      GROUP BY ENTRY_NAME
>    ) sub
>    ON MY_STATS.ENTRY_NAME = sub.ENTRY_NAME AND MY_STATS.TRANSACTION_TIME = sub.TRANSACTION_TIME 
> ORDER BY MY_STATS.TRANSACTION_TIME DESC  {code}
> Now if you execute the same query, but with the cursor declaration at the top - 
>   
>  DECLARE MyCursor CURSOR FOR 
>   
>  It produces the following exception:
> {noformat}
> Exception in thread "main" java.lang.NullPointerException
>   at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.resolveTable(JoinCompiler.java:187)
>   at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.visit(JoinCompiler.java:224)
>   at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.visit(JoinCompiler.java:181)
>   at org.apache.phoenix.parse.DerivedTableNode.accept(DerivedTableNode.java:49)
>   at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.visit(JoinCompiler.java:201)
>   at org.apache.phoenix.compile.JoinCompiler$JoinTableConstructor.visit(JoinCompiler.java:181)
>   at org.apache.phoenix.parse.JoinTableNode.accept(JoinTableNode.java:81)
>   at org.apache.phoenix.compile.JoinCompiler.compile(JoinCompiler.java:138)
>   at org.apache.phoenix.compile.QueryCompiler.compileSelect(QueryCompiler.java:190)
>   at org.apache.phoenix.compile.QueryCompiler.compile(QueryCompiler.java:153)
>   at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:490)
>   at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableDeclareCursorStatement.compilePlan(PhoenixStatement.java:950)
>   at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableDeclareCursorStatement.compilePlan(PhoenixStatement.java:941)
>   at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:401)
>   at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:391)
>   at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
>   at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:390)
>   at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:378)
>   at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1825)
>   at com.jsteenkamp.phoenix.PhoenixInnerJoinCursorTest.testCursorQuery(PhoenixInnerJoinCursorTest.java:68)
>   at com.jsteenkamp.phoenix.PhoenixInnerJoinCursorTest.main(PhoenixInnerJoinCursorTest.java:20){noformat}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)