aboutsummaryrefslogtreecommitdiff
path: root/sql/catalyst
diff options
context:
space:
mode:
authorguowei2 <guowei2@asiainfo.com>2014-12-30 12:21:00 -0800
committerMichael Armbrust <michael@databricks.com>2014-12-30 12:21:00 -0800
commita75dd83b72586695768c89ed32b240aa8f48f32c (patch)
treea4dbbfa922e6a023923b9d5575f18ef480aa436d /sql/catalyst
parent2deac748b4e1245c2cb9bd43ad87c80d6d130a83 (diff)
downloadspark-a75dd83b72586695768c89ed32b240aa8f48f32c.tar.gz
spark-a75dd83b72586695768c89ed32b240aa8f48f32c.tar.bz2
spark-a75dd83b72586695768c89ed32b240aa8f48f32c.zip
[SPARK-4928][SQL] Fix: Operator '>,<,>=,<=' with decimal between different precision report error
case operator with decimal between different precision, we need change them to unlimited Author: guowei2 <guowei2@asiainfo.com> Closes #3767 from guowei2/SPARK-4928 and squashes the following commits: c6a6e3e [guowei2] fix code style 3214e0a [guowei2] add test case b4985a2 [guowei2] fix code style 27adf42 [guowei2] Fix: Operation '>,<,>=,<=' with Decimal report error
Diffstat (limited to 'sql/catalyst')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercion.scala16
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/DecimalPrecisionSuite.scala17
2 files changed, 33 insertions, 0 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 e38114ab3c..242f28f670 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
@@ -361,6 +361,22 @@ trait HiveTypeCoercion {
DecimalType(min(p1 - s1, p2 - s2) + max(s1, s2), max(s1, s2))
)
+ case LessThan(e1 @ DecimalType.Expression(p1, s1),
+ e2 @ DecimalType.Expression(p2, s2)) if p1 != p2 || s1 != s2 =>
+ LessThan(Cast(e1, DecimalType.Unlimited), Cast(e2, DecimalType.Unlimited))
+
+ case LessThanOrEqual(e1 @ DecimalType.Expression(p1, s1),
+ e2 @ DecimalType.Expression(p2, s2)) if p1 != p2 || s1 != s2 =>
+ LessThanOrEqual(Cast(e1, DecimalType.Unlimited), Cast(e2, DecimalType.Unlimited))
+
+ case GreaterThan(e1 @ DecimalType.Expression(p1, s1),
+ e2 @ DecimalType.Expression(p2, s2)) if p1 != p2 || s1 != s2 =>
+ GreaterThan(Cast(e1, DecimalType.Unlimited), Cast(e2, DecimalType.Unlimited))
+
+ case GreaterThanOrEqual(e1 @ DecimalType.Expression(p1, s1),
+ e2 @ DecimalType.Expression(p2, s2)) if p1 != p2 || s1 != s2 =>
+ GreaterThanOrEqual(Cast(e1, DecimalType.Unlimited), Cast(e2, DecimalType.Unlimited))
+
// Promote integers inside a binary expression with fixed-precision decimals to decimals,
// and fixed-precision decimals in an expression with floats / doubles to doubles
case b: BinaryExpression if b.left.dataType != b.right.dataType =>
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/DecimalPrecisionSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/DecimalPrecisionSuite.scala
index d5b7d2789a..3677a6e72e 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/DecimalPrecisionSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/DecimalPrecisionSuite.scala
@@ -49,6 +49,15 @@ class DecimalPrecisionSuite extends FunSuite with BeforeAndAfter {
assert(analyzer(plan).schema.fields(0).dataType === expectedType)
}
+ private def checkComparison(expression: Expression, expectedType: DataType): Unit = {
+ val plan = Project(Alias(expression, "c")() :: Nil, relation)
+ val comparison = analyzer(plan).collect {
+ case Project(Alias(e: BinaryComparison, _) :: Nil, _) => e
+ }.head
+ assert(comparison.left.dataType === expectedType)
+ assert(comparison.right.dataType === expectedType)
+ }
+
test("basic operations") {
checkType(Add(d1, d2), DecimalType(6, 2))
checkType(Subtract(d1, d2), DecimalType(6, 2))
@@ -65,6 +74,14 @@ class DecimalPrecisionSuite extends FunSuite with BeforeAndAfter {
checkType(Add(Add(d1, d2), Add(d1, d2)), DecimalType(7, 2))
}
+ test("Comparison operations") {
+ checkComparison(LessThan(i, d1), DecimalType.Unlimited)
+ checkComparison(LessThanOrEqual(d1, d2), DecimalType.Unlimited)
+ checkComparison(GreaterThan(d2, u), DecimalType.Unlimited)
+ checkComparison(GreaterThanOrEqual(d1, f), DoubleType)
+ checkComparison(GreaterThan(d2, d2), DecimalType(5, 2))
+ }
+
test("bringing in primitive types") {
checkType(Add(d1, i), DecimalType(12, 1))
checkType(Add(d1, f), DoubleType)