Skip to content

Commit 140a26f

Browse files
committed
Special pattern for min-sec
1 parent f381103 commit 140a26f

File tree

2 files changed

+21
-26
lines changed

2 files changed

+21
-26
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/IntervalUtils.scala

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -196,20 +196,13 @@ object IntervalUtils {
196196
UnitName.day -> (0, Integer.MAX_VALUE, Math.multiplyExact(_, DateTimeUtils.MICROS_PER_DAY))
197197
)
198198

199-
private val signRe = "(?<sign>[+|-])?"
200-
private val dayRe = "((?<day>\\d+)\\s+)?"
199+
private val signRe = "(?<sign>[+|-])"
200+
private val dayRe = "((?<day>\\d+)\\s+)"
201201
private val hourRe = "(?<hour>\\d{1,2}+)"
202202
private val minuteRe = "(?<minute>\\d{1,2}+)"
203203
private val secondRe = "(?<second>(\\d{1,2}+)(\\.(\\d{1,9}+))?)"
204-
205-
private val dayTimeRe = Map(
206-
(UnitName.minute, UnitName.second) -> (s"^$signRe$minuteRe:$secondRe$$").r,
207-
(UnitName.hour, UnitName.minute) -> (s"^$signRe$hourRe:$minuteRe$$").r,
208-
(UnitName.hour, UnitName.second) -> (s"^$signRe$hourRe:$minuteRe:$secondRe$$").r,
209-
(UnitName.day, UnitName.hour) -> (s"^$signRe$dayRe$hourRe$$").r,
210-
(UnitName.day, UnitName.minute) -> (s"^$signRe$dayRe$hourRe:$minuteRe$$").r,
211-
(UnitName.day, UnitName.second) -> (s"^$signRe$dayRe$hourRe:$minuteRe:$secondRe$$").r
212-
)
204+
private val minsecRe = (s"^$signRe?$dayRe?($hourRe:)?$minuteRe:$secondRe$$").r
205+
private val daysecRe = (s"^$signRe?$dayRe?$hourRe(:$minuteRe(:$secondRe)?)?$$").r
213206

214207
private def unitsRange(start: UnitName.Value, end: UnitName.Value): Seq[UnitName.Value] = {
215208
(start.id to end.id).map(UnitName(_))
@@ -230,9 +223,10 @@ object IntervalUtils {
230223
to: UnitName.Value): CalendarInterval = {
231224
require(input != null, "Interval day-time string must be not null")
232225
assert(input.length == input.trim.length)
233-
require(dayTimeRe.contains(from -> to),
234-
s"Cannot support (interval '$input' $from to $to) expression")
235-
val pattern = dayTimeRe(from, to).pattern
226+
val pattern = (from, to) match {
227+
case (UnitName.minute, UnitName.second) => minsecRe.pattern
228+
case _ => daysecRe.pattern
229+
}
236230
val m = pattern.matcher(input)
237231
require(m.matches, s"Interval string must match day-time format of '$pattern': $input")
238232

@@ -327,6 +321,7 @@ object IntervalUtils {
327321
Long.MaxValue / DateTimeUtils.MICROS_PER_SECOND) * DateTimeUtils.MICROS_PER_SECOND
328322
}
329323

324+
if (secondNano == null) return 0L
330325
secondNano.split("\\.") match {
331326
case Array(secondsStr) => parseSeconds(secondsStr)
332327
case Array("", nanosStr) => parseNanos(nanosStr, false)

sql/core/src/test/resources/sql-tests/results/postgreSQL/interval.sql.out

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -149,46 +149,46 @@ interval 1 days 2 hours 3 minutes 4 seconds
149149
-- !query 18
150150
SELECT interval '1 2:03' hour to minute
151151
-- !query 18 schema
152-
struct<interval 1 days 2 hours 3 minutes:interval>
152+
struct<interval 2 hours 3 minutes:interval>
153153
-- !query 18 output
154-
interval 1 days 2 hours 3 minutes
154+
interval 2 hours 3 minutes
155155

156156

157157
-- !query 19
158158
SELECT interval '1 2:03:04' hour to minute
159159
-- !query 19 schema
160-
struct<interval 1 days 2 hours 3 minutes:interval>
160+
struct<interval 2 hours 3 minutes:interval>
161161
-- !query 19 output
162-
interval 1 days 2 hours 3 minutes
162+
interval 2 hours 3 minutes
163163

164164

165165
-- !query 20
166166
SELECT interval '1 2:03' hour to second
167167
-- !query 20 schema
168-
struct<interval 1 days 2 hours 3 minutes:interval>
168+
struct<interval 2 hours 3 minutes:interval>
169169
-- !query 20 output
170-
interval 1 days 2 hours 3 minutes
170+
interval 2 hours 3 minutes
171171

172172

173173
-- !query 21
174174
SELECT interval '1 2:03:04' hour to second
175175
-- !query 21 schema
176-
struct<interval 1 days 2 hours 3 minutes 4 seconds:interval>
176+
struct<interval 2 hours 3 minutes 4 seconds:interval>
177177
-- !query 21 output
178-
interval 1 days 2 hours 3 minutes 4 seconds
178+
interval 2 hours 3 minutes 4 seconds
179179

180180

181181
-- !query 22
182182
SELECT interval '1 2:03' minute to second
183183
-- !query 22 schema
184-
struct<interval 1 days 2 minutes 3 seconds:interval>
184+
struct<interval 2 minutes 3 seconds:interval>
185185
-- !query 22 output
186-
interval 1 days 2 minutes 3 seconds
186+
interval 2 minutes 3 seconds
187187

188188

189189
-- !query 23
190190
SELECT interval '1 2:03:04' minute to second
191191
-- !query 23 schema
192-
struct<interval 1 days 2 hours 3 minutes 4 seconds:interval>
192+
struct<interval 3 minutes 4 seconds:interval>
193193
-- !query 23 output
194-
interval 1 days 2 hours 3 minutes 4 seconds
194+
interval 3 minutes 4 seconds

0 commit comments

Comments
 (0)