Repository: spark
Updated Branches:
  refs/heads/branch-1.0 c6421b6f6 -> 6b0804640


[SPARK-2658][SQL] Add rule for true = 1.

Author: Michael Armbrust <mich...@databricks.com>

Closes #1556 from marmbrus/fixBooleanEqualsOne and squashes the following 
commits:

ad8edd4 [Michael Armbrust] Add rule for true = 1 and false = 0.

(cherry picked from commit 78d18fdbaa62d8ed235c29b2e37fd6607263c639)
Signed-off-by: Reynold Xin <r...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/6b080464
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/6b080464
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/6b080464

Branch: refs/heads/branch-1.0
Commit: 6b080464017b2d10da958b2fd65b85e363e4fe5c
Parents: c6421b6
Author: Michael Armbrust <mich...@databricks.com>
Authored: Wed Jul 23 22:52:49 2014 -0700
Committer: Reynold Xin <r...@apache.org>
Committed: Wed Jul 23 22:53:05 2014 -0700

----------------------------------------------------------------------
 .../spark/sql/catalyst/analysis/HiveTypeCoercion.scala  | 12 +++++++++++-
 .../boolean = number-0-6b6975fa1892cc48edd87dc0df48a7c0 |  1 +
 .../spark/sql/hive/execution/HiveQuerySuite.scala       | 12 ++++++++++++
 3 files changed, 24 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/spark/blob/6b080464/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercion.scala
----------------------------------------------------------------------
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 76ddeba..9887856 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
@@ -231,10 +231,20 @@ trait HiveTypeCoercion {
    * Changes Boolean values to Bytes so that expressions like true < false can 
be Evaluated.
    */
   object BooleanComparisons extends Rule[LogicalPlan] {
+    val trueValues = Seq(1, 1L, 1.toByte, 1.toShort, 
BigDecimal(1)).map(Literal(_))
+    val falseValues = Seq(0, 0L, 0.toByte, 0.toShort, 
BigDecimal(0)).map(Literal(_))
+
     def apply(plan: LogicalPlan): LogicalPlan = plan transformAllExpressions {
       // Skip nodes who's children have not been resolved yet.
       case e if !e.childrenResolved => e
-      // No need to change EqualTo operators as that actually makes sense for 
boolean types.
+
+      // Hive treats (true = 1) as true and (false = 0) as true.
+      case EqualTo(l @ BooleanType(), r) if trueValues.contains(r) => l
+      case EqualTo(l, r @ BooleanType()) if trueValues.contains(l) => r
+      case EqualTo(l @ BooleanType(), r) if falseValues.contains(r) => Not(l)
+      case EqualTo(l, r @ BooleanType()) if falseValues.contains(l) => Not(r)
+
+      // No need to change other EqualTo operators as that actually makes 
sense for boolean types.
       case e: EqualTo => e
       // Otherwise turn them to Byte types so that there exists and ordering.
       case p: BinaryComparison

http://git-wip-us.apache.org/repos/asf/spark/blob/6b080464/sql/hive/src/test/resources/golden/boolean
 = number-0-6b6975fa1892cc48edd87dc0df48a7c0
----------------------------------------------------------------------
diff --git a/sql/hive/src/test/resources/golden/boolean = 
number-0-6b6975fa1892cc48edd87dc0df48a7c0 
b/sql/hive/src/test/resources/golden/boolean = 
number-0-6b6975fa1892cc48edd87dc0df48a7c0
new file mode 100644
index 0000000..4d1ebdc
--- /dev/null
+++ b/sql/hive/src/test/resources/golden/boolean = 
number-0-6b6975fa1892cc48edd87dc0df48a7c0    
@@ -0,0 +1 @@
+true   true    true    true    true    true    false   false   false   false   
false   false   false   false   false   false   false   false   true    true    
true    true    true    true    false   false   false   false   false   false   
false   false   false   false   false   false

http://git-wip-us.apache.org/repos/asf/spark/blob/6b080464/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveQuerySuite.scala
----------------------------------------------------------------------
diff --git 
a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveQuerySuite.scala
 
b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveQuerySuite.scala
index d57e99d..cba8de6 100644
--- 
a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveQuerySuite.scala
+++ 
b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/HiveQuerySuite.scala
@@ -30,6 +30,18 @@ case class TestData(a: Int, b: String)
  */
 class HiveQuerySuite extends HiveComparisonTest {
 
+  createQueryTest("boolean = number",
+    """
+      |SELECT
+      |  1 = true, 1L = true, 1Y = true, true = 1, true = 1L, true = 1Y,
+      |  0 = true, 0L = true, 0Y = true, true = 0, true = 0L, true = 0Y,
+      |  1 = false, 1L = false, 1Y = false, false = 1, false = 1L, false = 1Y,
+      |  0 = false, 0L = false, 0Y = false, false = 0, false = 0L, false = 0Y,
+      |  2 = true, 2L = true, 2Y = true, true = 2, true = 2L, true = 2Y,
+      |  2 = false, 2L = false, 2Y = false, false = 2, false = 2L, false = 2Y
+      |FROM src LIMIT 1
+    """.stripMargin)
+
   test("CREATE TABLE AS runs once") {
     hql("CREATE TABLE foo AS SELECT 1 FROM src LIMIT 1").collect()
     assert(hql("SELECT COUNT(*) FROM foo").collect().head.getLong(0) === 1,

Reply via email to