aboutsummaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorReynold Xin <rxin@apache.org>2014-06-19 23:58:23 -0700
committerReynold Xin <rxin@apache.org>2014-06-19 23:58:23 -0700
commit61756409736a64bd42577782cb7468557fa0b642 (patch)
treebc3a2f945e76037cf67cef450a77c3cdd7dcc3d0 /sql
parentf479cf3743e416ee08e62806e1b34aff5998ac22 (diff)
downloadspark-61756409736a64bd42577782cb7468557fa0b642.tar.gz
spark-61756409736a64bd42577782cb7468557fa0b642.tar.bz2
spark-61756409736a64bd42577782cb7468557fa0b642.zip
[SPARK-2210] cast to boolean on boolean value gets turned into NOT((boolean_condition) = 0)
``` explain select cast(cast(key=0 as boolean) as boolean) aaa from src ``` should be ``` [Physical execution plan:] [Project [(key#10:0 = 0) AS aaa#7]] [ HiveTableScan [key#10], (MetastoreRelation default, src, None), None] ``` However, it is currently ``` [Physical execution plan:] [Project [NOT((key#10=0) = 0) AS aaa#7]] [ HiveTableScan [key#10], (MetastoreRelation default, src, None), None] ``` Author: Reynold Xin <rxin@apache.org> Closes #1144 from rxin/booleancast and squashes the following commits: c4e543d [Reynold Xin] [SPARK-2210] boolean cast on boolean value should be removed.
Diffstat (limited to 'sql')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercion.scala4
-rw-r--r--sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveTypeCoercionSuite.scala25
2 files changed, 27 insertions, 2 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercion.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercion.scala
index 6d331fb501..c0714bcdd0 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercion.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercion.scala
@@ -251,7 +251,9 @@ trait HiveTypeCoercion {
def apply(plan: LogicalPlan): LogicalPlan = plan transformAllExpressions {
// Skip nodes who's children have not been resolved yet.
case e if !e.childrenResolved => e
-
+ // Skip if the type is boolean type already. Note that this extra cast should be removed
+ // by optimizer.SimplifyCasts.
+ case Cast(e, BooleanType) if e.dataType == BooleanType => e
case Cast(e, BooleanType) => Not(Equals(e, Literal(0)))
case Cast(e, dataType) if e.dataType == BooleanType =>
Cast(If(e, Literal(1), Literal(0)), dataType)
diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveTypeCoercionSuite.scala b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveTypeCoercionSuite.scala
index e030c8ee3d..cc8744c966 100644
--- a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveTypeCoercionSuite.scala
+++ b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveTypeCoercionSuite.scala
@@ -17,8 +17,12 @@
package org.apache.spark.sql.hive.execution
+import org.apache.spark.sql.catalyst.expressions.{Cast, Equals}
+import org.apache.spark.sql.execution.Project
+import org.apache.spark.sql.hive.test.TestHive
+
/**
- * A set of tests that validate type promotion rules.
+ * A set of tests that validate type promotion and coercion rules.
*/
class HiveTypeCoercionSuite extends HiveComparisonTest {
val baseTypes = Seq("1", "1.0", "1L", "1S", "1Y", "'1'")
@@ -28,4 +32,23 @@ class HiveTypeCoercionSuite extends HiveComparisonTest {
createQueryTest(s"$i + $j", s"SELECT $i + $j FROM src LIMIT 1")
}
}
+
+ test("[SPARK-2210] boolean cast on boolean value should be removed") {
+ val q = "select cast(cast(key=0 as boolean) as boolean) from src"
+ val project = TestHive.hql(q).queryExecution.executedPlan.collect { case e: Project => e }.head
+
+ // No cast expression introduced
+ project.transformAllExpressions { case c: Cast =>
+ assert(false, "unexpected cast " + c)
+ c
+ }
+
+ // Only one Equals
+ var numEquals = 0
+ project.transformAllExpressions { case e: Equals =>
+ numEquals += 1
+ e
+ }
+ assert(numEquals === 1)
+ }
}