aboutsummaryrefslogtreecommitdiff
path: root/sql/catalyst/src/main
diff options
context:
space:
mode:
authorSrinath Shankar <srinath@databricks.com>2016-08-19 19:54:26 -0700
committerReynold Xin <rxin@databricks.com>2016-08-19 19:54:26 -0700
commitba1737c21aab91ff3f1a1737aa2d6b07575e36a3 (patch)
treeda97f012db4cfa31fe9bd1b07016ba460c9bd55c /sql/catalyst/src/main
parenta117afa7c2d94f943106542ec53d74ba2b5f1058 (diff)
downloadspark-ba1737c21aab91ff3f1a1737aa2d6b07575e36a3.tar.gz
spark-ba1737c21aab91ff3f1a1737aa2d6b07575e36a3.tar.bz2
spark-ba1737c21aab91ff3f1a1737aa2d6b07575e36a3.zip
[SPARK-17158][SQL] Change error message for out of range numeric literals
## What changes were proposed in this pull request? Modifies error message for numeric literals to Numeric literal <literal> does not fit in range [min, max] for type <T> ## How was this patch tested? Fixed up the error messages for literals.sql in SqlQueryTestSuite and re-ran via sbt. Also fixed up error messages in ExpressionParserSuite Author: Srinath Shankar <srinath@databricks.com> Closes #14721 from srinathshankar/sc4296.
Diffstat (limited to 'sql/catalyst/src/main')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala29
1 files changed, 18 insertions, 11 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
index 283e4d43ba..8b98efcbf3 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
@@ -1278,10 +1278,17 @@ class AstBuilder extends SqlBaseBaseVisitor[AnyRef] with Logging {
}
/** Create a numeric literal expression. */
- private def numericLiteral(ctx: NumberContext)(f: String => Any): Literal = withOrigin(ctx) {
- val raw = ctx.getText
+ private def numericLiteral
+ (ctx: NumberContext, minValue: BigDecimal, maxValue: BigDecimal, typeName: String)
+ (converter: String => Any): Literal = withOrigin(ctx) {
+ val rawStrippedQualifier = ctx.getText.substring(0, ctx.getText.length - 1)
try {
- Literal(f(raw.substring(0, raw.length - 1)))
+ val rawBigDecimal = BigDecimal(rawStrippedQualifier)
+ if (rawBigDecimal < minValue || rawBigDecimal > maxValue) {
+ throw new ParseException(s"Numeric literal ${rawStrippedQualifier} does not " +
+ s"fit in range [${minValue}, ${maxValue}] for type ${typeName}", ctx)
+ }
+ Literal(converter(rawStrippedQualifier))
} catch {
case e: NumberFormatException =>
throw new ParseException(e.getMessage, ctx)
@@ -1291,29 +1298,29 @@ class AstBuilder extends SqlBaseBaseVisitor[AnyRef] with Logging {
/**
* Create a Byte Literal expression.
*/
- override def visitTinyIntLiteral(ctx: TinyIntLiteralContext): Literal = numericLiteral(ctx) {
- _.toByte
+ override def visitTinyIntLiteral(ctx: TinyIntLiteralContext): Literal = {
+ numericLiteral(ctx, Byte.MinValue, Byte.MaxValue, ByteType.simpleString)(_.toByte)
}
/**
* Create a Short Literal expression.
*/
- override def visitSmallIntLiteral(ctx: SmallIntLiteralContext): Literal = numericLiteral(ctx) {
- _.toShort
+ override def visitSmallIntLiteral(ctx: SmallIntLiteralContext): Literal = {
+ numericLiteral(ctx, Short.MinValue, Short.MaxValue, ShortType.simpleString)(_.toShort)
}
/**
* Create a Long Literal expression.
*/
- override def visitBigIntLiteral(ctx: BigIntLiteralContext): Literal = numericLiteral(ctx) {
- _.toLong
+ override def visitBigIntLiteral(ctx: BigIntLiteralContext): Literal = {
+ numericLiteral(ctx, Long.MinValue, Long.MaxValue, LongType.simpleString)(_.toLong)
}
/**
* Create a Double Literal expression.
*/
- override def visitDoubleLiteral(ctx: DoubleLiteralContext): Literal = numericLiteral(ctx) {
- _.toDouble
+ override def visitDoubleLiteral(ctx: DoubleLiteralContext): Literal = {
+ numericLiteral(ctx, Double.MinValue, Double.MaxValue, DoubleType.simpleString)(_.toDouble)
}
/**