[
https://issues.apache.org/jira/browse/CALCITE-794?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15058756#comment-15058756
]
Julian Hyde commented on CALCITE-794:
-------------------------------------
As of
https://github.com/julianhyde/calcite/commit/779d72523690d8f4c41a5c209c108937a7bb3057
all tests on the 794-cycles branch pass, and performance is at par with the
master branch. So, we can merge into master.
To achieve adequate performance, I had to prevent some of the RelMdXxxx methods
from looking into all of the children of RelSubset. To be clear, this leaves us
no worse off than master branch, and we now have an API that can detect cycles.
I think the solution is to add some caching, maybe within the RelMetadataQuery.
I still need reviewers from Hive and Drill. [~jcamachorodriguez] and
[~jnadeau], can you review or suggest someone.
> Detect cycles when computing statistics
> ---------------------------------------
>
> Key: CALCITE-794
> URL: https://issues.apache.org/jira/browse/CALCITE-794
> Project: Calcite
> Issue Type: Bug
> Reporter: Julian Hyde
> Assignee: Julian Hyde
> Fix For: next
>
>
> The graph of RelNodes is allowed to be cyclic. This causes problems when
> evaluating certain metadata, for example RelMetataQuery.areColumnsUnique.
> While computing the value for RelNode r, it might recurse through say a
> Project and hit r again. This causes a stack overflow.
> We solve this by adding a map or set of active RelNodes. The map is stored
> within RelMetadataQuery, which can now be instantiated, and its methods are
> no longer static. The first call should instantiate a RelMetadataQuery, but
> all subsequent calls for metadata (perhaps several kinds of metadata) will
> use the same RelMetadataQuery instance, hence the same map.
> Also add a RelMetadataQuery argument to the static "handler" methods in
> RelMdColumnUniqueness and similar classes.
> This is a breaking change for people who have written a metadata handler, and
> might be subtle to detect, because the methods are invoked via reflection.
> For code that is just using RelMetadataQuery methods, the change is still
> breaking, but the break points and remedy will be obvious: the methods are no
> longer static, so they need to change RelMetadataQuery.foo() to
> RelMetadataQuery.instance().foo().
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)