Juliusz Sompolski created SPARK-23087:
-----------------------------------------

             Summary: CheckCartesianProduct too restrictive when condition is 
constant folded to false/null
                 Key: SPARK-23087
                 URL: https://issues.apache.org/jira/browse/SPARK-23087
             Project: Spark
          Issue Type: Bug
          Components: SQL
    Affects Versions: 2.2.1, 2.3.0
            Reporter: Juliusz Sompolski


Running
{code}
sql("SELECT id as a FROM RANGE(10)").createOrReplaceTempView("A")
sql("SELECT NULL as a FROM RANGE(10)").createOrReplaceTempView("NULLTAB")
sql("SELECT 1 as goo FROM A LEFT OUTER JOIN NULLTAB ON A.a = 
NULLTAB.a").collect()
{code}
results in:
{code}
org.apache.spark.sql.AnalysisException: Detected cartesian product for LEFT 
OUTER join between logical plans
Project
+- Range (0, 10, step=1, splits=None)
and
Project
+- Range (0, 10, step=1, splits=None)
Join condition is missing or trivial.
Use the CROSS JOIN syntax to allow cartesian products between these relations.;
  at 
 
org.apache.spark.sql.catalyst.optimizer.CheckCartesianProducts$$anonfun$apply$21.applyOrElse(Optimizer.scala:1121)
{code}

This is because NULLTAB.a is constant folded to null, and then the condition is 
constant folded altogether:
{code}
=== Applying Rule org.apache.spark.sql.catalyst.optimizer.NullPropagation ===
GlobalLimit 21                                      
 +- LocalLimit 21                                    
    +- Project [1 AS goo#28]                         
!      +- Join LeftOuter, (a#0L = null)              
          :- Project [id#1L AS a#0L]                 
          :  +- Range (0, 10, step=1, splits=None)   
          +- Project                                  
             +- Range (0, 10, step=1, splits=None) 

GlobalLimit 21
+- LocalLimit 21
   +- Project [1 AS goo#28]
      +- Join LeftOuter, null
         :- Project [id#1L AS a#0L]
         :  +- Range (0, 10, step=1, splits=None)
         +- Project
            +- Range (0, 10, step=1, splits=None)
{code}

And then CheckCartesianProduct doesn't like it, even though the condition does 
not produce a cartesian product, but evaluates to null.



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

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@spark.apache.org
For additional commands, e-mail: issues-h...@spark.apache.org

Reply via email to