From 4e9cdf7d06991c9158851cf75cf6ae8227033079 Mon Sep 17 00:00:00 2001 From: TJX2014 Date: Sat, 13 Jun 2020 09:42:30 +0800 Subject: [PATCH 1/3] bug reproduce --- .../expressions/CollectionExpressionsSuite.scala | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CollectionExpressionsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CollectionExpressionsSuite.scala index a4baad0c72444..92f891c10ddaf 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CollectionExpressionsSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CollectionExpressionsSuite.scala @@ -1836,4 +1836,13 @@ class CollectionExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper checkEvaluation(ArrayIntersect(empty, oneNull), Seq.empty) checkEvaluation(ArrayIntersect(oneNull, empty), Seq.empty) } + + test("SPARK-31980: Start and end equal in month range") { + checkEvaluation(new Sequence( + Literal(Date.valueOf("2018-01-01")), + Literal(Date.valueOf("2018-01-01")), + Literal(stringToInterval("interval 1 month"))), + Seq( + Date.valueOf("2018-01-01"))) + } } From f970add5c7402dc45e87af7fafe40ae05cd519fd Mon Sep 17 00:00:00 2001 From: TJX2014 Date: Sat, 13 Jun 2020 11:33:47 +0800 Subject: [PATCH 2/3] support start and end time equal condition judge to fix while recursive forever --- .../spark/sql/catalyst/expressions/collectionOperations.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala index b32e9ee05f1ef..026a2a677baec 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala @@ -2628,7 +2628,7 @@ object Sequence { val maxEstimatedArrayLength = getSequenceLength(startMicros, stopMicros, intervalStepInMicros) - val stepSign = if (stopMicros > startMicros) +1 else -1 + val stepSign = if (stopMicros >= startMicros) +1 else -1 val exclusiveItem = stopMicros + stepSign val arr = new Array[T](maxEstimatedArrayLength) var t = startMicros @@ -2690,7 +2690,7 @@ object Sequence { | | $sequenceLengthCode | - | final int $stepSign = $stopMicros > $startMicros ? +1 : -1; + | final int $stepSign = $stopMicros >= $startMicros ? +1 : -1; | final long $exclusiveItem = $stopMicros + $stepSign; | | $arr = new $elemType[$arrLength]; From c1765e1af8ee5de6b61261234c0e8db2ba299712 Mon Sep 17 00:00:00 2001 From: TJX2014 Date: Sat, 13 Jun 2020 11:37:54 +0800 Subject: [PATCH 3/3] day and year interval test cases are also support --- .../expressions/CollectionExpressionsSuite.scala | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CollectionExpressionsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CollectionExpressionsSuite.scala index 92f891c10ddaf..3a0c02b29d92c 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CollectionExpressionsSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CollectionExpressionsSuite.scala @@ -1838,11 +1838,20 @@ class CollectionExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper } test("SPARK-31980: Start and end equal in month range") { + checkEvaluation(new Sequence( + Literal(Date.valueOf("2018-01-01")), + Literal(Date.valueOf("2018-01-01")), + Literal(stringToInterval("interval 1 day"))), + Seq(Date.valueOf("2018-01-01"))) checkEvaluation(new Sequence( Literal(Date.valueOf("2018-01-01")), Literal(Date.valueOf("2018-01-01")), Literal(stringToInterval("interval 1 month"))), - Seq( - Date.valueOf("2018-01-01"))) + Seq(Date.valueOf("2018-01-01"))) + checkEvaluation(new Sequence( + Literal(Date.valueOf("2018-01-01")), + Literal(Date.valueOf("2018-01-01")), + Literal(stringToInterval("interval 1 year"))), + Seq(Date.valueOf("2018-01-01"))) } }