phoenix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "James Taylor (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (PHOENIX-1001) Using NEXT VALUE FOR 'sequence' as an input to a function cause a NPE
Date Sat, 07 Jun 2014 00:47:01 GMT

    [ https://issues.apache.org/jira/browse/PHOENIX-1001?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14020591#comment-14020591
] 

James Taylor commented on PHOENIX-1001:
---------------------------------------

Excellent work, [~tdsilva]. That's tricky with the CURRENT_DATE() and CURRENT_TIME(). It's
not deterministic exactly, but it should be computed for a given statement only once (unlike
NEXT VALUE FOR). I wonder if it'd be cleaner to have an enum instead of a boolean with three
values: DETERMINISTIC, UNDETERMINISTIC_ROW, UNDETERMINISTIC_STMT. Maybe file another JIRA
for a cleaner solution?

Is this patch for the 3.0 branch and would you mind producing one for 4.0 and master and I'll
get this committed?

> 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
>            Assignee: Thomas D'Silva
>         Attachments: PHOENIX-1001.patch
>
>
> 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 false 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)

Mime
View raw message