[ 
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)

Reply via email to