qianshen created CALCITE-4772:
---------------------------------

             Summary: PushProjecto convert bug
                 Key: CALCITE-4772
                 URL: https://issues.apache.org/jira/browse/CALCITE-4772
             Project: Calcite
          Issue Type: New Feature
          Components: core
    Affects Versions: 1.27.0
            Reporter: qianshen
         Attachments: image-2021-09-13-11-36-26-902.png

 
{code:java}
// source sql
SELECT  USER_ID
        ,USER_NAME
        ,DEPT_NO
        ,ROLE_ID
        ,ROLE_NAME
        ,ROLE_NO
        ,ID
        ,NAME
        ,id + age as dt
        
FROM    (
            SELECT  user_id,user_name,dept_no
            FROM    user_info
            WHERE   dept_no > 20
        ) AS USER_INFO
LEFT JOIN    (
                 SELECT  role_id,role_name,role_no
                 FROM    role_info
                 WHERE   role_no > 20
             ) AS role_info
ON      USER_ID = ROLE_ID
LEFT JOIN    (
                 SELECT  id,name,age
                 FROM    ld_ant_test.dim
                 WHERE   age >22 and (name='a' or name ='b')
             ) dim
ON      dim.id = USER_INFO.USER_ID where user_name='a'


//execute plan 
LogicalProject(USER_ID=[$0], USER_NAME=[$1], DEPT_NO=[$2], ROLE_ID=[$3], 
ROLE_NAME=[$4], ROLE_NO=[$5], ID=[$6], NAME=[$7], dt=[+($6, $8)])
  LogicalFilter(condition=[=($1, 'a')])
    LogicalJoin(condition=[=($6, $0)], joinType=[left])
      LogicalJoin(condition=[=($0, $3)], joinType=[left])
        LogicalProject(user_id=[$0], user_name=[$1], dept_no=[$2])
          LogicalFilter(condition=[>($2, 20)])
            LogicalTableScan(table=[[LD_ANT_TEST, USER_INFO]])
        LogicalProject(role_id=[$0], role_name=[$1], role_no=[$2])
          LogicalFilter(condition=[>($2, 20)])
            LogicalTableScan(table=[[LD_ANT_TEST, ROLE_INFO]])
      LogicalProject(id=[$0], name=[$1], age=[$2])
        LogicalFilter(condition=[AND(>($2, 22), OR(=($1, 'a'), =($1, 'b')))])
          LogicalTableScan(table=[[LD_ANT_TEST, DIM]])

{code}
use HepPlanner RBO rules  optimize.
 * CoreRules.FILTER_INTO_JOIN
 * CoreRules.PROJECT_JOIN_TRANSPOSE

 

After optimize 

 
{code:java}
//代码占位符
SELECT *
FROM (SELECT *
FROM (SELECT *
FROM (SELECT `USER_ID` AS `user_id`, `USER_NAME` AS `user_name`, `DEPT_NO` AS 
`dept_no`
FROM `LD_ANT_TEST`.`USER_INFO`
WHERE `DEPT_NO` > 20) AS `t0`
WHERE `user_name` = 'a') AS `t1`
LEFT JOIN (SELECT `ROLE_ID` AS `role_id`, `ROLE_NAME` AS `role_name`, `ROLE_NO` 
AS `role_no`
FROM `LD_ANT_TEST`.`ROLE_INFO`
WHERE `ROLE_NO` > 20) AS `t3` ON `t1`.`user_id` = `t3`.`role_id`) AS `t4`
LEFT JOIN (SELECT `ID` AS `id`, `NAME` AS `name`, `ID` + `AGE` AS `+`
FROM `LD_ANT_TEST`.`DIM`
WHERE `AGE` > 22 AND (`NAME` = 'a' OR `NAME` = 'b')) AS `t7` ON `t4`.`user_id` 
= `t7`.`id`


LogicalJoin(condition=[=($6, $0)], joinType=[left])
  LogicalProject(user_id=[$0], user_name=[$1], dept_no=[$2], role_id=[$3], 
role_name=[$4], role_no=[$5])
    LogicalJoin(condition=[=($0, $3)], joinType=[left])
      LogicalFilter(condition=[=($1, 'a')])
        LogicalProject(user_id=[$0], user_name=[$1], dept_no=[$2])
          LogicalFilter(condition=[>($2, 20)])
            LogicalTableScan(table=[[LD_ANT_TEST, USER_INFO]])
      LogicalProject(role_id=[$0], role_name=[$1], role_no=[$2])
        LogicalFilter(condition=[>($2, 20)])
          LogicalTableScan(table=[[LD_ANT_TEST, ROLE_INFO]])
  LogicalProject(id=[$0], name=[$1], +=[+($0, $2)])
    LogicalProject(id=[$0], name=[$1], age=[$2])
      LogicalFilter(condition=[AND(>($2, 22), OR(=($1, 'a'), =($1, 'b')))])
        LogicalTableScan(table=[[LD_ANT_TEST, DIM]])
{code}
 

In the original SQL, the query column{color:#FF0000} id + age alias was 
dt{color}. After optimization, {color:#FF0000}the incorrect alias + was 
used.{color}

After querying the source code, the problem appears in 
{color:#FF0000}PushProjector.java#567 {color}

!image-2021-09-13-11-36-26-902.png!

 



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

Reply via email to