You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@phoenix.apache.org by "Thomas D'Silva (JIRA)" <ji...@apache.org> on 2014/05/29 20:09:04 UTC

[jira] [Updated] (PHOENIX-1001) Using NEXT VALUE FOR 'sequence' as an input to a function cause a NPE

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

Thomas D'Silva updated PHOENIX-1001:
------------------------------------

    Description: 
I get a NPE while trying to write a test that  uses NEXT VALUE of a sequence as an input to a function.
 
For example 
{code:sql}
CREATE SEQUENCE foo.bar START WITH 0 INCREMENT BY 62
SELECT INVERT(NEXT VALUE FOR foo.bar) FROM SYSTEM."SEQUENCE"
{code}

causes an exception

java.lang.NullPointerException
	at org.apache.phoenix.compile.SequenceManager$SequenceValueExpression.evaluate(SequenceManager.java:189)
	at org.apache.phoenix.expression.function.InvertFunction.evaluate(InvertFunction.java:47)
	at org.apache.phoenix.compile.ExpressionCompiler.visitLeave(ExpressionCompiler.java:288)
	at org.apache.phoenix.compile.ProjectionCompiler$SelectClauseVisitor.visitLeave(ProjectionCompiler.java:560)
	at org.apache.phoenix.compile.ExpressionCompiler.visitLeave(ExpressionCompiler.java:1)
	at org.apache.phoenix.parse.FunctionParseNode.accept(FunctionParseNode.java:79)
	at org.apache.phoenix.compile.ProjectionCompiler.compile(ProjectionCompiler.java:325)
	at org.apache.phoenix.compile.QueryCompiler.compileSingleQuery(QueryCompiler.java:325)
	at org.apache.phoenix.compile.QueryCompiler.compile(QueryCompiler.java:130)
	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:291)
	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:1)
	at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:206)
	at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:1)
	at org.apache.phoenix.util.PhoenixContextExecutor.call(PhoenixContextExecutor.java:54)
	at org.apache.phoenix.jdbc.PhoenixStatement.executeQuery(PhoenixStatement.java:202)
	at org.apache.phoenix.jdbc.PhoenixPreparedStatement.executeQuery(PhoenixPreparedStatement.java:157)
	at org.apache.phoenix.end2end.SequenceIT.test123(SequenceIT.java:596)
	


	






I was able to fix this error by changing isStateless() to return true for SequenceValueParseNode and SeuenceValueExpression, however this caused tests to fail in SequenceIT when it tries to use NEXT VALUE in an UPSERT

java.sql.SQLException: ERROR 204 (22008): Values in UPSERT must evaluate to a constant.
	at org.apache.phoenix.exception.SQLExceptionCode$Factory$1.newException(SQLExceptionCode.java:309)
	at org.apache.phoenix.exception.SQLExceptionInfo.buildException(SQLExceptionInfo.java:133)
	at org.apache.phoenix.compile.UpsertCompiler.compile(UpsertCompiler.java:652)
	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableUpsertStatement.compilePlan(PhoenixStatement.java:435)
	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableUpsertStatement.compilePlan(PhoenixStatement.java:1)
	at org.apache.phoenix.jdbc.PhoenixStatement$3.call(PhoenixStatement.java:244)
	at org.apache.phoenix.jdbc.PhoenixStatement$3.call(PhoenixStatement.java:1)
	at org.apache.phoenix.util.PhoenixContextExecutor.call(PhoenixContextExecutor.java:54)
	at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:235)
	at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:946)
	at org.apache.phoenix.end2end.SequenceIT.testInsertNextValueFor(SequenceIT.java:191)
	

  was:
I get a NPE while trying to write a test that  uses NEXT VALUE of a sequence as an input to a function.
 
For example 
{code:sql}
CREATE SEQUENCE foo.bar START WITH 0 INCREMENT BY 62
SELECT INVERT(TO_STRING(NEXT VALUE FOR foo.bar)) FROM SYSTEM."SEQUENCE"
{code}

causes an exception

java.lang.NullPointerException
	at org.apache.phoenix.compile.SequenceManager$SequenceValueExpression.evaluate(SequenceManager.java:189)
	at org.apache.phoenix.expression.function.InvertFunction.evaluate(InvertFunction.java:47)
	at org.apache.phoenix.compile.ExpressionCompiler.visitLeave(ExpressionCompiler.java:288)
	at org.apache.phoenix.compile.ProjectionCompiler$SelectClauseVisitor.visitLeave(ProjectionCompiler.java:560)
	at org.apache.phoenix.compile.ExpressionCompiler.visitLeave(ExpressionCompiler.java:1)
	at org.apache.phoenix.parse.FunctionParseNode.accept(FunctionParseNode.java:79)
	at org.apache.phoenix.compile.ProjectionCompiler.compile(ProjectionCompiler.java:325)
	at org.apache.phoenix.compile.QueryCompiler.compileSingleQuery(QueryCompiler.java:325)
	at org.apache.phoenix.compile.QueryCompiler.compile(QueryCompiler.java:130)
	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:291)
	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:1)
	at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:206)
	at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:1)
	at org.apache.phoenix.util.PhoenixContextExecutor.call(PhoenixContextExecutor.java:54)
	at org.apache.phoenix.jdbc.PhoenixStatement.executeQuery(PhoenixStatement.java:202)
	at org.apache.phoenix.jdbc.PhoenixPreparedStatement.executeQuery(PhoenixPreparedStatement.java:157)
	at org.apache.phoenix.end2end.SequenceIT.test123(SequenceIT.java:596)
	


	






