You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@phoenix.apache.org by "Samarth Jain (JIRA)" <ji...@apache.org> on 2017/10/02 23:16:00 UTC

[jira] [Commented] (PHOENIX-4265) NPE when hinting index on table with ROW_TIMESTAMP

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

Samarth Jain commented on PHOENIX-4265:
---------------------------------------

The below test repro's the NPE. 
{code}
@Test
    public void testIndexHintOnTableWithRowTimestamp() throws Exception {
        Connection conn = DriverManager.getConnection(getUrl());
        try {
            conn.createStatement().execute("CREATE IMMUTABLE TABLE t1 (k1 TIMESTAMP not null, k2 bigint not null, v bigint, constraint pk primary key (k1 row_timestamp,k2 )) SALT_BUCKETS = 9");
            conn.createStatement().execute("CREATE INDEX idx ON t1 (v)");
            PreparedStatement stmt = conn.prepareStatement("UPSERT INTO t1 VALUES (?, ?, ?) ");
            stmt.setTimestamp(1, new Timestamp(1000));
            stmt.setLong(2, 1000);
            stmt.setLong(3, 1000);
            stmt.executeUpdate();
            stmt.setTimestamp(1, new Timestamp(2000));
            stmt.setLong(2, 1000);
            stmt.setLong(3, 5);
            stmt.executeUpdate();
            stmt.setTimestamp(1, new Timestamp(3000));
            stmt.setLong(2, 1000);
            stmt.setLong(3, 5);
            stmt.executeUpdate();
            stmt.setTimestamp(1, new Timestamp(4000));
            stmt.setLong(2, 1000);
            stmt.setLong(3, 5);
            stmt.executeUpdate();
            stmt.setTimestamp(1, new Timestamp(5000));
            stmt.setLong(2, 1000);
            stmt.setLong(3, 10);
            stmt.executeUpdate();
            stmt.setTimestamp(1, new Timestamp(6000));
            stmt.setLong(2, 1000);
            stmt.setLong(3, 20);
            stmt.executeUpdate();
            conn.commit();
            ResultSet rs = conn.createStatement().executeQuery("SELECT /*+ INDEX(T1 IDX) */ * FROM T1 WHERE v = 5");
            rs.next();
        } finally {
            conn.close();
        }
    }
{code}

The issue is that the codec for PTimestamp is null. 
{code}
protected PTimestamp(String sqlTypeName, int sqlType, int ordinal) {
        super(sqlTypeName, sqlType, java.sql.Timestamp.class, null, ordinal);
    }

    private PTimestamp() {
        super("TIMESTAMP", Types.TIMESTAMP, java.sql.Timestamp.class,
                null, 9);
    }
{code}

[~jamestaylor] - should it be PUnsignedInt.INSTANCE.getCodec()? Is it ok for any PDataType to have null codec?

> NPE when hinting index on table with ROW_TIMESTAMP
> --------------------------------------------------
>
>                 Key: PHOENIX-4265
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-4265
>             Project: Phoenix
>          Issue Type: Improvement
>            Reporter: James Taylor
>
> See email discussion here: https://lists.apache.org/thread.html/d87a508e5b4e2fc6b7110d861b71209d2385adaecd0152b790ee00e9@%3Cuser.phoenix.apache.org%3E
> I'm not able to repro with this unit test:
> {code}
>     @Test
>     public void testIndexHintOnTableWithRowTimestamp() throws Exception {
>         Connection conn = DriverManager.getConnection(getUrl());
>         try {
>             conn.createStatement().execute("CREATE IMMUTABLE TABLE t1 (k1 TIMESTAMP not null, k2 bigint not null, v bigint, constraint pk primary key (k1 row_timestamp,k2 ))");
>             conn.createStatement().execute("CREATE INDEX idx ON t1 (v)");
>             conn.createStatement().execute("SELECT /*+ INDEX(T1 IDX) */ K1,K2,V FROM t1 WHERE v = 5");
>         } finally {
>             conn.close();
>         }
>     }
> {code}
> FYI, due to the inability to keep an index in sync when there's a ROW_TIMESTAMP column, as of 4.12 we're disallowing the creation of mutable secondary indexes when a table has a ROW_TIMESTAMP column. Usually, since the timestamp is part of the row key, the data table can be declared IMMUTABLE. In this case, the index would still be allowed.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)