You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Ruben Q L (Jira)" <ji...@apache.org> on 2020/06/09 10:37:00 UTC

[jira] [Created] (CALCITE-4055) RelFieldTrimmer loses hints

Ruben Q L created CALCITE-4055:
----------------------------------

             Summary: RelFieldTrimmer loses 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


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)