Skip to content

Commit 633781f

Browse files
committed
add test cases
1 parent 457d3b6 commit 633781f

File tree

4 files changed

+351
-34
lines changed

4 files changed

+351
-34
lines changed

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

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -224,12 +224,12 @@ object DateTimeUtils {
224224
* value. The return type is [[Option]] in order to distinguish between 0L and null. The following
225225
* formats are allowed:
226226
*
227-
* `yyyy`
228-
* `yyyy-[m]m`
229-
* `yyyy-[m]m-[d]d`
230-
* `yyyy-[m]m-[d]d `
231-
* `yyyy-[m]m-[d]d [h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
232-
* `yyyy-[m]m-[d]dT[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
227+
* `[+-]y*`
228+
* `[+-]y*-[m]m`
229+
* `[+-]y*-[m]m-[d]d`
230+
* `[+-]y*-[m]m-[d]d `
231+
* `[+-]y*-[m]m-[d]d [h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
232+
* `[+-]y*-[m]m-[d]dT[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
233233
* `[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
234234
* `T[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
235235
*
@@ -357,6 +357,7 @@ object DateTimeUtils {
357357
case "-" => ZoneOffset.ofHoursMinutes(-segments(7), -segments(8))
358358
case zoneName: String => getZoneId(zoneName.trim)
359359
}
360+
segments(0) *= sign
360361
(segments, zoneId, justTime)
361362
}
362363

@@ -365,12 +366,12 @@ object DateTimeUtils {
365366
* value. The return type is [[Option]] in order to distinguish between 0L and null. The following
366367
* formats are allowed:
367368
*
368-
* `yyyy`
369-
* `yyyy-[m]m`
370-
* `yyyy-[m]m-[d]d`
371-
* `yyyy-[m]m-[d]d `
372-
* `yyyy-[m]m-[d]d [h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
373-
* `yyyy-[m]m-[d]dT[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
369+
* `[+-]y*`
370+
* `[+-]y*-[m]m`
371+
* `[+-]y*-[m]m-[d]d`
372+
* `[+-]y*-[m]m-[d]d `
373+
* `[+-]y*-[m]m-[d]d [h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
374+
* `[+-]y*-[m]m-[d]dT[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
374375
* `[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
375376
* `T[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
376377
*
@@ -398,7 +399,7 @@ object DateTimeUtils {
398399
val localDate = if (justTime) {
399400
LocalDate.now(zoneId)
400401
} else {
401-
LocalDate.of(sign * segments(0), segments(1), segments(2))
402+
LocalDate.of(segments(0), segments(1), segments(2))
402403
}
403404
val localDateTime = LocalDateTime.of(localDate, localTime)
404405
val zonedDateTime = ZonedDateTime.of(localDateTime, zoneId)
@@ -422,12 +423,12 @@ object DateTimeUtils {
422423
* The return type is [[Option]] in order to distinguish between 0L and null. The following
423424
* formats are allowed:
424425
*
425-
* `yyyy`
426-
* `yyyy-[m]m`
427-
* `yyyy-[m]m-[d]d`
428-
* `yyyy-[m]m-[d]d `
429-
* `yyyy-[m]m-[d]d [h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
430-
* `yyyy-[m]m-[d]dT[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
426+
* `[+-]y*`
427+
* `[+-]y*-[m]m`
428+
* `[+-]y*-[m]m-[d]d`
429+
* `[+-]y*-[m]m-[d]d `
430+
* `[+-]y*-[m]m-[d]d [h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
431+
* `[+-]y*-[m]m-[d]dT[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]`
431432
*
432433
* where `zone_id` should have one of the forms:
433434
* - Z - Zulu time zone UTC+0
@@ -515,12 +516,12 @@ object DateTimeUtils {
515516
* The return type is [[Option]] in order to distinguish between 0 and null. The following
516517
* formats are allowed:
517518
*
518-
* `yyyy`
519-
* `yyyy-[m]m`
520-
* `yyyy-[m]m-[d]d`
521-
* `yyyy-[m]m-[d]d `
522-
* `yyyy-[m]m-[d]d *`
523-
* `yyyy-[m]m-[d]dT*`
519+
* `[+-]y*`
520+
* `[+-]y*-[m]m`
521+
* `[+-]y*-[m]m-[d]d`
522+
* `[+-]y*-[m]m-[d]d `
523+
* `[+-]y*-[m]m-[d]d *`
524+
* `[+-]y*-[m]m-[d]dT*`
524525
*/
525526
def stringToDate(s: UTF8String): Option[Int] = {
526527
if (s == null) {

sql/core/src/test/resources/sql-tests/inputs/datetime.sql

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,3 +257,29 @@ select to_timestamp_ntz('2021-06-25 10:11:12') - interval '10-9' year to month;
257257
select to_timestamp_ntz('2021-06-25 10:11:12') - interval '20 15' day to hour;
258258
select to_timestamp_ntz('2021-06-25 10:11:12') - interval '20 15:40' day to minute;
259259
select to_timestamp_ntz('2021-06-25 10:11:12') - interval '20 15:40:32.99899999' day to second;
260+
261+
-- datetime with year outside [0000-9999]
262+
-- enable java8API for datetime because the `java.sql.Date` only supports year from 0 to 9999
263+
set spark.sql.datetime.java8API.enabled=true;
264+
select date'02015-03-18';
265+
select date'015';
266+
select date'-1-1-28';
267+
-- Int.MaxValue and Int.MaxValue + 1 day
268+
select cast('5881580-7-11' as date);;
269+
select cast('5881580-7-12' as date);
270+
-- Int.MinValue and Int.MinValue - 1 day
271+
select cast('-5877641-6-23' as date);
272+
select cast('-5877641-6-22' as date);
273+
274+
select timestamp'-1969-12-31 16:00:00';
275+
select timestamp'02015-03-18 16:00:00';
276+
select timestamp'015-03-18 16:00:00';
277+
select timestamp'-000001';
278+
select timestamp'99999-03-18T12:03:17';
279+
-- Long.MaxValue and Long.MaxValue + 1 micro seconds
280+
select cast('294247-01-10T04:00:54.775807Z' as timestamp);
281+
select cast('294247-01-10T04:00:54.775808Z' as timestamp);
282+
-- Long.MinValue and Long.MinValue - 1 micro seconds
283+
select cast('-290308-12-21T19:59:05.224192Z' as timestamp);
284+
select cast('-290308-12-21T19:59:05.224191Z' as timestamp);
285+
set spark.sql.datetime.java8API.enabled=false;

sql/core/src/test/resources/sql-tests/results/ansi/datetime.sql.out

Lines changed: 153 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
-- Automatically generated by SQLQueryTestSuite
2-
-- Number of queries: 193
2+
-- Number of queries: 211
33

44

55
-- !query
@@ -365,10 +365,9 @@ struct<2011-11-11 11:11:11 - INTERVAL '2 seconds':string>
365365
-- !query
366366
select '1' - interval '2' second
367367
-- !query schema
368-
struct<>
368+
struct<1 - INTERVAL '2 seconds':string>
369369
-- !query output
370-
java.time.DateTimeException
371-
Cannot cast 1 to TimestampType.
370+
0000-12-31 23:59:58
372371

373372

374373
-- !query
@@ -662,10 +661,9 @@ struct<date_sub(DATE '2001-10-01', 7):date>
662661
-- !query
663662
select date '2001-10-01' - '7'
664663
-- !query schema
665-
struct<>
664+
struct<(DATE '2001-10-01' - 7):interval day>
666665
-- !query output
667-
java.time.DateTimeException
668-
Cannot cast 7 to DateType.
666+
728567 00:00:00.000000000
669667

670668

671669
-- !query
@@ -1642,3 +1640,151 @@ select to_timestamp_ntz('2021-06-25 10:11:12') - interval '20 15:40:32.99899999'
16421640
struct<to_timestamp_ntz(2021-06-25 10:11:12) - INTERVAL '20 15:40:32.998999' DAY TO SECOND:timestamp without time zone>
16431641
-- !query output
16441642
2021-06-04 18:30:39.001001
1643+
1644+
1645+
-- !query
1646+
set spark.sql.datetime.java8API.enabled=true
1647+
-- !query schema
1648+
struct<key:string,value:string>
1649+
-- !query output
1650+
spark.sql.datetime.java8API.enabled true
1651+
1652+
1653+
-- !query
1654+
select date'02015-03-18'
1655+
-- !query schema
1656+
struct<DATE '2015-03-18':date>
1657+
-- !query output
1658+
2015-03-18
1659+
1660+
1661+
-- !query
1662+
select date'015'
1663+
-- !query schema
1664+
struct<DATE '0015-01-01':date>
1665+
-- !query output
1666+
0015-01-01
1667+
1668+
1669+
-- !query
1670+
select date'-1-1-28'
1671+
-- !query schema
1672+
struct<DATE '-0001-01-28':date>
1673+
-- !query output
1674+
-0001-01-28
1675+
1676+
1677+
-- !query
1678+
select cast('5881580-7-11' as date)
1679+
-- !query schema
1680+
struct<CAST(5881580-7-11 AS DATE):date>
1681+
-- !query output
1682+
+5881580-07-11
1683+
1684+
1685+
-- !query
1686+
select cast('5881580-7-12' as date)
1687+
-- !query schema
1688+
struct<>
1689+
-- !query output
1690+
java.time.DateTimeException
1691+
Cannot cast 5881580-7-12 to DateType.
1692+
1693+
1694+
-- !query
1695+
select cast('-5877641-6-23' as date)
1696+
-- !query schema
1697+
struct<CAST(-5877641-6-23 AS DATE):date>
1698+
-- !query output
1699+
-5877641-06-23
1700+
1701+
1702+
-- !query
1703+
select cast('-5877641-6-22' as date)
1704+
-- !query schema
1705+
struct<>
1706+
-- !query output
1707+
java.time.DateTimeException
1708+
Cannot cast -5877641-6-22 to DateType.
1709+
1710+
1711+
-- !query
1712+
select timestamp'-1969-12-31 16:00:00'
1713+
-- !query schema
1714+
struct<TIMESTAMP '-1969-12-31 16:00:00':timestamp>
1715+
-- !query output
1716+
-1969-12-31 16:00:00
1717+
1718+
1719+
-- !query
1720+
select timestamp'02015-03-18 16:00:00'
1721+
-- !query schema
1722+
struct<TIMESTAMP '2015-03-18 16:00:00':timestamp>
1723+
-- !query output
1724+
2015-03-18 16:00:00
1725+
1726+
1727+
-- !query
1728+
select timestamp'015-03-18 16:00:00'
1729+
-- !query schema
1730+
struct<TIMESTAMP '0015-03-18 16:00:00':timestamp>
1731+
-- !query output
1732+
0015-03-18 16:00:00
1733+
1734+
1735+
-- !query
1736+
select timestamp'-000001'
1737+
-- !query schema
1738+
struct<TIMESTAMP '-0001-01-01 00:00:00':timestamp>
1739+
-- !query output
1740+
-0001-01-01 00:00:00
1741+
1742+
1743+
-- !query
1744+
select timestamp'99999-03-18T12:03:17'
1745+
-- !query schema
1746+
struct<TIMESTAMP '+99999-03-18 12:03:17':timestamp>
1747+
-- !query output
1748+
+99999-03-18 12:03:17
1749+
1750+
1751+
-- !query
1752+
select cast('294247-01-10T04:00:54.775807Z' as timestamp)
1753+
-- !query schema
1754+
struct<CAST(294247-01-10T04:00:54.775807Z AS TIMESTAMP):timestamp>
1755+
-- !query output
1756+
+294247-01-09 20:00:54.775807
1757+
1758+
1759+
-- !query
1760+
select cast('294247-01-10T04:00:54.775808Z' as timestamp)
1761+
-- !query schema
1762+
struct<>
1763+
-- !query output
1764+
java.time.DateTimeException
1765+
Cannot cast 294247-01-10T04:00:54.775808Z to TimestampType.
1766+
1767+
1768+
-- !query
1769+
select cast('-290308-12-21T19:59:05.224192Z' as timestamp)
1770+
-- !query schema
1771+
struct<CAST(-290308-12-21T19:59:05.224192Z AS TIMESTAMP):timestamp>
1772+
-- !query output
1773+
-290308-12-21 12:06:07.224192
1774+
1775+
1776+
-- !query
1777+
select cast('-290308-12-21T19:59:05.224191Z' as timestamp)
1778+
-- !query schema
1779+
struct<>
1780+
-- !query output
1781+
java.time.DateTimeException
1782+
Cannot cast -290308-12-21T19:59:05.224191Z to TimestampType.
1783+
1784+
1785+
-- !query
1786+
set spark.sql.datetime.java8API.enabled=false
1787+
-- !query schema
1788+
struct<key:string,value:string>
1789+
-- !query output
1790+
spark.sql.datetime.java8API.enabled false

0 commit comments

Comments
 (0)