From acef5de5b4111c1f2422431ebf31bc9cd5ba76c0 Mon Sep 17 00:00:00 2001 From: Sephiroth-Lin Date: Mon, 6 Jun 2016 22:42:42 +0800 Subject: [PATCH 1/2] Type coercion incorrect --- .../org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala index a5b5b91e4ab3a..ac9901f88b6aa 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala @@ -52,10 +52,10 @@ object TypeCoercion { DecimalPrecision :: BooleanEquality :: StringToIntegralCasts :: + Division :: FunctionArgumentConversion :: CaseWhenCoercion :: IfCoercion :: - Division :: PropagateTypes :: ImplicitTypeCasts :: DateTimeOperations :: From e396735b54909e989fbf3c9ed5f6157c8b47895b Mon Sep 17 00:00:00 2001 From: Sephiroth-Lin Date: Fri, 10 Jun 2016 20:36:56 +0800 Subject: [PATCH 2/2] Add UT --- .../org/apache/spark/sql/SQLQuerySuite.scala | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala index 90465b65bdb1c..f1ea352207484 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala @@ -2843,4 +2843,19 @@ class SQLQuerySuite extends QueryTest with SharedSQLContext { sql(s"SELECT '$literal' AS DUMMY"), Row(s"$expected") :: Nil) } + + test("SPARK-15776: Type coercionn incorrect") { + Seq( + (1, 11), + (3, 25), + (5, 37) + ).toDF("k", "v").createOrReplaceTempView("tc") + + // If Division is after FunctionArgumentConversion then for the first query it's output + // data type is bigint and second is double. But actually both these two query it's + // output data type should be double. + checkAnswer( + sql("SELECT SUM(CASE WHEN k in (3, 5) THEN v / 10 ELSE 0 END) FROM tc"), + sql("SELECT SUM(CASE WHEN k in (3, 5) THEN v / 10.0 ELSE 0 END) FROM tc")) + } }