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)