[ 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)