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

Danny Chen commented on CALCITE-4055:
-------------------------------------

I got your concerns, you can re-propagate the hints to the new rel tree[1] just 
like what we do for planner rules, also, if you are sure that the trim would 
generate solid pattern, you can also call [2], notice that it has a flag to 
control if we can filter the hints by strategies.

[1] 
https://github.com/apache/calcite/blob/7c5c7e3b77b6a7606e1295dd7c47815cbbe10871/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java#L423
[2] 
https://github.com/apache/calcite/blob/7c5c7e3b77b6a7606e1295dd7c47815cbbe10871/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java#L477

> RelFieldTrimmer loses join hints
> --------------------------------
>
>                 Key: CALCITE-4055
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4055
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.23.0
>            Reporter: Ruben Q L
>            Assignee: Ruben Q L
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> The trimmed plan generated by RelFieldTrimmer can lose the hints that might 
> be present in the input plan.
> The issue can be reproduced with the following test (to be added to 
> RelFieldTrimmerTest):
> {code:java}
>   @Test void testJoinWithHints() {
>     final RelHint noHashJoinHint = 
> RelHint.builder("NO_HASH_JOIN").inheritPath(0).build();
>     final RelBuilder builder = RelBuilder.create(config().build());
>     final RelNode original =
>         builder.scan("EMP")
>             .scan("DEPT")
>             .join(JoinRelType.INNER,
>                 builder.equals(
>                     builder.field(2, 0, "DEPTNO"),
>                     builder.field(2, 1, "DEPTNO")))
>             .hints(noHashJoinHint)
>             .project(
>                 builder.field("ENAME"),
>                 builder.field("DNAME"))
>             .build();
>     final RelFieldTrimmer fieldTrimmer = new RelFieldTrimmer(null, builder);
>     final RelNode trimmed = fieldTrimmer.trim(original);
>     final String expected = ""
>         + "LogicalProject(ENAME=[$1], DNAME=[$4])\n"
>         + "  LogicalJoin(condition=[=($2, $3)], joinType=[inner])\n"
>         + "    LogicalProject(EMPNO=[$0], ENAME=[$1], DEPTNO=[$7])\n"
>         + "      LogicalTableScan(table=[[scott, EMP]])\n"
>         + "    LogicalProject(DEPTNO=[$0], DNAME=[$1])\n"
>         + "      LogicalTableScan(table=[[scott, DEPT]])\n";
>     assertThat(trimmed, hasTree(expected));
>     assertTrue(original.getInput(0) instanceof Join);
>     final Join originalJoin = (Join) original.getInput(0);
>     assertTrue(originalJoin.getHints().contains(noHashJoinHint));
>     assertTrue(trimmed.getInput(0) instanceof Join);
>     final Join join = (Join) trimmed.getInput(0);
>     assertTrue(join.getHints().contains(noHashJoinHint));
>   }
> {code}
> which fails in the last line: 
> {{assertTrue(join.getHints().contains(noHashJoinHint));}}



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

Reply via email to