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)