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