Hequn Cheng created CALCITE-2683:
------------------------------------

             Summary: ProjectMergeRule should not be performed when 
Nondeterministic udf has been referenced more than once
                 Key: CALCITE-2683
                 URL: https://issues.apache.org/jira/browse/CALCITE-2683
             Project: Calcite
          Issue Type: Bug
          Components: core
            Reporter: Hequn Cheng
            Assignee: Hequn Cheng


Currently, there are some merge rules for project, such as {{CalcMergeRule}}, 
{{ProjectMergeRule}}, and {{ProjectCalcMergeRule}}. I found that these merge 
rules should not be performed when Nondeterministic expression of the bottom 
project has been referenced more than once by the top project. Take the 
following test as an example:
{code:java}
  @Test public void testProjectMergeCalcMergeWithNonDeterministic() throws 
Exception {
    HepProgram program = new HepProgramBuilder()
            .addRuleInstance(FilterProjectTransposeRule.INSTANCE)
            .addRuleInstance(ProjectMergeRule.INSTANCE)
            .build();

    checkPlanning(program,
            "select name, a as a1, a as a2 from (\n"
                    + "  select *, rand() as a\n"
                    + "  from dept)\n"
                    + "where deptno = 10\n");
  }
{code}
The result plan is 
{code:java}
LogicalProject(NAME=[$1], {color:red}A1{color}=[RAND()], 
{color:red}A2{color}=[RAND()])
  LogicalFilter(condition=[=($0, 10)])
    LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
{code}
In the plan, {color:red}A1{color} may not equal to {color:red}A2{color} since 
the two projects are merged which is against the SQL.
One option to solve the problem is to disable these merge rules in such cases. 
What do you guys think? Any suggestions are greatly appreciated.




--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to