[SPARK-20786][SQL] Improve ceil and floor handle the value which is not expected
## What changes were proposed in this pull request? spark-sql>SELECT ceil(1234567890123456); 1234567890123456 spark-sql>SELECT ceil(12345678901234567); 12345678901234568 spark-sql>SELECT ceil(123456789012345678); 123456789012345680 when the length of the getText is greater than 16. long to double will be precision loss. but mysql handle the value is ok. mysql> SELECT ceil(1234567890123456); +------------------------+ | ceil(1234567890123456) | +------------------------+ | 1234567890123456 | +------------------------+ 1 row in set (0.00 sec) mysql> SELECT ceil(12345678901234567); +-------------------------+ | ceil(12345678901234567) | +-------------------------+ | 12345678901234567 | +-------------------------+ 1 row in set (0.00 sec) mysql> SELECT ceil(123456789012345678); +--------------------------+ | ceil(123456789012345678) | +--------------------------+ | 123456789012345678 | +--------------------------+ 1 row in set (0.00 sec) ## How was this patch tested? Supplement the unit test. Author: caoxuewen <cao.xuewen@zte.com.cn> Closes #18016 from heary-cao/ceil_long.
This commit is contained in:
parent
0f2f56c37b
commit
3c9eef35a8
|
@ -232,9 +232,10 @@ case class Ceil(child: Expression) extends UnaryMathExpression(math.ceil, "CEIL"
|
||||||
}
|
}
|
||||||
|
|
||||||
override def inputTypes: Seq[AbstractDataType] =
|
override def inputTypes: Seq[AbstractDataType] =
|
||||||
Seq(TypeCollection(DoubleType, DecimalType))
|
Seq(TypeCollection(LongType, DoubleType, DecimalType))
|
||||||
|
|
||||||
protected override def nullSafeEval(input: Any): Any = child.dataType match {
|
protected override def nullSafeEval(input: Any): Any = child.dataType match {
|
||||||
|
case LongType => input.asInstanceOf[Long]
|
||||||
case DoubleType => f(input.asInstanceOf[Double]).toLong
|
case DoubleType => f(input.asInstanceOf[Double]).toLong
|
||||||
case DecimalType.Fixed(precision, scale) => input.asInstanceOf[Decimal].ceil
|
case DecimalType.Fixed(precision, scale) => input.asInstanceOf[Decimal].ceil
|
||||||
}
|
}
|
||||||
|
@ -347,9 +348,10 @@ case class Floor(child: Expression) extends UnaryMathExpression(math.floor, "FLO
|
||||||
}
|
}
|
||||||
|
|
||||||
override def inputTypes: Seq[AbstractDataType] =
|
override def inputTypes: Seq[AbstractDataType] =
|
||||||
Seq(TypeCollection(DoubleType, DecimalType))
|
Seq(TypeCollection(LongType, DoubleType, DecimalType))
|
||||||
|
|
||||||
protected override def nullSafeEval(input: Any): Any = child.dataType match {
|
protected override def nullSafeEval(input: Any): Any = child.dataType match {
|
||||||
|
case LongType => input.asInstanceOf[Long]
|
||||||
case DoubleType => f(input.asInstanceOf[Double]).toLong
|
case DoubleType => f(input.asInstanceOf[Double]).toLong
|
||||||
case DecimalType.Fixed(precision, scale) => input.asInstanceOf[Decimal].floor
|
case DecimalType.Fixed(precision, scale) => input.asInstanceOf[Decimal].floor
|
||||||
}
|
}
|
||||||
|
|
|
@ -262,7 +262,7 @@ class AnalysisSuite extends AnalysisTest with ShouldMatchers {
|
||||||
|
|
||||||
val plan = testRelation2.select('c).orderBy(Floor('a).asc)
|
val plan = testRelation2.select('c).orderBy(Floor('a).asc)
|
||||||
val expected = testRelation2.select(c, a)
|
val expected = testRelation2.select(c, a)
|
||||||
.orderBy(Floor(Cast(a, DoubleType, Option(TimeZone.getDefault().getID))).asc).select(c)
|
.orderBy(Floor(Cast(a, LongType, Option(TimeZone.getDefault().getID))).asc).select(c)
|
||||||
|
|
||||||
checkAnalysis(plan, expected)
|
checkAnalysis(plan, expected)
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,3 +59,17 @@ select cot(1);
|
||||||
select cot(null);
|
select cot(null);
|
||||||
select cot(0);
|
select cot(0);
|
||||||
select cot(-1);
|
select cot(-1);
|
||||||
|
|
||||||
|
-- ceil and ceiling
|
||||||
|
select ceiling(0);
|
||||||
|
select ceiling(1);
|
||||||
|
select ceil(1234567890123456);
|
||||||
|
select ceil(12345678901234567);
|
||||||
|
select ceiling(1234567890123456);
|
||||||
|
select ceiling(12345678901234567);
|
||||||
|
|
||||||
|
-- floor
|
||||||
|
select floor(0);
|
||||||
|
select floor(1);
|
||||||
|
select floor(1234567890123456);
|
||||||
|
select floor(12345678901234567);
|
||||||
|
|
|
@ -316,3 +316,83 @@ select cot(-1)
|
||||||
struct<COT(CAST(-1 AS DOUBLE)):double>
|
struct<COT(CAST(-1 AS DOUBLE)):double>
|
||||||
-- !query 37 output
|
-- !query 37 output
|
||||||
-0.6420926159343306
|
-0.6420926159343306
|
||||||
|
|
||||||
|
|
||||||
|
-- !query 38
|
||||||
|
select ceiling(0)
|
||||||
|
-- !query 38 schema
|
||||||
|
struct<CEIL(CAST(0 AS BIGINT)):bigint>
|
||||||
|
-- !query 38 output
|
||||||
|
0
|
||||||
|
|
||||||
|
|
||||||
|
-- !query 39
|
||||||
|
select ceiling(1)
|
||||||
|
-- !query 39 schema
|
||||||
|
struct<CEIL(CAST(1 AS BIGINT)):bigint>
|
||||||
|
-- !query 39 output
|
||||||
|
1
|
||||||
|
|
||||||
|
|
||||||
|
-- !query 40
|
||||||
|
select ceil(1234567890123456)
|
||||||
|
-- !query 40 schema
|
||||||
|
struct<CEIL(1234567890123456):bigint>
|
||||||
|
-- !query 40 output
|
||||||
|
1234567890123456
|
||||||
|
|
||||||
|
|
||||||
|
-- !query 41
|
||||||
|
select ceil(12345678901234567)
|
||||||
|
-- !query 41 schema
|
||||||
|
struct<CEIL(12345678901234567):bigint>
|
||||||
|
-- !query 41 output
|
||||||
|
12345678901234567
|
||||||
|
|
||||||
|
|
||||||
|
-- !query 42
|
||||||
|
select ceiling(1234567890123456)
|
||||||
|
-- !query 42 schema
|
||||||
|
struct<CEIL(1234567890123456):bigint>
|
||||||
|
-- !query 42 output
|
||||||
|
1234567890123456
|
||||||
|
|
||||||
|
|
||||||
|
-- !query 43
|
||||||
|
select ceiling(12345678901234567)
|
||||||
|
-- !query 43 schema
|
||||||
|
struct<CEIL(12345678901234567):bigint>
|
||||||
|
-- !query 43 output
|
||||||
|
12345678901234567
|
||||||
|
|
||||||
|
|
||||||
|
-- !query 44
|
||||||
|
select floor(0)
|
||||||
|
-- !query 44 schema
|
||||||
|
struct<FLOOR(CAST(0 AS BIGINT)):bigint>
|
||||||
|
-- !query 44 output
|
||||||
|
0
|
||||||
|
|
||||||
|
|
||||||
|
-- !query 45
|
||||||
|
select floor(1)
|
||||||
|
-- !query 45 schema
|
||||||
|
struct<FLOOR(CAST(1 AS BIGINT)):bigint>
|
||||||
|
-- !query 45 output
|
||||||
|
1
|
||||||
|
|
||||||
|
|
||||||
|
-- !query 46
|
||||||
|
select floor(1234567890123456)
|
||||||
|
-- !query 46 schema
|
||||||
|
struct<FLOOR(1234567890123456):bigint>
|
||||||
|
-- !query 46 output
|
||||||
|
1234567890123456
|
||||||
|
|
||||||
|
|
||||||
|
-- !query 47
|
||||||
|
select floor(12345678901234567)
|
||||||
|
-- !query 47 schema
|
||||||
|
struct<FLOOR(12345678901234567):bigint>
|
||||||
|
-- !query 47 output
|
||||||
|
12345678901234567
|
||||||
|
|
Loading…
Reference in a new issue