[
https://issues.apache.org/jira/browse/CALCITE-3065?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16846211#comment-16846211
]
Julian Hyde commented on CALCITE-3065:
--------------------------------------
The basic idea is that you call {{getLiteralAs}} with a class {{c}}, then the
value that comes back is an instance of {{c}}. This is a nice simple contract.
If {{c}} is {{int.class}}, then it is impossible to fulfill that contract. A
{{java.lang.Integer}} is not an instance of {{int.class}}. (No java object is
an instance of {{int.class}}.)
(Scala's type system may deceive you about that. But this is a Java API.)
As I said already, you can fix this by adding one line of code to your program.
That is better, in my opinion, than making the contract more complicated.
Regarding decimals. You are correct that Calcite internally stores all numeric
literals using {{BigDecimal}}. This is because {{BigDecimal}} can represent
every possible numeric literal value, and can do so without losing precision.
(If you store say 0.1 as a double, it will get rounded.) If you want to consume
the value as a {{java.math.BigDecimal}}, or as a {{java.lang.Number}}, or as an
{{java.lang.Integer}}, or as a {{java.lang.Float}}, you can do that, and the
API will convert the value to the type that you choose. But you cannot ask for
{{int}}, because we cannot give you an {{int}}.
> RexLiteral#getValueAs should consider primitive type
> ----------------------------------------------------
>
> Key: CALCITE-3065
> URL: https://issues.apache.org/jira/browse/CALCITE-3065
> Project: Calcite
> Issue Type: Improvement
> Components: core
> Reporter: Jiatao Tao
> Priority: Major
> Labels: pull-request-available
> Attachments: image-2019-05-13-12-04-36-365.png,
> image-2019-05-17-08-23-52-735.png
>
> Time Spent: 40m
> Remaining Estimate: 0h
>
> !image-2019-05-13-12-04-36-365.png!
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)