Hi Aman
     Thank you for reply,please tell me when you find the enhancement JIRA
Jianqing F
-----------------------------------------------------------------
发件人:Aman Sinha <[email protected]
发送时间:2018年5月25日(星期五) 23:1
收件人:dev <[email protected]>; 傅建庆(天池) <[email protected]
主 题:Re: Why remaining.isAlwaysTrue() is necessary in JoinUtils.getJoinCategory 
in Dril
Hi Jianqing,
This happens because the ON clause of the join has a single column predicate 
(in addition to the join predicate).  Currently, Drill does not support that 
regardless of equality or in-equality.
Here's a simplified query's Calcite logical plan.  Note that the local 
predicate l_suppkey = 5 is on the DrillJoinRel, not pushed down since it is on 
the left side of the LOJ (it would be pushed down if this condition is in the 
WHERE clause instead of ON).
Currently Drill's join operator only evaluates predicates of type  t1.a1 = 
t2.a2, so when Drill's planner tries to generate the physical plan it fails 
with the error message about cartesian join or 'inquality join'.   So, the code 
you sent is needed for now but I believe there's an enhancement JIRA about 
supporting such predicates in the join operator (I will need to find it).  
Separately, the error message should be improved.
explain plan without implementation for select * from 
cp.`tpch/lineitem.parquet` l left outer join cp.`tpch/orders.parquet` o on 
l.l_orderkey = o.o_orderkey AND l.l_suppkey = 5
DrillScreenRe
  DrillProjectRel(**=[$0], **0=[$3]
DrillJoinRel(condition=[AND(=($1, $4), =($2, 5))], joinType=[left]
      DrillScanRel(table=[[cp, tpch/lineitem.parquet]], 
groupscan=[ParquetGroupScan [entries=[ReadEntryWithPath 
[path=classpath:/tpch/lineitem.parquet]], 
selectionRoot=classpath:/tpch/lineitem.parquet, numFiles=1, numRowGroups=1, 
usedMetadataFile=false, columns=[`**`]]]
      DrillScanRel(table=[[cp, tpch/orders.parquet]], 
groupscan=[ParquetGroupScan [entries=[ReadEntryWithPath 
[path=classpath:/tpch/orders.parquet]], 
selectionRoot=classpath:/tpch/orders.parquet, numFiles=1, numRowGroups=1, 
usedMetadataFile=false, columns=[`**`]]]
0: jdbc:drill:zk=local> explain plan for select * from 
cp.`tpch/lineitem.parquet` l left outer join cp.`tpch/orders.parquet` o on 
l.l_orderkey = o.o_orderkey AND l.l_suppkey = 5
Error: UNSUPPORTED_OPERATION ERROR: This query cannot be planned possibly due 
to either a cartesian join or an inequality joi
On Thu, May 24, 2018 at 11:00 PM, 傅建庆(天池) <[email protected]> wrote
Hi, all
           I am an engineering working in alibaba, could i ask you a question
           One of my sqls runs failed during the phase of getPlan, because it 
is regarded as containing an inequality join, but in fact it is'nt
           I found that there is a condition "!remaining.isAlwaysTrue()" in 
line 253 of JoinUtils.java, and there is a line of comment "for practical 
purposes these cases could be treated as inequality" in line 254 
           If i remove the condition "!remaining.isAlwaysTrue()",then my sql 
runs well in drill
           So my question is "Why remaining.isAlwaysTrue() is necessary in 
JoinUtils.getJoinCategory?", could you show me a sql
 Thank you
 Jianqing F
 JoinUtils.getJoinCategory in Drill
 public static JoinCategory getJoinCategory(RelNode left, RelNode right, 
RexNode condition
          List<Integer> leftKeys, List<Integer> rightKeys, List<Boolean> 
filterNulls) 
          if (condition.isAlwaysTrue()) 
                   return JoinCategory.CARTESIAN
          
          leftKeys.clear()
          rightKeys.clear()
          filterNulls.clear()
          RexNode remaining = RelOptUtil.splitJoinCondition(left, right, 
condition, leftKeys, rightKeys, filterNulls)
          if (!remaining.isAlwaysTrue() || (leftKeys.size() == 0 || 
rightKeys.size() == 0) ) 
                   // for practical purposes these cases could be treated as 
inequalit
                   return JoinCategory.INEQUALITY
          
          return JoinCategory.EQUALITY
 }
 My SQL
 select * fro
 odps.tbbi.dim_tm_fans_brand_info 
 left join (select * from odps.tbcdm.dim_tb_cate where ds='20180514')
 on a.ds = b.d
 and a.brand_id = '20021
 where a.ds='20180514
 limit 

Reply via email to