dongjoon-hyun commented on a change in pull request #25000: [SPARK-28107][SQL] 
Support 'day to hour', 'day to minute', 'hour to minute' and 'minute to second'
URL: https://github.com/apache/spark/pull/25000#discussion_r300211876
 
 

 ##########
 File path: 
common/unsafe/src/main/java/org/apache/spark/unsafe/types/CalendarInterval.java
 ##########
 @@ -174,11 +180,46 @@ public static CalendarInterval fromDayTimeString(String 
s) throws IllegalArgumen
         int sign = m.group(1) != null && m.group(1).equals("-") ? -1 : 1;
         long days = m.group(2) == null ? 0 : toLongWithRange("day", m.group(3),
           0, Integer.MAX_VALUE);
-        long hours = toLongWithRange("hour", m.group(4), 0, 23);
-        long minutes = toLongWithRange("minute", m.group(5), 0, 59);
-        long seconds = toLongWithRange("second", m.group(6), 0, 59);
+        long hours;
+        long minutes;
+        long seconds;
+        if ("minute".equals(from)) {
+          hours = m.group(6) == null ? 0 : toLongWithRange("hour", m.group(4), 
0, 23);
+          minutes = m.group(6) == null ? toLongWithRange("minute", m.group(4), 
0, 59)
+            : toLongWithRange("minute", m.group(5), 0, 59);
+          seconds = m.group(6) == null ? toLongWithRange("minute", m.group(5), 
0, 59)
+            : toLongWithRange("second", m.group(7), 0, 59);
+        } else {
+          if (m.group(8) != null && m.group(6) == null) {
+            hours = 0;
+            minutes = toLongWithRange("minute", m.group(4), 0, 59);
+            seconds = toLongWithRange("second", m.group(5), 0, 59);
+          } else {
+            hours = toLongWithRange("hour", m.group(4), 0, 23);
+            minutes = toLongWithRange("minute", m.group(5), 0, 59);
+            seconds = toLongWithRange("second", m.group(7), 0, 59);
+          }
+        }
         // Hive allow nanosecond precision interval
-        long nanos = toLongWithRange("nanosecond", m.group(8), 0L, 999999999L);
+        long nanos = toLongWithRange("nanosecond", m.group(9), 0L, 999999999L);
+        switch (to) {
+          case "hour":
+            minutes = 0;
+            seconds = 0;
+            nanos = 0;
+            break;
+          case "minute":
+            seconds = 0;
+            nanos = 0;
+            break;
+          case "second":
+            //If `to` value is "second", will not re-calculate days, hours, 
minutes, seconds
+            // and nanos
+            break;
+          default:
+            throw new IllegalArgumentException(
+              String.format("Cannot support 'interval '%s' %s to %s' 
expression", s, from, to));
 
 Review comment:
   This string will look weird due to the nested `'`.

----------------------------------------------------------------
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:
us...@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org
For additional commands, e-mail: reviews-h...@spark.apache.org

Reply via email to