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)