Peng-Lei commented on a change in pull request #33080:
URL: https://github.com/apache/spark/pull/33080#discussion_r658651101
##########
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:
I tried to test multiply/divide of day-time intervals of any fields by
numeric in two ways. First method is simple, but it is incomplete, because it
does not use checkEvaluation. just compare the eval(). Second method is
enumerate data to test. I'll delete one way, what about your suggestion? Thank
you.
--
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]