[ 
https://issues.apache.org/jira/browse/CALCITE-1018?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Maryann Xue resolved CALCITE-1018.
----------------------------------
       Resolution: Fixed
         Assignee: Maryann Xue
    Fix Version/s: 1.6.0

Fixed in http://git-wip-us.apache.org/repos/asf/calcite/commit/84b55ef.

> SortJoinTransposeRule not firing due to getMaxRowCount(RelSubset) returning 
> null
> --------------------------------------------------------------------------------
>
>                 Key: CALCITE-1018
>                 URL: https://issues.apache.org/jira/browse/CALCITE-1018
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Maryann Xue
>            Assignee: Maryann Xue
>             Fix For: 1.6.0
>
>         Attachments: CALCITE-1018.01.patch, CALCITE-1018.repro.diff
>
>
> getMaxRowCount(RelSubset) defaults to getMaxRowCount(RelNode) and returns 
> null, so if the Join rel has its outer child rel as a RelSubset, the 
> SortJoinTransposeRule will fail the checkInputForCollationAndLimit check and 
> will not proceed to push down a limit through join.
> Before fix of CALCITE-995 and CALCITE-987, getMaxRowCount(RelSubset) would 
> return positive infinity, which would cause similar situation but an opposite 
> effect as firing the rule infinitely when the join's outer child is a 
> RelSubset.
> Neither of the above situation was reflected in the test cases for 
> SortJoinTransposeRule in Calcite, since the RelSubset condition was not 
> covered by RelOptRule test which uses HepPlanner running with just one or no 
> more than a couple of rules together.
> Basically we need a more accurate way to get max row count for RelSubset 
> (similarly for HexVertex as well), otherwise checkInputForCollationAndLimit 
> would either always fail or always succeed for a Limit over a Join over a 
> RelSubset. But I assume, to be real accurate, we'd have to introduce a 
> similar mechanism to one that computes bestCost in RelSubset, which I doubt 
> would be worth it.
> Another way, which might seem a little ugly, is to add something like 
> "isSortPushedThrough()" in Sort rel, similar to "isSemiJoinDone()" in Join, 
> in order to avoid the rule being fired infinitely.
> In my Phoenix project, I applied a temporary fix, but it proved to work:
> {code}
> public class PhoenixRelMdMaxRowCount {
>     public static final RelMetadataProvider SOURCE =
>             ReflectiveRelMetadataProvider.reflectiveSource(
>                 BuiltInMethod.MAX_ROW_COUNT.method, new 
> PhoenixRelMdMaxRowCount());
>     private PhoenixRelMdMaxRowCount() {
>     }
>     public Double getMaxRowCount(RelSubset rel) {
>         for (RelNode node : rel.getRels()) {
>             if (node instanceof Sort) {
>                 Sort sort = (Sort) node;
>                 if (sort.fetch != null) {
>                     return (double) RexLiteral.intValue(sort.fetch);
>                 }
>             }
>         }
>         
>         return Double.POSITIVE_INFINITY;
>     }
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to