From c10533dff36eb42cccbaf4e168d87672a55abe46 Mon Sep 17 00:00:00 2001 From: Yuming Wang Date: Fri, 31 May 2019 21:03:45 +0800 Subject: [PATCH] Add 4 date operators: 1. date + integer 2. integer + date 3. date - integer 4. date - date --- .../sql/catalyst/analysis/TypeCoercion.scala | 11 ++++-- .../catalyst/analysis/TypeCoercionSuite.scala | 6 ++++ .../resources/sql-tests/inputs/datetime.sql | 7 +++- .../sql-tests/results/datetime.sql.out | 34 ++++++++++++++++++- 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala index 1ff1e7fffebd5..1fdec89e258a7 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala @@ -820,8 +820,10 @@ object TypeCoercion { } /** - * Turns Add/Subtract of DateType/TimestampType/StringType and CalendarIntervalType - * to TimeAdd/TimeSub + * 1. Turns Add/Subtract of DateType/TimestampType/StringType and CalendarIntervalType + * to TimeAdd/TimeSub. + * 2. Turns Add/Subtract of DateType/IntegerType and IntegerType/DateType + * to DateAdd/DateSub/DateDiff. */ object DateTimeOperations extends Rule[LogicalPlan] { @@ -837,6 +839,11 @@ object TypeCoercion { Cast(TimeAdd(l, r), l.dataType) case Subtract(l, r @ CalendarIntervalType()) if acceptedTypes.contains(l.dataType) => Cast(TimeSub(l, r), l.dataType) + + case Add(l @ DateType(), r @ IntegerType()) => DateAdd(l, r) + case Add(l @ IntegerType(), r @ DateType()) => DateAdd(r, l) + case Subtract(l @ DateType(), r @ IntegerType()) => DateSub(l, r) + case Subtract(l @ DateType(), r @ DateType()) => DateDiff(l, r) } } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionSuite.scala index 0b168d060ef6e..2c3ba1b0daf41 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionSuite.scala @@ -1406,6 +1406,7 @@ class TypeCoercionSuite extends AnalysisTest { val timestamp = Literal(new Timestamp(0L)) val interval = Literal(new CalendarInterval(0, 0)) val str = Literal("2015-01-01") + val intValue = Literal(0, IntegerType) ruleTest(dateTimeOperations, Add(date, interval), Cast(TimeAdd(date, interval), DateType)) ruleTest(dateTimeOperations, Add(interval, date), Cast(TimeAdd(date, interval), DateType)) @@ -1424,6 +1425,11 @@ class TypeCoercionSuite extends AnalysisTest { // interval operations should not be effected ruleTest(dateTimeOperations, Add(interval, interval), Add(interval, interval)) ruleTest(dateTimeOperations, Subtract(interval, interval), Subtract(interval, interval)) + + ruleTest(dateTimeOperations, Add(date, intValue), DateAdd(date, intValue)) + ruleTest(dateTimeOperations, Add(intValue, date), DateAdd(date, intValue)) + ruleTest(dateTimeOperations, Subtract(date, intValue), DateSub(date, intValue)) + ruleTest(dateTimeOperations, Subtract(date, date), DateDiff(date, date)) } /** diff --git a/sql/core/src/test/resources/sql-tests/inputs/datetime.sql b/sql/core/src/test/resources/sql-tests/inputs/datetime.sql index 8bd8bc2b94b8e..2f7ffb73e86b8 100644 --- a/sql/core/src/test/resources/sql-tests/inputs/datetime.sql +++ b/sql/core/src/test/resources/sql-tests/inputs/datetime.sql @@ -28,4 +28,9 @@ select a, b from ttf2 order by a, current_date; select weekday('2007-02-03'), weekday('2009-07-30'), weekday('2017-05-27'), weekday(null), weekday('1582-10-15 13:10:15'); -select year('1500-01-01'), month('1500-01-01'), dayOfYear('1500-01-01'); \ No newline at end of file +select year('1500-01-01'), month('1500-01-01'), dayOfYear('1500-01-01'); + +select date '2001-09-28' + 7; +select 7 + date '2001-09-28'; +select date '2001-10-01' - 7; +select date '2001-10-01' - date '2001-09-28'; diff --git a/sql/core/src/test/resources/sql-tests/results/datetime.sql.out b/sql/core/src/test/resources/sql-tests/results/datetime.sql.out index 2090633802e26..178400e5706b8 100644 --- a/sql/core/src/test/resources/sql-tests/results/datetime.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/datetime.sql.out @@ -1,5 +1,5 @@ -- Automatically generated by SQLQueryTestSuite --- Number of queries: 11 +-- Number of queries: 15 -- !query 0 @@ -97,3 +97,35 @@ select year('1500-01-01'), month('1500-01-01'), dayOfYear('1500-01-01') struct -- !query 10 output 1500 1 1 + + +-- !query 11 +select date '2001-09-28' + 7 +-- !query 11 schema +struct +-- !query 11 output +2001-10-05 + + +-- !query 12 +select 7 + date '2001-09-28' +-- !query 12 schema +struct +-- !query 12 output +2001-10-05 + + +-- !query 13 +select date '2001-10-01' - 7 +-- !query 13 schema +struct +-- !query 13 output +2001-09-24 + + +-- !query 14 +select date '2001-10-01' - date '2001-09-28' +-- !query 14 schema +struct +-- !query 14 output +3