This is an automated email from the ASF dual-hosted git repository. gengliang pushed a commit to branch branch-3.4 in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/branch-3.4 by this push: new 2870c76fb582 [SPARK-48016][SQL][3.4] Fix a bug in try_divide function when with decimals 2870c76fb582 is described below commit 2870c76fb58266db69419e05a204c554f9733357 Author: Gengliang Wang <gengli...@apache.org> AuthorDate: Mon Apr 29 22:01:16 2024 -0700 [SPARK-48016][SQL][3.4] Fix a bug in try_divide function when with decimals ### What changes were proposed in this pull request? Currently, the following query will throw DIVIDE_BY_ZERO error instead of returning null ``` SELECT try_divide(1, decimal(0)); ``` This is caused by the rule `DecimalPrecision`: ``` case b BinaryOperator(left, right) if left.dataType != right.dataType => (left, right) match { ... case (l: Literal, r) if r.dataType.isInstanceOf[DecimalType] && l.dataType.isInstanceOf[IntegralType] && literalPickMinimumPrecision => b.makeCopy(Array(Cast(l, DataTypeUtils.fromLiteral(l)), r)) ``` The result of the above makeCopy will contain `ANSI` as the `evalMode`, instead of `TRY`. This PR is to fix this bug by replacing the makeCopy method calls with withNewChildren ### Why are the changes needed? Bug fix in try_* functions. ### Does this PR introduce _any_ user-facing change? Yes, it fixes a long-standing bug in the try_divide function. ### How was this patch tested? New UT ### Was this patch authored or co-authored using generative AI tooling? No Closes #46289 from gengliangwang/PICK_PR_46286_BRANCH-3.4. Authored-by: Gengliang Wang <gengli...@apache.org> Signed-off-by: Gengliang Wang <gengli...@apache.org> --- .../sql/catalyst/analysis/DecimalPrecision.scala | 14 +- .../spark/sql/catalyst/analysis/TypeCoercion.scala | 10 +- .../analyzer-results/ansi/try_arithmetic.sql.out | 491 +++++++++++++++++++++ .../analyzer-results/try_arithmetic.sql.out | 491 +++++++++++++++++++++ .../resources/sql-tests/inputs/try_arithmetic.sql | 8 + .../sql-tests/results/ansi/try_arithmetic.sql.out | 64 +++ .../sql-tests/results/try_arithmetic.sql.out | 64 +++ 7 files changed, 1130 insertions(+), 12 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/DecimalPrecision.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/DecimalPrecision.scala index 46fbf071f437..19b6f2cf8dab 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/DecimalPrecision.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/DecimalPrecision.scala @@ -82,7 +82,7 @@ object DecimalPrecision extends TypeCoercionRule { val resultType = widerDecimalType(p1, s1, p2, s2) val newE1 = if (e1.dataType == resultType) e1 else Cast(e1, resultType) val newE2 = if (e2.dataType == resultType) e2 else Cast(e2, resultType) - b.makeCopy(Array(newE1, newE2)) + b.withNewChildren(Seq(newE1, newE2)) } /** @@ -201,21 +201,21 @@ object DecimalPrecision extends TypeCoercionRule { case (l: Literal, r) if r.dataType.isInstanceOf[DecimalType] && l.dataType.isInstanceOf[IntegralType] && literalPickMinimumPrecision => - b.makeCopy(Array(Cast(l, DecimalType.fromLiteral(l)), r)) + b.withNewChildren(Seq(Cast(l, DecimalType.fromLiteral(l)), r)) case (l, r: Literal) if l.dataType.isInstanceOf[DecimalType] && r.dataType.isInstanceOf[IntegralType] && literalPickMinimumPrecision => - b.makeCopy(Array(l, Cast(r, DecimalType.fromLiteral(r)))) + b.withNewChildren(Seq(l, Cast(r, DecimalType.fromLiteral(r)))) // 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 (l @ IntegralType(), r @ DecimalType.Expression(_, _)) => - b.makeCopy(Array(Cast(l, DecimalType.forType(l.dataType)), r)) + b.withNewChildren(Seq(Cast(l, DecimalType.forType(l.dataType)), r)) case (l @ DecimalType.Expression(_, _), r @ IntegralType()) => - b.makeCopy(Array(l, Cast(r, DecimalType.forType(r.dataType)))) + b.withNewChildren(Seq(l, Cast(r, DecimalType.forType(r.dataType)))) case (l, r @ DecimalType.Expression(_, _)) if isFloat(l.dataType) => - b.makeCopy(Array(l, Cast(r, DoubleType))) + b.withNewChildren(Seq(l, Cast(r, DoubleType))) case (l @ DecimalType.Expression(_, _), r) if isFloat(r.dataType) => - b.makeCopy(Array(Cast(l, DoubleType), r)) + b.withNewChildren(Seq(Cast(l, DoubleType), r)) case _ => b } } 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 e57d1075d2f7..d08c95cf90e0 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 @@ -1106,22 +1106,22 @@ object TypeCoercion extends TypeCoercionBase { case a @ BinaryArithmetic(left @ StringType(), right) if right.dataType != CalendarIntervalType => - a.makeCopy(Array(Cast(left, DoubleType), right)) + a.withNewChildren(Seq(Cast(left, DoubleType), right)) case a @ BinaryArithmetic(left, right @ StringType()) if left.dataType != CalendarIntervalType => - a.makeCopy(Array(left, Cast(right, DoubleType))) + a.withNewChildren(Seq(left, Cast(right, DoubleType))) // For equality between string and timestamp we cast the string to a timestamp // so that things like rounding of subsecond precision does not affect the comparison. case p @ Equality(left @ StringType(), right @ TimestampType()) => - p.makeCopy(Array(Cast(left, TimestampType), right)) + p.withNewChildren(Seq(Cast(left, TimestampType), right)) case p @ Equality(left @ TimestampType(), right @ StringType()) => - p.makeCopy(Array(left, Cast(right, TimestampType))) + p.withNewChildren(Seq(left, Cast(right, TimestampType))) case p @ BinaryComparison(left, right) if findCommonTypeForBinaryComparison(left.dataType, right.dataType, conf).isDefined => val commonType = findCommonTypeForBinaryComparison(left.dataType, right.dataType, conf).get - p.makeCopy(Array(castExpr(left, commonType), castExpr(right, commonType))) + p.withNewChildren(Seq(castExpr(left, commonType), castExpr(right, commonType))) } } diff --git a/sql/core/src/test/resources/sql-tests/analyzer-results/ansi/try_arithmetic.sql.out b/sql/core/src/test/resources/sql-tests/analyzer-results/ansi/try_arithmetic.sql.out new file mode 100644 index 000000000000..30654d1d71e2 --- /dev/null +++ b/sql/core/src/test/resources/sql-tests/analyzer-results/ansi/try_arithmetic.sql.out @@ -0,0 +1,491 @@ +-- Automatically generated by SQLQueryTestSuite +-- !query +SELECT try_add(1, 1) +-- !query analysis +Project [try_add(1, 1) AS try_add(1, 1)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(2147483647, 1) +-- !query analysis +Project [try_add(2147483647, 1) AS try_add(2147483647, 1)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(2147483647, decimal(1)) +-- !query analysis +Project [try_add(2147483647, cast(1 as decimal(10,0))) AS try_add(2147483647, 1)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(2147483647, "1") +-- !query analysis +Project [try_add(2147483647, 1) AS try_add(2147483647, 1)#xL] ++- OneRowRelation + + +-- !query +SELECT try_add(-2147483648, -1) +-- !query analysis +Project [try_add(-2147483648, -1) AS try_add(-2147483648, -1)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(9223372036854775807L, 1) +-- !query analysis +Project [try_add(9223372036854775807, 1) AS try_add(9223372036854775807, 1)#xL] ++- OneRowRelation + + +-- !query +SELECT try_add(-9223372036854775808L, -1) +-- !query analysis +Project [try_add(-9223372036854775808, -1) AS try_add(-9223372036854775808, -1)#xL] ++- OneRowRelation + + +-- !query +SELECT try_add(1, (2147483647 + 1)) +-- !query analysis +Project [try_add(1, (2147483647 + 1)) AS try_add(1, (2147483647 + 1))#x] ++- OneRowRelation + + +-- !query +SELECT try_add(1L, (9223372036854775807L + 1L)) +-- !query analysis +Project [try_add(1, (9223372036854775807 + 1)) AS try_add(1, (9223372036854775807 + 1))#xL] ++- OneRowRelation + + +-- !query +SELECT try_add(1, 1.0 / 0.0) +-- !query analysis +Project [try_add(1, (1.0 / 0.0)) AS try_add(1, (1.0 / 0.0))#x] ++- OneRowRelation + + +-- !query +SELECT try_add(date'2021-01-01', 1) +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(1, date'2021-01-01') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(date'2021-01-01', interval 2 year) +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(date'2021-01-01', interval 2 second) +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(interval 2 year, date'2021-01-01') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(interval 2 second, date'2021-01-01') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(timestamp_ltz'2021-01-01 00:00:00', interval 2 year) +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(timestamp_ntz'2021-01-01 00:00:00', interval 2 second) +-- !query analysis +Project [try_add(2021-01-01 00:00:00, INTERVAL '02' SECOND) AS try_add(TIMESTAMP_NTZ '2021-01-01 00:00:00', INTERVAL '02' SECOND)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(interval 2 year, timestamp_ltz'2021-01-01 00:00:00') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(interval 2 second, timestamp_ntz'2021-01-01 00:00:00') +-- !query analysis +Project [try_add(INTERVAL '02' SECOND, 2021-01-01 00:00:00) AS try_add(INTERVAL '02' SECOND, TIMESTAMP_NTZ '2021-01-01 00:00:00')#x] ++- OneRowRelation + + +-- !query +SELECT try_add(interval 2 year, interval 2 year) +-- !query analysis +Project [try_add(INTERVAL '2' YEAR, INTERVAL '2' YEAR) AS try_add(INTERVAL '2' YEAR, INTERVAL '2' YEAR)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(interval 2 second, interval 2 second) +-- !query analysis +Project [try_add(INTERVAL '02' SECOND, INTERVAL '02' SECOND) AS try_add(INTERVAL '02' SECOND, INTERVAL '02' SECOND)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(interval 2 year, interval 2 second) +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"INTERVAL '2' YEAR\"", + "inputType" : "\"INTERVAL YEAR\"", + "paramIndex" : "first", + "requiredType" : "\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\"", + "sqlExpr" : "\"INTERVAL '2' YEAR + INTERVAL '02' SECOND\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 50, + "fragment" : "try_add(interval 2 year, interval 2 second)" + } ] +} + + +-- !query +SELECT try_add(interval 2147483647 month, interval 2 month) +-- !query analysis +Project [try_add(INTERVAL '2147483647' MONTH, INTERVAL '2' MONTH) AS try_add(INTERVAL '2147483647' MONTH, INTERVAL '2' MONTH)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(interval 106751991 day, interval 3 day) +-- !query analysis +Project [try_add(INTERVAL '106751991' DAY, INTERVAL '3' DAY) AS try_add(INTERVAL '106751991' DAY, INTERVAL '3' DAY)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1, 0.5) +-- !query analysis +Project [try_divide(1, 0.5) AS try_divide(1, 0.5)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1, 0) +-- !query analysis +Project [try_divide(1, 0) AS try_divide(1, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(0, 0) +-- !query analysis +Project [try_divide(0, 0) AS try_divide(0, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1, (2147483647 + 1)) +-- !query analysis +Project [try_divide(1, (2147483647 + 1)) AS try_divide(1, (2147483647 + 1))#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1L, (9223372036854775807L + 1L)) +-- !query analysis +Project [try_divide(1, (9223372036854775807 + 1)) AS try_divide(1, (9223372036854775807 + 1))#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1, 1.0 / 0.0) +-- !query analysis +Project [try_divide(1, (1.0 / 0.0)) AS try_divide(1, (1.0 / 0.0))#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1, decimal(0)) +-- !query analysis +Project [try_divide(1, cast(0 as decimal(10,0))) AS try_divide(1, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1, "0") +-- !query analysis +Project [try_divide(1, 0) AS try_divide(1, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(interval 2 year, 2) +-- !query analysis +Project [try_divide(INTERVAL '2' YEAR, 2) AS try_divide(INTERVAL '2' YEAR, 2)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(interval 2 second, 2) +-- !query analysis +Project [try_divide(INTERVAL '02' SECOND, 2) AS try_divide(INTERVAL '02' SECOND, 2)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(interval 2 year, 0) +-- !query analysis +Project [try_divide(INTERVAL '2' YEAR, 0) AS try_divide(INTERVAL '2' YEAR, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(interval 2 second, 0) +-- !query analysis +Project [try_divide(INTERVAL '02' SECOND, 0) AS try_divide(INTERVAL '02' SECOND, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(interval 2147483647 month, 0.5) +-- !query analysis +Project [try_divide(INTERVAL '2147483647' MONTH, 0.5) AS try_divide(INTERVAL '2147483647' MONTH, 0.5)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(interval 106751991 day, 0.5) +-- !query analysis +Project [try_divide(INTERVAL '106751991' DAY, 0.5) AS try_divide(INTERVAL '106751991' DAY, 0.5)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(1, 1) +-- !query analysis +Project [try_subtract(1, 1) AS try_subtract(1, 1)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(2147483647, -1) +-- !query analysis +Project [try_subtract(2147483647, -1) AS try_subtract(2147483647, -1)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(2147483647, decimal(-1)) +-- !query analysis +Project [try_subtract(2147483647, cast(-1 as decimal(10,0))) AS try_subtract(2147483647, -1)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(2147483647, "-1") +-- !query analysis +Project [try_subtract(2147483647, -1) AS try_subtract(2147483647, -1)#xL] ++- OneRowRelation + + +-- !query +SELECT try_subtract(-2147483648, 1) +-- !query analysis +Project [try_subtract(-2147483648, 1) AS try_subtract(-2147483648, 1)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(9223372036854775807L, -1) +-- !query analysis +Project [try_subtract(9223372036854775807, -1) AS try_subtract(9223372036854775807, -1)#xL] ++- OneRowRelation + + +-- !query +SELECT try_subtract(-9223372036854775808L, 1) +-- !query analysis +Project [try_subtract(-9223372036854775808, 1) AS try_subtract(-9223372036854775808, 1)#xL] ++- OneRowRelation + + +-- !query +SELECT try_subtract(1, (2147483647 + 1)) +-- !query analysis +Project [try_subtract(1, (2147483647 + 1)) AS try_subtract(1, (2147483647 + 1))#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(1L, (9223372036854775807L + 1L)) +-- !query analysis +Project [try_subtract(1, (9223372036854775807 + 1)) AS try_subtract(1, (9223372036854775807 + 1))#xL] ++- OneRowRelation + + +-- !query +SELECT try_subtract(1, 1.0 / 0.0) +-- !query analysis +Project [try_subtract(1, (1.0 / 0.0)) AS try_subtract(1, (1.0 / 0.0))#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(interval 2 year, interval 3 year) +-- !query analysis +Project [try_subtract(INTERVAL '2' YEAR, INTERVAL '3' YEAR) AS try_subtract(INTERVAL '2' YEAR, INTERVAL '3' YEAR)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(interval 3 second, interval 2 second) +-- !query analysis +Project [try_subtract(INTERVAL '03' SECOND, INTERVAL '02' SECOND) AS try_subtract(INTERVAL '03' SECOND, INTERVAL '02' SECOND)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(interval 2147483647 month, interval -2 month) +-- !query analysis +Project [try_subtract(INTERVAL '2147483647' MONTH, INTERVAL '-2' MONTH) AS try_subtract(INTERVAL '2147483647' MONTH, INTERVAL '-2' MONTH)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(interval 106751991 day, interval -3 day) +-- !query analysis +Project [try_subtract(INTERVAL '106751991' DAY, INTERVAL '-3' DAY) AS try_subtract(INTERVAL '106751991' DAY, INTERVAL '-3' DAY)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(2, 3) +-- !query analysis +Project [try_multiply(2, 3) AS try_multiply(2, 3)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(2147483647, -2) +-- !query analysis +Project [try_multiply(2147483647, -2) AS try_multiply(2147483647, -2)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(2147483647, decimal(-2)) +-- !query analysis +Project [try_multiply(2147483647, cast(-2 as decimal(10,0))) AS try_multiply(2147483647, -2)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(2147483647, "-2") +-- !query analysis +Project [try_multiply(2147483647, -2) AS try_multiply(2147483647, -2)#xL] ++- OneRowRelation + + +-- !query +SELECT try_multiply(-2147483648, 2) +-- !query analysis +Project [try_multiply(-2147483648, 2) AS try_multiply(-2147483648, 2)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(9223372036854775807L, 2) +-- !query analysis +Project [try_multiply(9223372036854775807, 2) AS try_multiply(9223372036854775807, 2)#xL] ++- OneRowRelation + + +-- !query +SELECT try_multiply(-9223372036854775808L, -2) +-- !query analysis +Project [try_multiply(-9223372036854775808, -2) AS try_multiply(-9223372036854775808, -2)#xL] ++- OneRowRelation + + +-- !query +SELECT try_multiply(1, (2147483647 + 1)) +-- !query analysis +Project [try_multiply(1, (2147483647 + 1)) AS try_multiply(1, (2147483647 + 1))#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(1L, (9223372036854775807L + 1L)) +-- !query analysis +Project [try_multiply(1, (9223372036854775807 + 1)) AS try_multiply(1, (9223372036854775807 + 1))#xL] ++- OneRowRelation + + +-- !query +SELECT try_multiply(1, 1.0 / 0.0) +-- !query analysis +Project [try_multiply(1, (1.0 / 0.0)) AS try_multiply(1, (1.0 / 0.0))#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(interval 2 year, 2) +-- !query analysis +Project [try_multiply(INTERVAL '2' YEAR, 2) AS try_multiply(INTERVAL '2' YEAR, 2)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(interval 2 second, 2) +-- !query analysis +Project [try_multiply(INTERVAL '02' SECOND, 2) AS try_multiply(INTERVAL '02' SECOND, 2)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(interval 2 year, 0) +-- !query analysis +Project [try_multiply(INTERVAL '2' YEAR, 0) AS try_multiply(INTERVAL '2' YEAR, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(interval 2 second, 0) +-- !query analysis +Project [try_multiply(INTERVAL '02' SECOND, 0) AS try_multiply(INTERVAL '02' SECOND, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(interval 2147483647 month, 2) +-- !query analysis +Project [try_multiply(INTERVAL '2147483647' MONTH, 2) AS try_multiply(INTERVAL '2147483647' MONTH, 2)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(interval 106751991 day, 2) +-- !query analysis +Project [try_multiply(INTERVAL '106751991' DAY, 2) AS try_multiply(INTERVAL '106751991' DAY, 2)#x] ++- OneRowRelation diff --git a/sql/core/src/test/resources/sql-tests/analyzer-results/try_arithmetic.sql.out b/sql/core/src/test/resources/sql-tests/analyzer-results/try_arithmetic.sql.out new file mode 100644 index 000000000000..caf997f6ccbb --- /dev/null +++ b/sql/core/src/test/resources/sql-tests/analyzer-results/try_arithmetic.sql.out @@ -0,0 +1,491 @@ +-- Automatically generated by SQLQueryTestSuite +-- !query +SELECT try_add(1, 1) +-- !query analysis +Project [try_add(1, 1) AS try_add(1, 1)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(2147483647, 1) +-- !query analysis +Project [try_add(2147483647, 1) AS try_add(2147483647, 1)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(2147483647, decimal(1)) +-- !query analysis +Project [try_add(2147483647, cast(1 as decimal(10,0))) AS try_add(2147483647, 1)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(2147483647, "1") +-- !query analysis +Project [try_add(2147483647, 1) AS try_add(2147483647, 1)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(-2147483648, -1) +-- !query analysis +Project [try_add(-2147483648, -1) AS try_add(-2147483648, -1)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(9223372036854775807L, 1) +-- !query analysis +Project [try_add(9223372036854775807, 1) AS try_add(9223372036854775807, 1)#xL] ++- OneRowRelation + + +-- !query +SELECT try_add(-9223372036854775808L, -1) +-- !query analysis +Project [try_add(-9223372036854775808, -1) AS try_add(-9223372036854775808, -1)#xL] ++- OneRowRelation + + +-- !query +SELECT try_add(1, (2147483647 + 1)) +-- !query analysis +Project [try_add(1, (2147483647 + 1)) AS try_add(1, (2147483647 + 1))#x] ++- OneRowRelation + + +-- !query +SELECT try_add(1L, (9223372036854775807L + 1L)) +-- !query analysis +Project [try_add(1, (9223372036854775807 + 1)) AS try_add(1, (9223372036854775807 + 1))#xL] ++- OneRowRelation + + +-- !query +SELECT try_add(1, 1.0 / 0.0) +-- !query analysis +Project [try_add(1, (1.0 / 0.0)) AS try_add(1, (1.0 / 0.0))#x] ++- OneRowRelation + + +-- !query +SELECT try_add(date'2021-01-01', 1) +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(1, date'2021-01-01') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(date'2021-01-01', interval 2 year) +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(date'2021-01-01', interval 2 second) +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(interval 2 year, date'2021-01-01') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(interval 2 second, date'2021-01-01') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(timestamp_ltz'2021-01-01 00:00:00', interval 2 year) +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(timestamp_ntz'2021-01-01 00:00:00', interval 2 second) +-- !query analysis +Project [try_add(2021-01-01 00:00:00, INTERVAL '02' SECOND) AS try_add(TIMESTAMP_NTZ '2021-01-01 00:00:00', INTERVAL '02' SECOND)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(interval 2 year, timestamp_ltz'2021-01-01 00:00:00') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_add(interval 2 second, timestamp_ntz'2021-01-01 00:00:00') +-- !query analysis +Project [try_add(INTERVAL '02' SECOND, 2021-01-01 00:00:00) AS try_add(INTERVAL '02' SECOND, TIMESTAMP_NTZ '2021-01-01 00:00:00')#x] ++- OneRowRelation + + +-- !query +SELECT try_add(interval 2 year, interval 2 year) +-- !query analysis +Project [try_add(INTERVAL '2' YEAR, INTERVAL '2' YEAR) AS try_add(INTERVAL '2' YEAR, INTERVAL '2' YEAR)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(interval 2 second, interval 2 second) +-- !query analysis +Project [try_add(INTERVAL '02' SECOND, INTERVAL '02' SECOND) AS try_add(INTERVAL '02' SECOND, INTERVAL '02' SECOND)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(interval 2 year, interval 2 second) +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"INTERVAL '2' YEAR\"", + "inputType" : "\"INTERVAL YEAR\"", + "paramIndex" : "first", + "requiredType" : "\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\"", + "sqlExpr" : "\"INTERVAL '2' YEAR + INTERVAL '02' SECOND\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 50, + "fragment" : "try_add(interval 2 year, interval 2 second)" + } ] +} + + +-- !query +SELECT try_add(interval 2147483647 month, interval 2 month) +-- !query analysis +Project [try_add(INTERVAL '2147483647' MONTH, INTERVAL '2' MONTH) AS try_add(INTERVAL '2147483647' MONTH, INTERVAL '2' MONTH)#x] ++- OneRowRelation + + +-- !query +SELECT try_add(interval 106751991 day, interval 3 day) +-- !query analysis +Project [try_add(INTERVAL '106751991' DAY, INTERVAL '3' DAY) AS try_add(INTERVAL '106751991' DAY, INTERVAL '3' DAY)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1, 0.5) +-- !query analysis +Project [try_divide(1, 0.5) AS try_divide(1, 0.5)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1, 0) +-- !query analysis +Project [try_divide(1, 0) AS try_divide(1, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(0, 0) +-- !query analysis +Project [try_divide(0, 0) AS try_divide(0, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1, (2147483647 + 1)) +-- !query analysis +Project [try_divide(1, (2147483647 + 1)) AS try_divide(1, (2147483647 + 1))#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1L, (9223372036854775807L + 1L)) +-- !query analysis +Project [try_divide(1, (9223372036854775807 + 1)) AS try_divide(1, (9223372036854775807 + 1))#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1, 1.0 / 0.0) +-- !query analysis +Project [try_divide(1, (1.0 / 0.0)) AS try_divide(1, (1.0 / 0.0))#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1, decimal(0)) +-- !query analysis +Project [try_divide(1, cast(0 as decimal(10,0))) AS try_divide(1, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(1, "0") +-- !query analysis +Project [try_divide(1, 0) AS try_divide(1, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(interval 2 year, 2) +-- !query analysis +Project [try_divide(INTERVAL '2' YEAR, 2) AS try_divide(INTERVAL '2' YEAR, 2)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(interval 2 second, 2) +-- !query analysis +Project [try_divide(INTERVAL '02' SECOND, 2) AS try_divide(INTERVAL '02' SECOND, 2)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(interval 2 year, 0) +-- !query analysis +Project [try_divide(INTERVAL '2' YEAR, 0) AS try_divide(INTERVAL '2' YEAR, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(interval 2 second, 0) +-- !query analysis +Project [try_divide(INTERVAL '02' SECOND, 0) AS try_divide(INTERVAL '02' SECOND, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(interval 2147483647 month, 0.5) +-- !query analysis +Project [try_divide(INTERVAL '2147483647' MONTH, 0.5) AS try_divide(INTERVAL '2147483647' MONTH, 0.5)#x] ++- OneRowRelation + + +-- !query +SELECT try_divide(interval 106751991 day, 0.5) +-- !query analysis +Project [try_divide(INTERVAL '106751991' DAY, 0.5) AS try_divide(INTERVAL '106751991' DAY, 0.5)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(1, 1) +-- !query analysis +Project [try_subtract(1, 1) AS try_subtract(1, 1)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(2147483647, -1) +-- !query analysis +Project [try_subtract(2147483647, -1) AS try_subtract(2147483647, -1)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(2147483647, decimal(-1)) +-- !query analysis +Project [try_subtract(2147483647, cast(-1 as decimal(10,0))) AS try_subtract(2147483647, -1)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(2147483647, "-1") +-- !query analysis +Project [try_subtract(2147483647, -1) AS try_subtract(2147483647, -1)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(-2147483648, 1) +-- !query analysis +Project [try_subtract(-2147483648, 1) AS try_subtract(-2147483648, 1)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(9223372036854775807L, -1) +-- !query analysis +Project [try_subtract(9223372036854775807, -1) AS try_subtract(9223372036854775807, -1)#xL] ++- OneRowRelation + + +-- !query +SELECT try_subtract(-9223372036854775808L, 1) +-- !query analysis +Project [try_subtract(-9223372036854775808, 1) AS try_subtract(-9223372036854775808, 1)#xL] ++- OneRowRelation + + +-- !query +SELECT try_subtract(1, (2147483647 + 1)) +-- !query analysis +Project [try_subtract(1, (2147483647 + 1)) AS try_subtract(1, (2147483647 + 1))#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(1L, (9223372036854775807L + 1L)) +-- !query analysis +Project [try_subtract(1, (9223372036854775807 + 1)) AS try_subtract(1, (9223372036854775807 + 1))#xL] ++- OneRowRelation + + +-- !query +SELECT try_subtract(1, 1.0 / 0.0) +-- !query analysis +Project [try_subtract(1, (1.0 / 0.0)) AS try_subtract(1, (1.0 / 0.0))#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(interval 2 year, interval 3 year) +-- !query analysis +Project [try_subtract(INTERVAL '2' YEAR, INTERVAL '3' YEAR) AS try_subtract(INTERVAL '2' YEAR, INTERVAL '3' YEAR)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(interval 3 second, interval 2 second) +-- !query analysis +Project [try_subtract(INTERVAL '03' SECOND, INTERVAL '02' SECOND) AS try_subtract(INTERVAL '03' SECOND, INTERVAL '02' SECOND)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(interval 2147483647 month, interval -2 month) +-- !query analysis +Project [try_subtract(INTERVAL '2147483647' MONTH, INTERVAL '-2' MONTH) AS try_subtract(INTERVAL '2147483647' MONTH, INTERVAL '-2' MONTH)#x] ++- OneRowRelation + + +-- !query +SELECT try_subtract(interval 106751991 day, interval -3 day) +-- !query analysis +Project [try_subtract(INTERVAL '106751991' DAY, INTERVAL '-3' DAY) AS try_subtract(INTERVAL '106751991' DAY, INTERVAL '-3' DAY)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(2, 3) +-- !query analysis +Project [try_multiply(2, 3) AS try_multiply(2, 3)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(2147483647, -2) +-- !query analysis +Project [try_multiply(2147483647, -2) AS try_multiply(2147483647, -2)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(2147483647, decimal(-2)) +-- !query analysis +Project [try_multiply(2147483647, cast(-2 as decimal(10,0))) AS try_multiply(2147483647, -2)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(2147483647, "-2") +-- !query analysis +Project [try_multiply(2147483647, -2) AS try_multiply(2147483647, -2)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(-2147483648, 2) +-- !query analysis +Project [try_multiply(-2147483648, 2) AS try_multiply(-2147483648, 2)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(9223372036854775807L, 2) +-- !query analysis +Project [try_multiply(9223372036854775807, 2) AS try_multiply(9223372036854775807, 2)#xL] ++- OneRowRelation + + +-- !query +SELECT try_multiply(-9223372036854775808L, -2) +-- !query analysis +Project [try_multiply(-9223372036854775808, -2) AS try_multiply(-9223372036854775808, -2)#xL] ++- OneRowRelation + + +-- !query +SELECT try_multiply(1, (2147483647 + 1)) +-- !query analysis +Project [try_multiply(1, (2147483647 + 1)) AS try_multiply(1, (2147483647 + 1))#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(1L, (9223372036854775807L + 1L)) +-- !query analysis +Project [try_multiply(1, (9223372036854775807 + 1)) AS try_multiply(1, (9223372036854775807 + 1))#xL] ++- OneRowRelation + + +-- !query +SELECT try_multiply(1, 1.0 / 0.0) +-- !query analysis +Project [try_multiply(1, (1.0 / 0.0)) AS try_multiply(1, (1.0 / 0.0))#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(interval 2 year, 2) +-- !query analysis +Project [try_multiply(INTERVAL '2' YEAR, 2) AS try_multiply(INTERVAL '2' YEAR, 2)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(interval 2 second, 2) +-- !query analysis +Project [try_multiply(INTERVAL '02' SECOND, 2) AS try_multiply(INTERVAL '02' SECOND, 2)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(interval 2 year, 0) +-- !query analysis +Project [try_multiply(INTERVAL '2' YEAR, 0) AS try_multiply(INTERVAL '2' YEAR, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(interval 2 second, 0) +-- !query analysis +Project [try_multiply(INTERVAL '02' SECOND, 0) AS try_multiply(INTERVAL '02' SECOND, 0)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(interval 2147483647 month, 2) +-- !query analysis +Project [try_multiply(INTERVAL '2147483647' MONTH, 2) AS try_multiply(INTERVAL '2147483647' MONTH, 2)#x] ++- OneRowRelation + + +-- !query +SELECT try_multiply(interval 106751991 day, 2) +-- !query analysis +Project [try_multiply(INTERVAL '106751991' DAY, 2) AS try_multiply(INTERVAL '106751991' DAY, 2)#x] ++- OneRowRelation diff --git a/sql/core/src/test/resources/sql-tests/inputs/try_arithmetic.sql b/sql/core/src/test/resources/sql-tests/inputs/try_arithmetic.sql index 55907b6701e5..943865b68d39 100644 --- a/sql/core/src/test/resources/sql-tests/inputs/try_arithmetic.sql +++ b/sql/core/src/test/resources/sql-tests/inputs/try_arithmetic.sql @@ -1,6 +1,8 @@ -- Numeric + Numeric SELECT try_add(1, 1); SELECT try_add(2147483647, 1); +SELECT try_add(2147483647, decimal(1)); +SELECT try_add(2147483647, "1"); SELECT try_add(-2147483648, -1); SELECT try_add(9223372036854775807L, 1); SELECT try_add(-9223372036854775808L, -1); @@ -38,6 +40,8 @@ SELECT try_divide(0, 0); SELECT try_divide(1, (2147483647 + 1)); SELECT try_divide(1L, (9223372036854775807L + 1L)); SELECT try_divide(1, 1.0 / 0.0); +SELECT try_divide(1, decimal(0)); +SELECT try_divide(1, "0"); -- Interval / Numeric SELECT try_divide(interval 2 year, 2); @@ -50,6 +54,8 @@ SELECT try_divide(interval 106751991 day, 0.5); -- Numeric - Numeric SELECT try_subtract(1, 1); SELECT try_subtract(2147483647, -1); +SELECT try_subtract(2147483647, decimal(-1)); +SELECT try_subtract(2147483647, "-1"); SELECT try_subtract(-2147483648, 1); SELECT try_subtract(9223372036854775807L, -1); SELECT try_subtract(-9223372036854775808L, 1); @@ -66,6 +72,8 @@ SELECT try_subtract(interval 106751991 day, interval -3 day); -- Numeric * Numeric SELECT try_multiply(2, 3); SELECT try_multiply(2147483647, -2); +SELECT try_multiply(2147483647, decimal(-2)); +SELECT try_multiply(2147483647, "-2"); SELECT try_multiply(-2147483648, 2); SELECT try_multiply(9223372036854775807L, 2); SELECT try_multiply(-9223372036854775808L, -2); diff --git a/sql/core/src/test/resources/sql-tests/results/ansi/try_arithmetic.sql.out b/sql/core/src/test/resources/sql-tests/results/ansi/try_arithmetic.sql.out index cf29eff19fbb..2ec5bebde59c 100644 --- a/sql/core/src/test/resources/sql-tests/results/ansi/try_arithmetic.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/ansi/try_arithmetic.sql.out @@ -15,6 +15,22 @@ struct<try_add(2147483647, 1):int> NULL +-- !query +SELECT try_add(2147483647, decimal(1)) +-- !query schema +struct<try_add(2147483647, 1):decimal(11,0)> +-- !query output +2147483648 + + +-- !query +SELECT try_add(2147483647, "1") +-- !query schema +struct<try_add(2147483647, 1):bigint> +-- !query output +2147483648 + + -- !query SELECT try_add(-2147483648, -1) -- !query schema @@ -341,6 +357,22 @@ org.apache.spark.SparkArithmeticException } +-- !query +SELECT try_divide(1, decimal(0)) +-- !query schema +struct<try_divide(1, 0):decimal(12,11)> +-- !query output +NULL + + +-- !query +SELECT try_divide(1, "0") +-- !query schema +struct<try_divide(1, 0):double> +-- !query output +NULL + + -- !query SELECT try_divide(interval 2 year, 2) -- !query schema @@ -405,6 +437,22 @@ struct<try_subtract(2147483647, -1):int> NULL +-- !query +SELECT try_subtract(2147483647, decimal(-1)) +-- !query schema +struct<try_subtract(2147483647, -1):decimal(11,0)> +-- !query output +2147483648 + + +-- !query +SELECT try_subtract(2147483647, "-1") +-- !query schema +struct<try_subtract(2147483647, -1):bigint> +-- !query output +2147483648 + + -- !query SELECT try_subtract(-2147483648, 1) -- !query schema @@ -547,6 +595,22 @@ struct<try_multiply(2147483647, -2):int> NULL +-- !query +SELECT try_multiply(2147483647, decimal(-2)) +-- !query schema +struct<try_multiply(2147483647, -2):decimal(21,0)> +-- !query output +-4294967294 + + +-- !query +SELECT try_multiply(2147483647, "-2") +-- !query schema +struct<try_multiply(2147483647, -2):bigint> +-- !query output +-4294967294 + + -- !query SELECT try_multiply(-2147483648, 2) -- !query schema diff --git a/sql/core/src/test/resources/sql-tests/results/try_arithmetic.sql.out b/sql/core/src/test/resources/sql-tests/results/try_arithmetic.sql.out index 60d6750237a4..30c4fbf81b12 100644 --- a/sql/core/src/test/resources/sql-tests/results/try_arithmetic.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/try_arithmetic.sql.out @@ -15,6 +15,22 @@ struct<try_add(2147483647, 1):int> NULL +-- !query +SELECT try_add(2147483647, decimal(1)) +-- !query schema +struct<try_add(2147483647, 1):decimal(11,0)> +-- !query output +2147483648 + + +-- !query +SELECT try_add(2147483647, "1") +-- !query schema +struct<try_add(2147483647, 1):double> +-- !query output +2.147483648E9 + + -- !query SELECT try_add(-2147483648, -1) -- !query schema @@ -249,6 +265,22 @@ struct<try_divide(1, (1.0 / 0.0)):decimal(16,9)> NULL +-- !query +SELECT try_divide(1, decimal(0)) +-- !query schema +struct<try_divide(1, 0):decimal(12,11)> +-- !query output +NULL + + +-- !query +SELECT try_divide(1, "0") +-- !query schema +struct<try_divide(1, 0):double> +-- !query output +NULL + + -- !query SELECT try_divide(interval 2 year, 2) -- !query schema @@ -313,6 +345,22 @@ struct<try_subtract(2147483647, -1):int> NULL +-- !query +SELECT try_subtract(2147483647, decimal(-1)) +-- !query schema +struct<try_subtract(2147483647, -1):decimal(11,0)> +-- !query output +2147483648 + + +-- !query +SELECT try_subtract(2147483647, "-1") +-- !query schema +struct<try_subtract(2147483647, -1):double> +-- !query output +2.147483648E9 + + -- !query SELECT try_subtract(-2147483648, 1) -- !query schema @@ -409,6 +457,22 @@ struct<try_multiply(2147483647, -2):int> NULL +-- !query +SELECT try_multiply(2147483647, decimal(-2)) +-- !query schema +struct<try_multiply(2147483647, -2):decimal(21,0)> +-- !query output +-4294967294 + + +-- !query +SELECT try_multiply(2147483647, "-2") +-- !query schema +struct<try_multiply(2147483647, -2):double> +-- !query output +-4.294967294E9 + + -- !query SELECT try_multiply(-2147483648, 2) -- !query schema --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org For additional commands, e-mail: commits-h...@spark.apache.org