[ 
https://issues.apache.org/jira/browse/CALCITE-4531?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17305948#comment-17305948
 ] 

Vladimir Sitnikov commented on CALCITE-4531:
--------------------------------------------

[~julianhyde], could you please clarify why do you think limit/offset must 
always fit into Java's int type?

Here's a sample:

{code:sql}  @Test void testLimitStar2() {
    CalciteAssert.hr()
        .query("select * from \"hr\".\"emps\"\n"
            + "limit " + Long.MAX_VALUE)
        .returns("...");
  }{code}

Current exception:
{noformat}
java.lang.AssertionError
        at 
org.apache.calcite.rel.metadata.RelMdUtil.isNonNegative(RelMdUtil.java:988)
        at 
org.apache.calcite.rel.metadata.RelMdUtil.validateResult(RelMdUtil.java:977)
        at 
org.apache.calcite.rel.metadata.RelMetadataQuery.getRowCount(RelMetadataQuery.java:219)
        at 
org.apache.calcite.rel.AbstractRelNode.computeSelfCost(AbstractRelNode.java:232)
        at 
org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows.getNonCumulativeCost(RelMdPercentageOriginalRows.java:184)
        at 
GeneratedMetadataHandler_NonCumulativeCost.getNonCumulativeCost_$(Unknown 
Source)
        at 
GeneratedMetadataHandler_NonCumulativeCost.getNonCumulativeCost(Unknown Source)
        at 
org.apache.calcite.rel.metadata.RelMetadataQuery.getNonCumulativeCost(RelMetadataQuery.java:294)
        at 
org.apache.calcite.plan.volcano.VolcanoPlanner.getCost(VolcanoPlanner.java:740)
        at 
org.apache.calcite.plan.volcano.VolcanoPlanner.getCostOrInfinite(VolcanoPlanner.java:727)
        at 
org.apache.calcite.plan.volcano.VolcanoPlanner.propagateCostImprovements(VolcanoPlanner.java:984)
        at 
org.apache.calcite.plan.volcano.VolcanoPlanner.addRelToSet(VolcanoPlanner.java:1421)
        at 
org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1381)
        at 
org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:611)
        at 
org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:626)
        at 
org.apache.calcite.plan.volcano.VolcanoRuleCall.transformTo(VolcanoRuleCall.java:154)
        at 
org.apache.calcite.plan.RelOptRuleCall.transformTo(RelOptRuleCall.java:269)
        at 
org.apache.calcite.plan.RelOptRuleCall.transformTo(RelOptRuleCall.java:284)
        at 
org.apache.calcite.adapter.enumerable.EnumerableLimitRule.onMatch(EnumerableLimitRule.java:59)
        at 
org.apache.calcite.plan.volcano.VolcanoRuleCall.onMatch(VolcanoRuleCall.java:239)
        at 
org.apache.calcite.plan.volcano.IterativeRuleDriver.drive(IterativeRuleDriver.java:61)
        at 
org.apache.calcite.plan.volcano.VolcanoPlanner.findBestExp(VolcanoPlanner.java:529)
        at 
org.apache.calcite.tools.Programs.lambda$standard$3(Programs.java:275)
        at 
org.apache.calcite.tools.Programs$SequenceProgram.run(Programs.java:335)
        at org.apache.calcite.prepare.Prepare.optimize(Prepare.java:172)
        at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:306)
        at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:215)
        at 
org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:647)
        at 
org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:513)
        at 
org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:483)
        at 
org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:236)
        at 
org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:631)
        at 
org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:675)
        at 
org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:156)
        at 
org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:227)
        at 
org.apache.calcite.test.CalciteAssert.assertQuery(CalciteAssert.java:534)
        at 
org.apache.calcite.test.CalciteAssert$AssertQuery.lambda$returns$1(CalciteAssert.java:1546)
        at 
org.apache.calcite.test.CalciteAssert$AssertQuery.withConnection(CalciteAssert.java:1485)
        at 
org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1544)
        at 
org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1534)
        at 
org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1497)
        at org.apache.calcite.test.JdbcTest.testLimitStar2(JdbcTest.java:3395)
{noformat}

> Deprecate RexLiteral#intValue since it performs silent truncation
> -----------------------------------------------------------------
>
>                 Key: CALCITE-4531
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4531
>             Project: Calcite
>          Issue Type: Improvement
>          Components: core
>            Reporter: Vladimir Sitnikov
>            Priority: Critical
>
> {{RexLiteral#intValue}} is prone to errors since it silently truncates values 
> to {{int}} so the developers might fail to know that at the compile time.
> It might be safer to expose {{BigDecimal}} or {{intValueExact}} or 
> {{doubleValue}} alternatives which would be "enough for all the possible 
> cases".
> An alternative option is to mark the method as deprecated, so every use of 
> the method would require users to suppress the warning, so they know why the 
> method is deprecated.
> I guess the most common use case for {{RexLiteral.intValue}} is {{offset}} 
> and {{fetch}} in {{Sort}}, however, the misuse is hard to spot, and it might 
> result in hard to notice data corruptions.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to