I was able to fix this error by changing isStateless() to return true for SequenceValueParseNode and SeuenceValueExpression, however this caused tests to fail in SequenceIT when it tries to use NEXT VALUE in an UPSERT

java.sql.SQLException: ERROR 204 (22008): Values in UPSERT must evaluate to a constant.
	at org.apache.phoenix.exception.SQLExceptionCode$Factory$1.newException(SQLExceptionCode.java:309)
	at org.apache.phoenix.exception.SQLExceptionInfo.buildException(SQLExceptionInfo.java:133)
	at org.apache.phoenix.compile.UpsertCompiler.compile(UpsertCompiler.java:652)
	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableUpsertStatement.compilePlan(PhoenixStatement.java:435)
	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableUpsertStatement.compilePlan(PhoenixStatement.java:1)
	at org.apache.phoenix.jdbc.PhoenixStatement$3.call(PhoenixStatement.java:244)
	at org.apache.phoenix.jdbc.PhoenixStatement$3.call(PhoenixStatement.java:1)
	at org.apache.phoenix.util.PhoenixContextExecutor.call(PhoenixContextExecutor.java:54)
	at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:235)
	at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:946)
	at org.apache.phoenix.end2end.SequenceIT.testInsertNextValueFor(SequenceIT.java:191)
	


> Using NEXT VALUE FOR 'sequence' as an input to a function cause a NPE
> ---------------------------------------------------------------------
>
>                 Key: PHOENIX-1001
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-1001
>             Project: Phoenix
>          Issue Type: Bug
>            Reporter: Thomas D'Silva
>
> I get a NPE while trying to write a test that  uses NEXT VALUE of a sequence as an input to a function.
>  
> For example 
> {code:sql}
> CREATE SEQUENCE foo.bar START WITH 0 INCREMENT BY 62
> SELECT INVERT(NEXT VALUE FOR foo.bar) FROM SYSTEM."SEQUENCE"
> {code}
> causes an exception
> java.lang.NullPointerException
> 	at org.apache.phoenix.compile.SequenceManager$SequenceValueExpression.evaluate(SequenceManager.java:189)
> 	at org.apache.phoenix.expression.function.InvertFunction.evaluate(InvertFunction.java:47)
> 	at org.apache.phoenix.compile.ExpressionCompiler.visitLeave(ExpressionCompiler.java:288)
> 	at org.apache.phoenix.compile.ProjectionCompiler$SelectClauseVisitor.visitLeave(ProjectionCompiler.java:560)
> 	at org.apache.phoenix.compile.ExpressionCompiler.visitLeave(ExpressionCompiler.java:1)
> 	at org.apache.phoenix.parse.FunctionParseNode.accept(FunctionParseNode.java:79)
> 	at org.apache.phoenix.compile.ProjectionCompiler.compile(ProjectionCompiler.java:325)
> 	at org.apache.phoenix.compile.QueryCompiler.compileSingleQuery(QueryCompiler.java:325)
> 	at org.apache.phoenix.compile.QueryCompiler.compile(QueryCompiler.java:130)
> 	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:291)
> 	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableSelectStatement.compilePlan(PhoenixStatement.java:1)
> 	at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:206)
> 	at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:1)
> 	at org.apache.phoenix.util.PhoenixContextExecutor.call(PhoenixContextExecutor.java:54)
> 	at org.apache.phoenix.jdbc.PhoenixStatement.executeQuery(PhoenixStatement.java:202)
> 	at org.apache.phoenix.jdbc.PhoenixPreparedStatement.executeQuery(PhoenixPreparedStatement.java:157)
> 	at org.apache.phoenix.end2end.SequenceIT.test123(SequenceIT.java:596)
> 	
> 	
> I was able to fix this error by changing isStateless() to return true for SequenceValueParseNode and SeuenceValueExpression, however this caused tests to fail in SequenceIT when it tries to use NEXT VALUE in an UPSERT
> java.sql.SQLException: ERROR 204 (22008): Values in UPSERT must evaluate to a constant.
> 	at org.apache.phoenix.exception.SQLExceptionCode$Factory$1.newException(SQLExceptionCode.java:309)
> 	at org.apache.phoenix.exception.SQLExceptionInfo.buildException(SQLExceptionInfo.java:133)
> 	at org.apache.phoenix.compile.UpsertCompiler.compile(UpsertCompiler.java:652)
> 	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableUpsertStatement.compilePlan(PhoenixStatement.java:435)
> 	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableUpsertStatement.compilePlan(PhoenixStatement.java:1)
> 	at org.apache.phoenix.jdbc.PhoenixStatement$3.call(PhoenixStatement.java:244)
> 	at org.apache.phoenix.jdbc.PhoenixStatement$3.call(PhoenixStatement.java:1)
> 	at org.apache.phoenix.util.PhoenixContextExecutor.call(PhoenixContextExecutor.java:54)
> 	at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:235)
> 	at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:946)
> 	at org.apache.phoenix.end2end.SequenceIT.testInsertNextValueFor(SequenceIT.java:191)
> 	



--
This message was sent by Atlassian JIRA
(v6.2#6252)