Eric Lomore created PHOENIX-3437:
------------------------------------

             Summary: 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


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