[
https://issues.apache.org/jira/browse/PHOENIX-2631?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15148277#comment-15148277
]
James Taylor commented on PHOENIX-2631:
---------------------------------------
I think Timestamp.setNanos() is very counterintuitive. Given that the date part
already stores millisecond granularity, it seems very odd to me that setNanos()
truncates the existing millisecond part. I would have expected it to keep only
the fractional nanos part in nanos. But it doesn't really matter, as it is the
way it is.
In Phoenix, a Timestamp is 12 bytes - the first 8 bytes are the millisecond
part and the last 4 bytes are the fractional nanos part. This allows the bytes
from a Timestamp to be compared directly against other Timestamps (because
they're normalized in the same way). The nanos will be less than 1000000 unless
it was written back in Phoenix 1.x. That code is just taking care of that b/w
compatibility issue. We restore the nanos back without removing the fractional
millisecond part from the date part.
> Exception when parsing boundary timestamp values
> ------------------------------------------------
>
> Key: PHOENIX-2631
> URL: https://issues.apache.org/jira/browse/PHOENIX-2631
> Project: Phoenix
> Issue Type: Bug
> Affects Versions: 4.6.0, 4.7.0
> Reporter: Nick Dimiduk
> Fix For: 4.7.0
>
> Attachments: 2631-workaround.patch
>
>
> I get a stack trace when querying or explaining a query that contains a
> timestamp value on the boundary of the day.
> {noformat}
> > CREATE TABLE FOO(
> a VARCHAR NOT NULL,
> b TIMESTAMP NOT NULL,
> c VARCHAR,
> CONSTRAINT pk PRIMARY KEY (a, b DESC ROW_TIMESTAMP, c)
> ) IMMUTABLE_ROWS=true,
> SALT_BUCKETS=20
> ;
> No rows affected (1.532 seconds)
> > explain select * from foo where a = 'a' and b >= timestamp '2016-01-28
> > 00:00:00' and b < timestamp '2016-01-29 00:00:00';
> Error: ERROR 201 (22000): Illegal data. (state=22000,code=201)
> java.sql.SQLException: ERROR 201 (22000): Illegal data.
> at
> org.apache.phoenix.exception.SQLExceptionCode$Factory$1.newException(SQLExceptionCode.java:419)
> at
> org.apache.phoenix.exception.SQLExceptionInfo.buildException(SQLExceptionInfo.java:145)
> at
> org.apache.phoenix.schema.types.PDataType.newIllegalDataException(PDataType.java:286)
> at
> org.apache.phoenix.schema.types.PUnsignedInt$UnsignedIntCodec.decodeInt(PUnsignedInt.java:165)
> at
> org.apache.phoenix.schema.types.PTimestamp.toObject(PTimestamp.java:108)
> at
> org.apache.phoenix.schema.types.PTimestamp.toObject(PTimestamp.java:32)
> at
> org.apache.phoenix.schema.types.PDataType.toObject(PDataType.java:968)
> at
> org.apache.phoenix.schema.types.PDataType.toObject(PDataType.java:972)
> at
> org.apache.phoenix.schema.types.PDataType.toObject(PDataType.java:1001)
> at
> org.apache.phoenix.schema.types.PDataType.toStringLiteral(PDataType.java:1074)
> at
> org.apache.phoenix.schema.types.PDataType.toStringLiteral(PDataType.java:1070)
> at
> org.apache.phoenix.iterate.ExplainTable.appendPKColumnValue(ExplainTable.java:194)
> at
> org.apache.phoenix.iterate.ExplainTable.appendScanRow(ExplainTable.java:270)
> at
> org.apache.phoenix.iterate.ExplainTable.appendKeyRanges(ExplainTable.java:282)
> at
> org.apache.phoenix.iterate.ExplainTable.explain(ExplainTable.java:125)
> at
> org.apache.phoenix.iterate.BaseResultIterators.explain(BaseResultIterators.java:830)
> at
> org.apache.phoenix.iterate.RoundRobinResultIterator.explain(RoundRobinResultIterator.java:153)
> at
> org.apache.phoenix.execute.BaseQueryPlan.getPlanSteps(BaseQueryPlan.java:468)
> at
> org.apache.phoenix.execute.BaseQueryPlan.iterator(BaseQueryPlan.java:322)
> at
> org.apache.phoenix.execute.BaseQueryPlan.iterator(BaseQueryPlan.java:193)
> at
> org.apache.phoenix.execute.BaseQueryPlan.getExplainPlan(BaseQueryPlan.java:463)
> at
> org.apache.phoenix.jdbc.PhoenixStatement$ExecutableExplainStatement.compilePlan(PhoenixStatement.java:459)
> at
> org.apache.phoenix.jdbc.PhoenixStatement$ExecutableExplainStatement.compilePlan(PhoenixStatement.java:438)
> at
> org.apache.phoenix.jdbc.PhoenixStatement$1.call(PhoenixStatement.java:266)
> at
> org.apache.phoenix.jdbc.PhoenixStatement$1.call(PhoenixStatement.java:261)
> at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
> at
> org.apache.phoenix.jdbc.PhoenixStatement.executeQuery(PhoenixStatement.java:260)
> at
> org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1349)
> at sqlline.Commands.execute(Commands.java:822)
> at sqlline.Commands.sql(Commands.java:732)
> at sqlline.SqlLine.dispatch(SqlLine.java:808)
> at sqlline.SqlLine.begin(SqlLine.java:681)
> at sqlline.SqlLine.start(SqlLine.java:398)
> at sqlline.SqlLine.main(SqlLine.java:292)
> {noformat}
> In this case, down in {{PUnsignedInt$UnsignedIntCodec#decodeInt}}, I see the
> parsed {{v}} is {{-1}}, and the if clause throws.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)