You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "TisNotT (Jira)" <ji...@apache.org> on 2019/10/02 03:17:00 UTC

[jira] [Commented] (CALCITE-3385) fields in diffrent tables has the same order will occur a bug

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

TisNotT commented on CALCITE-3385:
----------------------------------

Pr https://github.com/apache/calcite/pull/1479  

> fields in diffrent tables has the same order will occur a bug
> -------------------------------------------------------------
>
>                 Key: CALCITE-3385
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3385
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: TisNotT
>            Priority: Major
>
> origin is use table'field no. But if fields in diffrent tables has the same order.That say
> leftFactorColMapping.put( colOrigin.getOriginColumnOrdinal(), i);
> leftFactorColMapping the after will override the before.So i want to add table's qualifiedNames to
> differentiate.
> test case just complex, I have write 3 hours already
> CALCITE-3379 is flowed by github,not apache issue. I also known there is an issue just now.
> my test code like that `
> /*
> Licensed to the Apache Software Foundation (ASF) under one or more
> contributor license agreements. See the NOTICE file distributed with
> this work for additional information regarding copyright ownership.
> The ASF licenses this file to you under the Apache License, Version 2.0
> (the "License"); you may not use this file except in compliance with
> the License. You may obtain a copy of the License at
> http://www.apache.org/licenses/LICENSE-2.0
> Unless required by applicable law or agreed to in writing, software
> distributed under the License is distributed on an "AS IS" BASIS,
> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> See the License for the specific language governing permissions and
> limitations under the License.
> */
> package org.apache.calcite.rel.rules;
> import static org.hamcrest.CoreMatchers.allOf;
> import static org.hamcrest.CoreMatchers.containsString;
> import static org.hamcrest.CoreMatchers.not;
> import static org.junit.Assert.assertThat;
> import org.apache.calcite.adapter.enumerable.EnumerableConvention;
> import org.apache.calcite.plan.ConventionTraitDef;
> import org.apache.calcite.plan.RelOptUtil;
> import org.apache.calcite.plan.RelTraitSet;
> import org.apache.calcite.plan.hep.HepPlanner;
> import org.apache.calcite.rel.RelCollationTraitDef;
> import org.apache.calcite.rel.RelNode;
> import org.apache.calcite.rel.RelRoot;
> import org.apache.calcite.schema.SchemaPlus;
> import org.apache.calcite.schemas.HrClusteredSchema;
> import org.apache.calcite.sql.SqlExplainFormat;
> import org.apache.calcite.sql.SqlExplainLevel;
> import org.apache.calcite.sql.SqlNode;
> import org.apache.calcite.sql.parser.SqlParseException;
> import org.apache.calcite.sql.parser.SqlParser;
> import org.apache.calcite.tools.FrameworkConfig;
> import org.apache.calcite.tools.Frameworks;
> import org.apache.calcite.tools.Planner;
> import org.apache.calcite.tools.Programs;
> import org.apache.calcite.tools.RelConversionException;
> import org.apache.calcite.tools.RuleSet;
> import org.apache.calcite.tools.RuleSets;
> import org.apache.calcite.tools.ValidationException;
> import org.apache.calcite.util.Util;
> import org.junit.Test;
> /**
> Tests the application of the {@link LoptMultiJoin}.
> */
> public class LoptMultiJoinTest {
> @test public void addRemovableSelfJoinPair()
> throws SqlParseException, ValidationException, RelConversionException {
> RuleSet prepareRules =
> RuleSets.ofList(
> LoptOptimizeJoinRule.INSTANCE);
> SchemaPlus rootSchema = Frameworks.createRootSchema(true);
> SchemaPlus defSchema = rootSchema.add("hr", new HrClusteredSchema());
> FrameworkConfig config = Frameworks.newConfigBuilder()
> .parserConfig(SqlParser.Config.DEFAULT)
> .defaultSchema(defSchema)
> .traitDefs(ConventionTraitDef.INSTANCE, RelCollationTraitDef.INSTANCE)
> .programs(Programs.of(prepareRules))
> .build();
> String sql
>     = "SELECT a.ename,a.dname,a.count_ename ,b.count_dname from "
>     + " ( SELECT EMPS.\"name\" ename,DEPTS.\"name\" dname,"
>     + "COUNT(DISTINCT EMPS.\"name\") count_ename "
>     + "FROM \"hr\".\"emps\" EMPS,\"hr\".\"depts\" DEPTS "
>     + "WHERE EMPS.\"deptno\" = DEPTS.\"deptno\" "
>     + "GROUP  BY EMPS.\"name\",DEPTS.\"name\" ) a "
>     + " inner join "
>     + " ( SELECT EMPS1.\"name\" ename ,DEPTS1.\"name\" dname ,"
>     + " COUNT(DISTINCT DEPTS1.\"name\") count_dname "
>     + "FROM \"hr\".\"emps\" EMPS1,\"hr\".\"depts\" DEPTS1 "
>     + "WHERE EMPS1.\"deptno\" = DEPTS1.\"deptno\" "
>     + "GROUP  BY EMPS1.\"name\",DEPTS1.\"name\" ) b"
>     + " on  a.ename = b.ename and a.dname=b.dname ";
> // System.out.print(sql);
> Planner planner = Frameworks.getPlanner(config);
> SqlNode parse = planner.parse(sql);
> SqlNode validate = planner.validate(parse);
> RelRoot planRoot = planner.rel(validate);
> RelNode planBefore = planRoot.rel;
> // String beforeStr = toString(planBefore);
> RelTraitSet desiredTraits = planBefore.getTraitSet()
>     .replace(EnumerableConvention.INSTANCE);
> RelNode planAfter = LoptOptimizeJoinRule.INSTANCE.onMatch(planAfter);
> System.out.print(toString(planAfter));
> assertThat(
>     toString(planAfter),
>     allOf(
>         containsString("ENAME=[$0]"),
>         not(containsString("ENAME=[$1]"))));
> }
> private String toString(RelNode rel) {
> return Util.toLinux(
> RelOptUtil.dumpPlan("", rel, SqlExplainFormat.TEXT,
> SqlExplainLevel.DIGEST_ATTRIBUTES));
> }
> }
> // End LoptMultiJoinTest.java
> bug is like that
> LogicalProject(subset=[rel#59:Subset#10.ENUMERABLE.[]], _ENAME=[$1],_ DNAME=[$1], COUNT_ENAME=[$2], COUNT_DNAME=[$7]) 
> But it should be this
> LogicalProject(subset=[rel#59:Subset#10.ENUMERABLE.[]], _ENAME=[$0]_, DNAME=[$1], COUNT_ENAME=[$2], COUNT_DNAME=[$7])
> Notice
> ENAME=[$1] and ENAME=[$0]
> The reason is Both emps and depts have same field name ,but the ordinal is diffrent.
> leftFactorColMapping.put( colOrigin.getOriginColumnOrdinal(), i); 
> The later will replace before.
> I found this bug in my product code with a big sql. But have some diffcult to make a test case to reappear.



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