AngersZhuuuu commented on a change in pull request #33080:
URL: https://github.com/apache/spark/pull/33080#discussion_r658649839
##########
File path:
sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/IntervalExpressionsSuite.scala
##########
@@ -535,4 +533,195 @@ class IntervalExpressionsSuite extends SparkFunSuite with
ExpressionEvalHelper {
checkImplicitEvaluation(MakeYMInterval(Literal(1d), Literal(-1L)), 11)
checkImplicitEvaluation(MakeYMInterval(Literal(1.1), Literal(-1L)), 11)
}
+
+ test("SPARK-35728: Check multiply/divide of day-time intervals of any fields
by numeric 1") {
+ // we have guaranteed DayTimeIntervalType(DAY, SECOND) multiply/divide
numeric is right
+ Seq(
+ (Duration.ofMinutes(0), 10),
+ (Duration.ofSeconds(10), 0L),
+ (Duration.ofMillis(100), -1.toByte),
+ (Duration.ofDays(12), 0.3d),
+ (Duration.of(-1000, ChronoUnit.MICROS), 0.3f),
+ (Duration.ofDays(9999), 0.0001d),
+ (Duration.ofDays(9999), BigDecimal(0.0001))
+ ).foreach { case (duration, num) =>
+ DataTypeTestUtils.dayTimeIntervalTypes.foreach { dt =>
+ val expectedDuration = dt.endField match {
+ case DAY => Duration.ofDays(duration.toDays)
+ case HOUR => Duration.ofHours(duration.toHours)
+ case MINUTE => Duration.ofMinutes(duration.toMinutes)
+ case SECOND => duration
+ }
+ val actualResult1 = MultiplyDTInterval(Literal.create(duration, dt),
Literal(num)).eval()
+ val expectResult1 = MultiplyDTInterval(Literal(expectedDuration),
Literal(num)).eval()
+ assert(actualResult1 == expectResult1)
+ if (num != 0) {
+ val actualResult2 = DivideDTInterval(Literal.create(duration, dt),
Literal(num)).eval()
+ val expectResult2 = DivideDTInterval(Literal(expectedDuration),
Literal(num)).eval()
+ assert(actualResult2 == expectResult2)
+ }
+ }
+ }
+ }
+
+ test("SPARK-35728: Check multiply/divide of day-time intervals of any fields
by numeric 2") {
+ Seq(
+ ((Duration.ofMinutes(0), 10),
+ Array(Duration.ofDays(0), Duration.ofHours(0), Duration.ofMinutes(0),
+ Duration.ofSeconds(0), Duration.ofHours(0), Duration.ofMinutes(0),
+ Duration.ofSeconds(0), Duration.ofMinutes(0), Duration.ofSeconds(0),
+ Duration.ofSeconds(0)),
+ Array(Duration.ofDays(0), Duration.ofHours(0), Duration.ofMinutes(0),
+ Duration.ofSeconds(0), Duration.ofHours(0), Duration.ofMinutes(0),
+ Duration.ofSeconds(0), Duration.ofMinutes(0), Duration.ofSeconds(0),
+ Duration.ofSeconds(0))),
+ ((Duration.ofSeconds(86400 + 3600 + 60 + 1), 1L),
+ Array(Duration.ofSeconds(86400), Duration.ofSeconds(90000),
+ Duration.ofSeconds(90060), Duration.ofSeconds(90061),
+ Duration.ofSeconds(90000), Duration.ofSeconds(90060),
+ Duration.ofSeconds(90061), Duration.ofSeconds(90060),
+ Duration.ofSeconds(90061), Duration.ofSeconds(90061)),
+ Array(Duration.ofSeconds(86400), Duration.ofSeconds(90000),
+ Duration.ofSeconds(90060), Duration.ofSeconds(90061),
+ Duration.ofSeconds(90000), Duration.ofSeconds(90060),
+ Duration.ofSeconds(90061), Duration.ofSeconds(90060),
+ Duration.ofSeconds(90061), Duration.ofSeconds(90061))),
+ ((Duration.ofSeconds(86400 + 3600 + 60 + 1), -1.toByte),
+ Array(Duration.ofSeconds(-86400), Duration.ofSeconds(-90000),
+ Duration.ofSeconds(-90060), Duration.ofSeconds(-90061),
+ Duration.ofSeconds(-90000), Duration.ofSeconds(-90060),
+ Duration.ofSeconds(-90061), Duration.ofSeconds(-90060),
+ Duration.ofSeconds(-90061), Duration.ofSeconds(-90061)),
+ Array(Duration.ofSeconds(-86400), Duration.ofSeconds(-90000),
+ Duration.ofSeconds(-90060), Duration.ofSeconds(-90061),
+ Duration.ofSeconds(-90000), Duration.ofSeconds(-90060),
+ Duration.ofSeconds(-90061), Duration.ofSeconds(-90060),
+ Duration.ofSeconds(-90061), Duration.ofSeconds(-90061))),
+ ((Duration.ofSeconds(86400 + 3600 + 60 + 1), 0.3d),
+ Array(Duration.ofSeconds(288000), Duration.ofSeconds(300000),
+ Duration.ofSeconds(300200), Duration.ofNanos(300203333333000L),
+ Duration.ofSeconds(300000), Duration.ofSeconds(300200),
+ Duration.ofNanos(300203333333000L), Duration.ofSeconds(300200),
+ Duration.ofNanos(300203333333000L),
Duration.ofNanos(300203333333000L)),
+ Array(Duration.ofSeconds(25920), Duration.ofSeconds(27000),
+ Duration.ofSeconds(27018), Duration.ofMillis(27018300),
+ Duration.ofSeconds(27000), Duration.ofSeconds(27018),
+ Duration.ofMillis(27018300), Duration.ofSeconds(27018),
+ Duration.ofMillis(27018300), Duration.ofMillis(27018300))),
+ ((Duration.of(-1000, ChronoUnit.MICROS), 0.3f),
+ Array(Duration.ofSeconds(0), Duration.ofSeconds(0),
+ Duration.ofSeconds(0), Duration.ofNanos(-3333000L),
+ Duration.ofSeconds(0), Duration.ofSeconds(0),
+ Duration.ofNanos(-3333000L), Duration.ofSeconds(0),
+ Duration.ofNanos(-3333000L), Duration.ofNanos(-3333000L)),
+ Array(Duration.ofSeconds(0), Duration.ofSeconds(0),
+ Duration.ofSeconds(0), Duration.ofNanos(-300000),
+ Duration.ofSeconds(0), Duration.ofSeconds(0),
+ Duration.ofNanos(-300000), Duration.ofSeconds(0),
+ Duration.ofNanos(-300000), Duration.ofNanos(-300000))),
+ ((Duration.ofDays(9999), 0.0001d),
+ Array(Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L)),
+ Array(Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360))),
+ ((Duration.ofDays(9999), BigDecimal(0.0001)),
+ Array(Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L)),
+ Array(Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360)))
+ ).foreach { case ((duration, num), divideExpected, multiplyExpected) =>
+ DataTypeTestUtils.dayTimeIntervalTypes.zip(divideExpected)
+ .foreach { case (dt, result) =>
+ checkEvaluation(DivideDTInterval(Literal.create(duration, dt),
Literal(num)), result)
+ }
+ DataTypeTestUtils.dayTimeIntervalTypes.zip(multiplyExpected)
+ .foreach { case (dt, result) =>
+ checkEvaluation(MultiplyDTInterval(Literal.create(duration, dt),
Literal(num)), result)
+ }
+ }
+ }
+
+ test("SPARK-35778: Check multiply/divide of year-month intervals of any
fields by numeric 1") {
Review comment:
Why have two ut for this?
##########
File path:
sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/IntervalExpressionsSuite.scala
##########
@@ -535,4 +533,195 @@ class IntervalExpressionsSuite extends SparkFunSuite with
ExpressionEvalHelper {
checkImplicitEvaluation(MakeYMInterval(Literal(1d), Literal(-1L)), 11)
checkImplicitEvaluation(MakeYMInterval(Literal(1.1), Literal(-1L)), 11)
}
+
+ test("SPARK-35728: Check multiply/divide of day-time intervals of any fields
by numeric 1") {
+ // we have guaranteed DayTimeIntervalType(DAY, SECOND) multiply/divide
numeric is right
+ Seq(
+ (Duration.ofMinutes(0), 10),
+ (Duration.ofSeconds(10), 0L),
+ (Duration.ofMillis(100), -1.toByte),
+ (Duration.ofDays(12), 0.3d),
+ (Duration.of(-1000, ChronoUnit.MICROS), 0.3f),
+ (Duration.ofDays(9999), 0.0001d),
+ (Duration.ofDays(9999), BigDecimal(0.0001))
+ ).foreach { case (duration, num) =>
+ DataTypeTestUtils.dayTimeIntervalTypes.foreach { dt =>
+ val expectedDuration = dt.endField match {
+ case DAY => Duration.ofDays(duration.toDays)
+ case HOUR => Duration.ofHours(duration.toHours)
+ case MINUTE => Duration.ofMinutes(duration.toMinutes)
+ case SECOND => duration
+ }
+ val actualResult1 = MultiplyDTInterval(Literal.create(duration, dt),
Literal(num)).eval()
+ val expectResult1 = MultiplyDTInterval(Literal(expectedDuration),
Literal(num)).eval()
+ assert(actualResult1 == expectResult1)
+ if (num != 0) {
+ val actualResult2 = DivideDTInterval(Literal.create(duration, dt),
Literal(num)).eval()
+ val expectResult2 = DivideDTInterval(Literal(expectedDuration),
Literal(num)).eval()
+ assert(actualResult2 == expectResult2)
+ }
+ }
+ }
+ }
+
+ test("SPARK-35728: Check multiply/divide of day-time intervals of any fields
by numeric 2") {
+ Seq(
+ ((Duration.ofMinutes(0), 10),
+ Array(Duration.ofDays(0), Duration.ofHours(0), Duration.ofMinutes(0),
+ Duration.ofSeconds(0), Duration.ofHours(0), Duration.ofMinutes(0),
+ Duration.ofSeconds(0), Duration.ofMinutes(0), Duration.ofSeconds(0),
+ Duration.ofSeconds(0)),
+ Array(Duration.ofDays(0), Duration.ofHours(0), Duration.ofMinutes(0),
+ Duration.ofSeconds(0), Duration.ofHours(0), Duration.ofMinutes(0),
+ Duration.ofSeconds(0), Duration.ofMinutes(0), Duration.ofSeconds(0),
+ Duration.ofSeconds(0))),
+ ((Duration.ofSeconds(86400 + 3600 + 60 + 1), 1L),
+ Array(Duration.ofSeconds(86400), Duration.ofSeconds(90000),
+ Duration.ofSeconds(90060), Duration.ofSeconds(90061),
+ Duration.ofSeconds(90000), Duration.ofSeconds(90060),
+ Duration.ofSeconds(90061), Duration.ofSeconds(90060),
+ Duration.ofSeconds(90061), Duration.ofSeconds(90061)),
+ Array(Duration.ofSeconds(86400), Duration.ofSeconds(90000),
+ Duration.ofSeconds(90060), Duration.ofSeconds(90061),
+ Duration.ofSeconds(90000), Duration.ofSeconds(90060),
+ Duration.ofSeconds(90061), Duration.ofSeconds(90060),
+ Duration.ofSeconds(90061), Duration.ofSeconds(90061))),
+ ((Duration.ofSeconds(86400 + 3600 + 60 + 1), -1.toByte),
+ Array(Duration.ofSeconds(-86400), Duration.ofSeconds(-90000),
+ Duration.ofSeconds(-90060), Duration.ofSeconds(-90061),
+ Duration.ofSeconds(-90000), Duration.ofSeconds(-90060),
+ Duration.ofSeconds(-90061), Duration.ofSeconds(-90060),
+ Duration.ofSeconds(-90061), Duration.ofSeconds(-90061)),
+ Array(Duration.ofSeconds(-86400), Duration.ofSeconds(-90000),
+ Duration.ofSeconds(-90060), Duration.ofSeconds(-90061),
+ Duration.ofSeconds(-90000), Duration.ofSeconds(-90060),
+ Duration.ofSeconds(-90061), Duration.ofSeconds(-90060),
+ Duration.ofSeconds(-90061), Duration.ofSeconds(-90061))),
+ ((Duration.ofSeconds(86400 + 3600 + 60 + 1), 0.3d),
+ Array(Duration.ofSeconds(288000), Duration.ofSeconds(300000),
+ Duration.ofSeconds(300200), Duration.ofNanos(300203333333000L),
+ Duration.ofSeconds(300000), Duration.ofSeconds(300200),
+ Duration.ofNanos(300203333333000L), Duration.ofSeconds(300200),
+ Duration.ofNanos(300203333333000L),
Duration.ofNanos(300203333333000L)),
+ Array(Duration.ofSeconds(25920), Duration.ofSeconds(27000),
+ Duration.ofSeconds(27018), Duration.ofMillis(27018300),
+ Duration.ofSeconds(27000), Duration.ofSeconds(27018),
+ Duration.ofMillis(27018300), Duration.ofSeconds(27018),
+ Duration.ofMillis(27018300), Duration.ofMillis(27018300))),
+ ((Duration.of(-1000, ChronoUnit.MICROS), 0.3f),
+ Array(Duration.ofSeconds(0), Duration.ofSeconds(0),
+ Duration.ofSeconds(0), Duration.ofNanos(-3333000L),
+ Duration.ofSeconds(0), Duration.ofSeconds(0),
+ Duration.ofNanos(-3333000L), Duration.ofSeconds(0),
+ Duration.ofNanos(-3333000L), Duration.ofNanos(-3333000L)),
+ Array(Duration.ofSeconds(0), Duration.ofSeconds(0),
+ Duration.ofSeconds(0), Duration.ofNanos(-300000),
+ Duration.ofSeconds(0), Duration.ofSeconds(0),
+ Duration.ofNanos(-300000), Duration.ofSeconds(0),
+ Duration.ofNanos(-300000), Duration.ofNanos(-300000))),
+ ((Duration.ofDays(9999), 0.0001d),
+ Array(Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L)),
+ Array(Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360))),
+ ((Duration.ofDays(9999), BigDecimal(0.0001)),
+ Array(Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L),
+ Duration.ofSeconds(8639136000000L),
Duration.ofSeconds(8639136000000L)),
+ Array(Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360),
+ Duration.ofMillis(86391360), Duration.ofMillis(86391360)))
+ ).foreach { case ((duration, num), divideExpected, multiplyExpected) =>
+ DataTypeTestUtils.dayTimeIntervalTypes.zip(divideExpected)
+ .foreach { case (dt, result) =>
+ checkEvaluation(DivideDTInterval(Literal.create(duration, dt),
Literal(num)), result)
+ }
+ DataTypeTestUtils.dayTimeIntervalTypes.zip(multiplyExpected)
+ .foreach { case (dt, result) =>
+ checkEvaluation(MultiplyDTInterval(Literal.create(duration, dt),
Literal(num)), result)
+ }
+ }
+ }
+
+ test("SPARK-35778: Check multiply/divide of year-month intervals of any
fields by numeric 1") {
+ // we have guaranteed YearMonthIntervalType(YEAR, MONTH) multiply/divide
numeric is right
+ Seq(
+ (Period.ofMonths(0), 10),
+ (Period.ofMonths(13), 1),
+ (Period.ofMonths(-200), 1),
+ (Period.ofYears(100), -1.toByte),
+ (Period.ofYears(1), 2.toShort),
+ (Period.ofYears(-1), -3),
+ (Period.ofMonths(-1000), 0.5f),
+ (Period.ofYears(1000), 100d),
+ (Period.ofMonths(2), BigDecimal(0.1))
+ ).foreach { case ((period, num)) =>
+ DataTypeTestUtils.yearMonthIntervalTypes.foreach { dt =>
+ val expectPeriod = dt.endField match {
+ case YEAR => Period.ofYears(period.normalized().getYears)
+ case MONTH =>
Period.ofYears(period.getYears).withMonths(period.getMonths)
+ case _ => period
+ }
+ val actualResult1 = MultiplyYMInterval(Literal.create(period, dt),
Literal(num)).eval()
+ val expectResult1 = MultiplyYMInterval(Literal(expectPeriod),
Literal(num)).eval()
+ assert(actualResult1 == expectResult1)
+ if (num != 0) {
+ val actualResult2 = DivideYMInterval(Literal.create(period, dt),
Literal(num)).eval()
+ val expectResult2 = DivideYMInterval(Literal(expectPeriod),
Literal(num)).eval()
+ assert(actualResult2 == expectResult2)
+ }
+ }
+ }
+ }
+
+ test("SPARK-35778: Check multiply/divide of year-month intervals of any
fields by numeric 2") {
Review comment:
This UT seems can cover all type field of YearMonthIntervalType
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]