You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by do...@apache.org on 2019/07/05 17:02:22 UTC
[spark] branch master updated: [SPARK-27898][SQL] Support 4 date
operators(date + integer, integer + date, date - integer and date - date)
This is an automated email from the ASF dual-hosted git repository.
dongjoon pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push:
new d493a1f [SPARK-27898][SQL] Support 4 date operators(date + integer, integer + date, date - integer and date - date)
d493a1f is described below
commit d493a1f6bf23938b566ee72f1c8c8f384ebddfe6
Author: Yuming Wang <yu...@ebay.com>
AuthorDate: Fri Jul 5 10:01:43 2019 -0700
[SPARK-27898][SQL] Support 4 date operators(date + integer, integer + date, date - integer and date - date)
## What changes were proposed in this pull request?
This pr add support 4 PostgreSQL's date operators(date + integer, integer + date, date - integer and date - date):
Operator | Example | Result
-- | -- | --
\+ | date '2001-09-28' + 7 | date '2001-10-05'
\+ | 7 + date '2001-09-28' | date '2001-10-05'
\- | date '2001-10-01' - 7 | date '2001-09-24'
\- | date '2001-10-01' - date '2001-09-28' | integer '3' (days)
Most databases support `date - date` operation, where PostgreSQL, Vertica, Teradata, Oracle and DB2 returns `Integer` type, Hive and Presto returns `Interval` type, MySQL returns unexpected value, and SQL Server does not support `date - date` operation.
**PostgreSQL**:
```sql
postgres=# select substr(version(), 0, 16), date '2001-09-28' + 7, 7 + date '2001-09-28', date '2001-10-01' - 7, date '2001-10-01' - date '2001-09-28';
substr | ?column? | ?column? | ?column? | ?column?
-----------------+------------+------------+------------+----------
PostgreSQL 11.3 | 2001-10-05 | 2001-10-05 | 2001-09-24 | 3
(1 row)
```
**Vertica**:
```sql
dbadmin=> select version(), date '2001-09-28' + 7, 7 + date '2001-09-28', date '2001-10-01' - 7, date '2001-10-01' - date '2001-09-28';
version | ?column? | ?column? | ?column? | ?column?
------------------------------------+------------+------------+------------+----------
Vertica Analytic Database v9.1.1-0 | 2001-10-05 | 2001-10-05 | 2001-09-24 | 3
(1 row)
```
**Teradata**:
![image](https://user-images.githubusercontent.com/5399861/59563983-8ba50f80-9073-11e9-821a-9f85b5f2820c.png)
**Oracle**:
![image](https://user-images.githubusercontent.com/5399861/59563928-e68a3700-9072-11e9-8663-e28231a7ac83.png)
**DB2**:
![image](https://user-images.githubusercontent.com/5399861/59564326-fbb59480-9077-11e9-9520-e12ec3e59b0c.png)
**Hive**:
```sql
hive> select version(), date '2001-10-01' - date '2001-09-28';
OK
3.1.1 rf4e0529634b6231a0072295da48af466cf2f10b7 3 00:00:00.000000000
Time taken: 2.038 seconds, Fetched: 1 row(s)
```
**Presto**:
```sql
presto> select date '2001-10-01' - date '2001-09-28';
_col0
----------------
3 00:00:00.000
(1 row)
```
**MySQL**:
```SQL
mysql> SELECT version(), date '2001-10-01' - date '2001-09-28';
+-----------+---------------------------------------+
| version() | date '2001-10-01' - date '2001-09-28' |
+-----------+---------------------------------------+
| 5.7.26 | 73 |
+-----------+---------------------------------------+
1 row in set (0.00 sec)
```
More details:
https://www.postgresql.org/docs/12/functions-datetime.html
## How was this patch tested?
unit tests
Closes #24755 from wangyum/Add4DateOperators.
Authored-by: Yuming Wang <yu...@ebay.com>
Signed-off-by: Dongjoon Hyun <dh...@apple.com>
---
.../spark/sql/catalyst/analysis/TypeCoercion.scala | 11 +++++--
.../sql/catalyst/analysis/TypeCoercionSuite.scala | 6 ++++
.../test/resources/sql-tests/inputs/datetime.sql | 7 ++++-
.../resources/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 1ff1e7f..1fdec89 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 0b168d0..2c3ba1b 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 8bd8bc2..2f7ffb7 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 2090633..178400e 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<year(CAST(1500-01-01 AS DATE)):int,month(CAST(1500-01-01 AS DATE)):int,dayofyear(CAST(1500-01-01 AS DATE)):int>
-- !query 10 output
1500 1 1
+
+
+-- !query 11
+select date '2001-09-28' + 7
+-- !query 11 schema
+struct<date_add(DATE '2001-09-28', 7):date>
+-- !query 11 output
+2001-10-05
+
+
+-- !query 12
+select 7 + date '2001-09-28'
+-- !query 12 schema
+struct<date_add(DATE '2001-09-28', 7):date>
+-- !query 12 output
+2001-10-05
+
+
+-- !query 13
+select date '2001-10-01' - 7
+-- !query 13 schema
+struct<date_sub(DATE '2001-10-01', 7):date>
+-- !query 13 output
+2001-09-24
+
+
+-- !query 14
+select date '2001-10-01' - date '2001-09-28'
+-- !query 14 schema
+struct<datediff(DATE '2001-10-01', DATE '2001-09-28'):int>
+-- !query 14 output
+3
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org