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

James Taylor commented on PHOENIX-3437:
---------------------------------------

The way Phoenix detects this error condition is by the absence of a sequence 
value in the map it manages in ConnectionQueryServicesImpl here:
{code}
    @Override
    public long currentSequenceValue(SequenceKey sequenceKey, long timestamp) 
throws SQLException {
        Sequence sequence = sequenceMap.get(sequenceKey);
        if (sequence == null) {
            throw new 
SQLExceptionInfo.Builder(SQLExceptionCode.CANNOT_CALL_CURRENT_BEFORE_NEXT_VALUE)
            
.setSchemaName(sequenceKey.getSchemaName()).setTableName(sequenceKey.getSequenceName())
            .build().buildException();
        }
{code}

I suspect that call to 
ConnectionQueryServices.validateSequences(List<SequenceAllocation> 
sequenceAllocations, long timestamp, long[] values, SQLException[] exceptions, 
Sequence.ValueOp action) might not be using the right enum for action. It 
should use Sequence.ValueOp.VALIDATE_SEQUENCE. To track this down, you'd want 
to find out why/when the sequenceMap is being populated. You could potentially 
compare against standalone Phoenix's execution path.


> Calcite allows CURRENT VALUE to be called on a sequence which has not yet 
> been used
> -----------------------------------------------------------------------------------
>
>                 Key: PHOENIX-3437
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-3437
>             Project: Phoenix
>          Issue Type: Sub-task
>            Reporter: Eric Lomore
>            Assignee: Eric Lomore
>
> Calcite currently returns 0 for a sequence that has CURRENT VALUE called on 
> it before NEXT VALUE is ever called.
> To demonstrate, this sample integration test passes.
> {code}
>         connection.createStatement().execute("CREATE SEQUENCE IF NOT EXISTS 
> seq0 START WITH 1 INCREMENT BY 1");
>         start(false, 1000f).sql("select CURRENT VALUE FOR seq0, c0 from 
> (values (1), (1)) as t(c0)")
>                 .explainIs("PhoenixToEnumerableConverter\n" +
>                         "  
> PhoenixClientProject(EXPR$0=[CURRENT_VALUE('\"SEQ0\"')], C0=[$0])\n" +
>                         "    PhoenixValues(tuples=[[{ 1 }, { 1 }]])\n")
>                 .resultIs(0, new Object[][]{
>                         {0L, 1},
>                         {0L, 1}})
>                 .close();
> {code}
> But Phoenix's intended behaviour is for this to throw an exception.
> {{SequenceIT.java}}
> {code}
>     @Test
>     public void testCurrentValueFor() throws Exception {
>         ResultSet rs;
>         nextConnection();
>         conn.createStatement().execute("CREATE SEQUENCE used.nowhere START 
> WITH 2 INCREMENT BY 4");
>         nextConnection();
>         try {
>             rs = conn.createStatement().executeQuery("SELECT CURRENT VALUE 
> FOR used.nowhere FROM SYSTEM.\"SEQUENCE\"");
>             rs.next();
>             fail();
>         } catch (SQLException e) {
>             
> assertEquals(SQLExceptionCode.CANNOT_CALL_CURRENT_BEFORE_NEXT_VALUE.getErrorCode(),
>  e.getErrorCode());
>             assertTrue(e.getNextException()==null);
>         }
>         
>         rs = conn.createStatement().executeQuery("SELECT NEXT VALUE FOR 
> used.nowhere FROM SYSTEM.\"SEQUENCE\"");
>         assertTrue(rs.next());
>         assertEquals(2, rs.getInt(1));
>         rs = conn.createStatement().executeQuery("SELECT CURRENT VALUE FOR 
> used.nowhere FROM SYSTEM.\"SEQUENCE\"");
>         assertTrue(rs.next());
>         assertEquals(2, rs.getInt(1));
>       }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to