[
https://issues.apache.org/jira/browse/PHOENIX-641?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Gabriel Reid resolved PHOENIX-641.
----------------------------------
Resolution: Fixed
Bulk resolve of closed issues imported from GitHub. This status was reached by
first re-opening all closed imported issues and then resolving them in bulk.
> IllegalDataException: Cannot convert from DATE to DECIMAL
> ---------------------------------------------------------
>
> Key: PHOENIX-641
> URL: https://issues.apache.org/jira/browse/PHOENIX-641
> Project: Phoenix
> Issue Type: Task
> Affects Versions: 2.2.0-Release
> Reporter: Dmitry Salychev
> Assignee: Samarth Jain
>
> Version of Phoenix: master, commit is 5b7c264.
> Please, look at my use case:
> ```java
> public final class PhoenixTest {
> private static final String HBASE_HOST = "localhost";
> private static final String JDBC_URL = "jdbc:phoenix:" + HBASE_HOST;
> private static final String TABLE_NAME =
> PhoenixTest.class.getSimpleName();
> private static final String TABLE_DDL = "CREATE TABLE IF NOT EXISTS "
> + TABLE_NAME + " ("
> + " id BINARY(16) NOT NULL PRIMARY KEY DESC"
> + ", t BINARY(16) NOT NULL"
> + ", e BINARY(16) NOT NULL"
> + ", y BINARY(16) NOT NULL"
> + ", d DATE NOT NULL"
> + ", v VARBINARY NULL"
> + ") IMMUTABLE_ROWS=true";
> private static final String DROP_TABLE_DDL = "DROP TABLE IF EXISTS "
> + TABLE_NAME;
> private static final String FIRST_INDEX = "CREATE INDEX IF NOT EXISTS "
> + TABLE_NAME + "_first_idx ON " + TABLE_NAME + "(t)";
> private static final String SECOND_INDEX = "CREATE INDEX IF NOT EXISTS "
> + TABLE_NAME + "_second_idx ON " + TABLE_NAME + "(t DESC,e)";
> private static final String THIRD_INDEX = "CREATE INDEX IF NOT EXISTS "
> + TABLE_NAME + "_third_idx ON " + TABLE_NAME + "(t DESC,e,d)";
> private static final int ID = 1;
> private static final int T_PLACE = 2;
> private static final int E_PLACE = 3;
> private static final int Y_PLACE = 4;
> private static final int DATE = 5;
> private static final int VALUE = 6;
> private static final String SQL_INSERT = "UPSERT INTO " + TABLE_NAME
> + " VALUES(" + StringUtils.repeat("?,", VALUE - 1) + "?)";
> private static final Calendar calendar = Calendar.getInstance();
> private final DataSource dataSource;
> private final JdbcTemplate template;
> private final NamedParameterJdbcTemplate namedTemplate;
> public PhoenixTest() {
> BoneCPDataSource ds = new BoneCPDataSource();
> ds.setJdbcUrl(JDBC_URL);
> ds.setDefaultAutoCommit(true);
> dataSource = ds;
> template = new JdbcTemplate(dataSource);
> namedTemplate = new NamedParameterJdbcTemplate(dataSource);
> template.execute(DROP_TABLE_DDL);
> template.execute(TABLE_DDL);
> template.execute(FIRST_INDEX);
> template.execute(SECOND_INDEX);
> template.execute(THIRD_INDEX);
> }
> @Test
> public void shouldSelectByDates() throws Exception {
> final long[] timestamps = new long[10];
> timestamps[0] = calendar.getTime().getTime();
> for (int i = 0; i < timestamps.length; i++) {
> final long timestamp = timestamps[0] + i * 10;
> timestamps[i] = timestamp;
> template.update(SQL_INSERT, new
> PreparedStatementSetter() {
> @Override
> public void setValues(PreparedStatement
> statement)
> throws SQLException {
> setUuid(statement, ID,
> UUID.randomUUID());
> statement.setBytes(T_PLACE,
> toBytes(UUID.randomUUID()));
> statement.setBytes(E_PLACE,
> toBytes(UUID.randomUUID()));
> statement.setBytes(Y_PLACE,
> toBytes(UUID.randomUUID()));
> setDate(statement, DATE, timestamp);
> statement.setBytes(VALUE,
> toBytes(UUID.randomUUID()));
> }
> });
> }
> List<byte[]> result = template.queryForList("SELECT d FROM "
> + TABLE_NAME, byte[].class);
> assertFalse(result.isEmpty());
> assertEquals(10, result.size());
> }
> }
> ```
> It fails with:
> ```java
> 22:50:56,290 [ main] DEBUG MutationState - Total time for batch call of 1
> mutations into PHOENIXTEST: 6 ms
> 22:50:56,291 [ main] DEBUG MutationState - Sending 1 mutations for
> PHOENIXTEST_SECOND_IDX with 1 key values of total size 72 bytes
> 22:50:56,291 [ad-43] DEBUG HBaseClient - IPC Client (47) connection to
> gkeeper/192.168.1.9:60020 from dsalychev sending -96
> com.salesforce.phoenix.schema.IllegalDataException: Cannot convert from DATE
> to DECIMAL
> at com.salesforce.phoenix.schema.PDataType.toObject(PDataType.java:4549)
> at
> com.salesforce.phoenix.schema.PDataType$9.toObject(PDataType.java:1349)
> at com.salesforce.phoenix.schema.PDataType.toObject(PDataType.java:4565)
> at com.salesforce.phoenix.schema.PDataType.toObject(PDataType.java:4573)
> at
> com.salesforce.phoenix.schema.PDataType.coerceBytes(PDataType.java:4519)
> at
> com.salesforce.phoenix.index.IndexMaintainer.buildRowKey(IndexMaintainer.java:305)
> at
> com.salesforce.phoenix.index.IndexMaintainer.buildUpdateMutation(IndexMaintainer.java:345)
> at
> com.salesforce.phoenix.util.IndexUtil.generateIndexData(IndexUtil.java:189)
> at
> com.salesforce.phoenix.execute.MutationState$1.next(MutationState.java:206)
> at
> com.salesforce.phoenix.execute.MutationState$1.next(MutationState.java:189)
> at
> com.salesforce.phoenix.execute.MutationState.commit(MutationState.java:343)
> at
> com.salesforce.phoenix.jdbc.PhoenixConnection.commit(PhoenixConnection.java:249)
> at
> com.salesforce.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:249)
> at
> com.salesforce.phoenix.jdbc.PhoenixStatement.access$600(PhoenixStatement.java:138)
> at
> com.salesforce.phoenix.jdbc.PhoenixStatement$ExecutableUpsertStatement.executeUpdate(PhoenixStatement.java:279)
> at
> com.salesforce.phoenix.jdbc.PhoenixPreparedStatement.executeUpdate(PhoenixPreparedStatement.java:125)
> at
> com.jolbox.bonecp.PreparedStatementHandle.executeUpdate(PreparedStatementHandle.java:205)
> at
> org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:824)
> at
> org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:818)
> at
> org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:589)
> at
> org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:818)
> at
> org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:874)
> at
> com.dv.test.dao.thing.event.store.PhoenixTest.shouldSelectByDates(PhoenixTest.java:89)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
> at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
> at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
> at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
> at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
> at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
> at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
> at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
> at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
> at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
> at
> com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77)
> at
> com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
> at
> com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
> ```
> It retrieves DECIMAL index data type against NULLABLE DATE type of data
> column. Is it a valid behavior? This is my patch to the IndexUtil.java:
> https://gist.github.com/dsalychev/7218761
--
This message was sent by Atlassian JIRA
(v6.2#6252)