aboutsummaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorWenchen Fan <cloud0fan@outlook.com>2015-05-30 00:26:46 -0700
committerReynold Xin <rxin@databricks.com>2015-05-30 00:26:46 -0700
commit0978aec9cd47dc0618e47b74a99e1cc2266be424 (patch)
treee787b84f2d19cd9c5ebbad74e84d9f9c81da9568 /sql
parente3a43748338b02ef6864ca62de40e218e5677506 (diff)
downloadspark-0978aec9cd47dc0618e47b74a99e1cc2266be424.tar.gz
spark-0978aec9cd47dc0618e47b74a99e1cc2266be424.tar.bz2
spark-0978aec9cd47dc0618e47b74a99e1cc2266be424.zip
[SPARK-7964][SQL] remove unnecessary type coercion rule
We have defined these logics in `Cast` already, I think we should remove this rule. Author: Wenchen Fan <cloud0fan@outlook.com> Closes #6516 from cloud-fan/tmp2 and squashes the following commits: d5035a4 [Wenchen Fan] remove useless rule
Diffstat (limited to 'sql')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercion.scala27
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercionSuite.scala16
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ExpressionEvaluationSuite.scala2
3 files changed, 2 insertions, 43 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 44664f898f..195418d6df 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
@@ -77,7 +77,6 @@ trait HiveTypeCoercion {
PromoteStrings ::
DecimalPrecision ::
BooleanComparisons ::
- BooleanCasts ::
StringToIntegralCasts ::
FunctionArgumentConversion ::
CaseWhenCoercion ::
@@ -511,32 +510,6 @@ trait HiveTypeCoercion {
}
/**
- * Casts to/from [[BooleanType]] are transformed into comparisons since
- * the JVM does not consider Booleans to be numeric types.
- */
- object BooleanCasts extends Rule[LogicalPlan] {
- 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
- // DateType should be null if be cast to boolean.
- case Cast(e, BooleanType) if e.dataType == DateType => Cast(e, BooleanType)
- // If the data type is not boolean and is being cast boolean, turn it into a comparison
- // with the numeric value, i.e. x != 0. This will coerce the type into numeric type.
- case Cast(e, BooleanType) if e.dataType != BooleanType => Not(EqualTo(e, Literal(0)))
- // Stringify boolean if casting to StringType.
- // TODO Ensure true/false string letter casing is consistent with Hive in all cases.
- case Cast(e, StringType) if e.dataType == BooleanType =>
- If(e, Literal("true"), Literal("false"))
- // Turn true into 1, and false into 0 if casting boolean into other types.
- case Cast(e, dataType) if e.dataType == BooleanType =>
- Cast(If(e, Literal(1), Literal(0)), dataType)
- }
- }
-
- /**
* When encountering a cast from a string representing a valid fractional number to an integral
* type the jvm will throw a `java.lang.NumberFormatException`. Hive, in contrast, returns the
* truncated version of this number.
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercionSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercionSuite.scala
index fcd745f43c..f0101f4a88 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercionSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercionSuite.scala
@@ -104,22 +104,6 @@ class HiveTypeCoercionSuite extends PlanTest {
widenTest(ArrayType(IntegerType), StructType(Seq()), None)
}
- test("boolean casts") {
- val booleanCasts = new HiveTypeCoercion { }.BooleanCasts
- def ruleTest(initial: Expression, transformed: Expression) {
- val testRelation = LocalRelation(AttributeReference("a", IntegerType)())
- comparePlans(
- booleanCasts(Project(Seq(Alias(initial, "a")()), testRelation)),
- Project(Seq(Alias(transformed, "a")()), testRelation))
- }
- // Remove superflous boolean -> boolean casts.
- ruleTest(Cast(Literal(true), BooleanType), Literal(true))
- // Stringify boolean when casting to string.
- ruleTest(
- Cast(Literal(false), StringType),
- If(Literal(false), Literal("true"), Literal("false")))
- }
-
test("coalesce casts") {
val fac = new HiveTypeCoercion { }.FunctionArgumentConversion
def ruleTest(initial: Expression, transformed: Expression) {
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ExpressionEvaluationSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ExpressionEvaluationSuite.scala
index b511aa3a24..10181366c2 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ExpressionEvaluationSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ExpressionEvaluationSuite.scala
@@ -372,6 +372,8 @@ class ExpressionEvaluationSuite extends ExpressionEvaluationBaseSuite {
DecimalType.Unlimited, ByteType), TimestampType), LongType), StringType), ShortType), 0)
checkEvaluation(Literal(true) cast IntegerType, 1)
checkEvaluation(Literal(false) cast IntegerType, 0)
+ checkEvaluation(Literal(true) cast StringType, "true")
+ checkEvaluation(Literal(false) cast StringType, "false")
checkEvaluation(Cast(Literal(1) cast BooleanType, IntegerType), 1)
checkEvaluation(Cast(Literal(0) cast BooleanType, IntegerType), 0)
checkEvaluation("23" cast DoubleType, 23d)