diff --git a/common/unsafe/src/main/java/org/apache/spark/unsafe/types/CalendarInterval.java b/common/unsafe/src/main/java/org/apache/spark/unsafe/types/CalendarInterval.java index 2a840c11304d..c04b0ea918bf 100644 --- a/common/unsafe/src/main/java/org/apache/spark/unsafe/types/CalendarInterval.java +++ b/common/unsafe/src/main/java/org/apache/spark/unsafe/types/CalendarInterval.java @@ -18,6 +18,7 @@ package org.apache.spark.unsafe.types; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Objects; /** @@ -87,10 +88,7 @@ public String toString() { appendUnit(sb, months % 12, "month"); } - if (days != 0) { - appendUnit(sb, days / 7, "week"); - appendUnit(sb, days % 7, "day"); - } + appendUnit(sb, days, "day"); if (microseconds != 0) { long rest = microseconds; @@ -98,11 +96,10 @@ public String toString() { rest %= MICROS_PER_HOUR; appendUnit(sb, rest / MICROS_PER_MINUTE, "minute"); rest %= MICROS_PER_MINUTE; - appendUnit(sb, rest / MICROS_PER_SECOND, "second"); - rest %= MICROS_PER_SECOND; - appendUnit(sb, rest / MICROS_PER_MILLI, "millisecond"); - rest %= MICROS_PER_MILLI; - appendUnit(sb, rest, "microsecond"); + if (rest != 0) { + String s = BigDecimal.valueOf(rest, 6).stripTrailingZeros().toPlainString(); + sb.append(' ').append(s).append(" seconds"); + } } else if (months == 0 && days == 0) { sb.append(" 0 microseconds"); } diff --git a/common/unsafe/src/test/java/org/apache/spark/unsafe/types/CalendarIntervalSuite.java b/common/unsafe/src/test/java/org/apache/spark/unsafe/types/CalendarIntervalSuite.java index c3ed57c79d56..fe4c1c1f5e36 100644 --- a/common/unsafe/src/test/java/org/apache/spark/unsafe/types/CalendarIntervalSuite.java +++ b/common/unsafe/src/test/java/org/apache/spark/unsafe/types/CalendarIntervalSuite.java @@ -57,19 +57,19 @@ public void toStringTest() { assertEquals("interval -2 years -10 months", i.toString()); i = new CalendarInterval(0, 31, 0); - assertEquals("interval 4 weeks 3 days", i.toString()); + assertEquals("interval 31 days", i.toString()); i = new CalendarInterval(0, -31, 0); - assertEquals("interval -4 weeks -3 days", i.toString()); + assertEquals("interval -31 days", i.toString()); i = new CalendarInterval(0, 0, 3 * MICROS_PER_HOUR + 13 * MICROS_PER_MINUTE + 123); - assertEquals("interval 3 hours 13 minutes 123 microseconds", i.toString()); + assertEquals("interval 3 hours 13 minutes 0.000123 seconds", i.toString()); i = new CalendarInterval(0, 0, -3 * MICROS_PER_HOUR - 13 * MICROS_PER_MINUTE - 123); - assertEquals("interval -3 hours -13 minutes -123 microseconds", i.toString()); + assertEquals("interval -3 hours -13 minutes -0.000123 seconds", i.toString()); i = new CalendarInterval(34, 31, 3 * MICROS_PER_HOUR + 13 * MICROS_PER_MINUTE + 123); - assertEquals("interval 2 years 10 months 4 weeks 3 days 3 hours 13 minutes 123 microseconds", + assertEquals("interval 2 years 10 months 31 days 3 hours 13 minutes 0.000123 seconds", i.toString()); } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala index abeeab6dc7cf..42540036d89c 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala @@ -669,7 +669,7 @@ abstract class CastSuiteBase extends SparkFunSuite with ExpressionEvalHelper { checkEvaluation(Cast(Literal.create( new CalendarInterval(15, 9, -3 * CalendarInterval.MICROS_PER_HOUR), CalendarIntervalType), StringType), - "interval 1 years 3 months 1 weeks 2 days -3 hours") + "interval 1 years 3 months 9 days -3 hours") checkEvaluation(Cast(Literal("INTERVAL 1 Second 1 microsecond"), CalendarIntervalType), new CalendarInterval(0, 0, 1000001)) checkEvaluation(Cast(Literal("1 MONTH 1 Microsecond"), CalendarIntervalType), diff --git a/sql/core/src/test/resources/sql-tests/inputs/literals.sql b/sql/core/src/test/resources/sql-tests/inputs/literals.sql index 389b9cc53e02..c32509525c4d 100644 --- a/sql/core/src/test/resources/sql-tests/inputs/literals.sql +++ b/sql/core/src/test/resources/sql-tests/inputs/literals.sql @@ -84,7 +84,7 @@ select timestamp '2016-33-11 20:54:00.000'; -- interval select interval 13.123456789 seconds, interval -13.123456789 second; -select interval 1 year 2 month 3 week 4 day 5 hour 6 minute 7 seconds 8 millisecond, 9 microsecond; +select interval 1 year 2 month 3 week 4 day 5 hour 6 minute 7 seconds 8 millisecond 9 microsecond; select interval '30' year '25' month '-100' day '40' hour '80' minute '299.889987299' second; select interval '0 0:0:0.1' day to second; select interval '10-9' year to month; diff --git a/sql/core/src/test/resources/sql-tests/results/ansi/interval.sql.out b/sql/core/src/test/resources/sql-tests/results/ansi/interval.sql.out index fcf6b6b10c8a..d0087bbcce55 100644 --- a/sql/core/src/test/resources/sql-tests/results/ansi/interval.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/ansi/interval.sql.out @@ -61,9 +61,9 @@ select interval '13' second, interval '13.123456789' second -- !query 4 schema -struct +struct -- !query 4 output -interval 1 weeks 3 days 9 hours 8 minutes 7 seconds 987 milliseconds 654 microseconds interval 1 weeks 3 days interval 11 hours interval 12 minutes interval 13 seconds interval 13 seconds 123 milliseconds 456 microseconds +interval 10 days 9 hours 8 minutes 7.987654 seconds interval 10 days interval 11 hours interval 12 minutes interval 13 seconds interval 13.123456 seconds -- !query 5 @@ -75,25 +75,25 @@ select '13' second, '13.123456789' second -- !query 5 schema -struct +struct -- !query 5 output -interval 1 weeks 3 days 9 hours 8 minutes 7 seconds 987 milliseconds 654 microseconds interval 1 weeks 3 days interval 11 hours interval 12 minutes interval 13 seconds interval 13 seconds 123 milliseconds 456 microseconds +interval 10 days 9 hours 8 minutes 7.987654 seconds interval 10 days interval 11 hours interval 12 minutes interval 13 seconds interval 13.123456 seconds -- !query 6 select map(1, interval 1 day, 2, interval 3 week) -- !query 6 schema -struct> +struct> -- !query 6 output -{1:interval 1 days,2:interval 3 weeks} +{1:interval 1 days,2:interval 21 days} -- !query 7 select map(1, 1 day, 2, 3 week) -- !query 7 schema -struct> +struct> -- !query 7 output -{1:interval 1 days,2:interval 3 weeks} +{1:interval 1 days,2:interval 21 days} -- !query 8 @@ -204,7 +204,7 @@ select interval '99 11:22:33.123456789' day to second + dateval from interval_arithmetic -- !query 15 schema -struct +struct -- !query 15 output 2012-01-01 2011-09-23 2012-04-09 2012-04-09 2011-09-23 2011-09-23 2012-04-09 @@ -220,7 +220,7 @@ select '99 11:22:33.123456789' day to second + dateval from interval_arithmetic -- !query 16 schema -struct +struct -- !query 16 output 2012-01-01 2011-09-23 2012-04-09 2012-04-09 2011-09-23 2011-09-23 2012-04-09 @@ -236,7 +236,7 @@ select interval '99 11:22:33.123456789' day to second + tsval from interval_arithmetic -- !query 17 schema -struct +struct -- !query 17 output 2012-01-01 00:00:00 2011-09-23 12:37:26.876544 2012-04-09 11:22:33.123456 2012-04-09 11:22:33.123456 2011-09-23 12:37:26.876544 2011-09-23 12:37:26.876544 2012-04-09 11:22:33.123456 @@ -252,7 +252,7 @@ select '99 11:22:33.123456789' day to second + tsval from interval_arithmetic -- !query 18 schema -struct +struct -- !query 18 output 2012-01-01 00:00:00 2011-09-23 12:37:26.876544 2012-04-09 11:22:33.123456 2012-04-09 11:22:33.123456 2011-09-23 12:37:26.876544 2011-09-23 12:37:26.876544 2012-04-09 11:22:33.123456 @@ -263,9 +263,9 @@ select interval '99 11:22:33.123456789' day to second - interval '10 9:8:7.123456789' day to second from interval_arithmetic -- !query 19 schema -struct<(interval 14 weeks 1 days 11 hours 22 minutes 33 seconds 123 milliseconds 456 microseconds + interval 1 weeks 3 days 9 hours 8 minutes 7 seconds 123 milliseconds 456 microseconds):interval,(interval 14 weeks 1 days 11 hours 22 minutes 33 seconds 123 milliseconds 456 microseconds - interval 1 weeks 3 days 9 hours 8 minutes 7 seconds 123 milliseconds 456 microseconds):interval> +struct<(interval 99 days 11 hours 22 minutes 33.123456 seconds + interval 10 days 9 hours 8 minutes 7.123456 seconds):interval,(interval 99 days 11 hours 22 minutes 33.123456 seconds - interval 10 days 9 hours 8 minutes 7.123456 seconds):interval> -- !query 19 output -interval 15 weeks 4 days 20 hours 30 minutes 40 seconds 246 milliseconds 912 microseconds interval 12 weeks 5 days 2 hours 14 minutes 26 seconds +interval 109 days 20 hours 30 minutes 40.246912 seconds interval 89 days 2 hours 14 minutes 26 seconds -- !query 20 @@ -274,17 +274,17 @@ select '99 11:22:33.123456789' day to second - '10 9:8:7.123456789' day to second from interval_arithmetic -- !query 20 schema -struct<(interval 14 weeks 1 days 11 hours 22 minutes 33 seconds 123 milliseconds 456 microseconds + interval 1 weeks 3 days 9 hours 8 minutes 7 seconds 123 milliseconds 456 microseconds):interval,(interval 14 weeks 1 days 11 hours 22 minutes 33 seconds 123 milliseconds 456 microseconds - interval 1 weeks 3 days 9 hours 8 minutes 7 seconds 123 milliseconds 456 microseconds):interval> +struct<(interval 99 days 11 hours 22 minutes 33.123456 seconds + interval 10 days 9 hours 8 minutes 7.123456 seconds):interval,(interval 99 days 11 hours 22 minutes 33.123456 seconds - interval 10 days 9 hours 8 minutes 7.123456 seconds):interval> -- !query 20 output -interval 15 weeks 4 days 20 hours 30 minutes 40 seconds 246 milliseconds 912 microseconds interval 12 weeks 5 days 2 hours 14 minutes 26 seconds +interval 109 days 20 hours 30 minutes 40.246912 seconds interval 89 days 2 hours 14 minutes 26 seconds -- !query 21 select 30 day -- !query 21 schema -struct +struct -- !query 21 output -interval 4 weeks 2 days +interval 30 days -- !query 22 @@ -318,7 +318,7 @@ select 30 day day day -- !query 24 select date '2012-01-01' - 30 day -- !query 24 schema -struct +struct -- !query 24 output 2011-12-02 @@ -354,7 +354,7 @@ select date '2012-01-01' - 30 day day day -- !query 27 select date '2012-01-01' + '-30' day -- !query 27 schema -struct +struct -- !query 27 output 2011-12-02 @@ -362,7 +362,7 @@ struct +struct -- !query 28 output 2011-12-02 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 88a3d65a16e8..f85531196c20 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 @@ -136,7 +136,7 @@ select date'2020-01-01' - timestamp'2019-10-06 10:11:12.345678' -- !query 15 schema struct -- !query 15 output -interval 2078 hours 48 minutes 47 seconds 654 milliseconds 322 microseconds +interval 2078 hours 48 minutes 47.654322 seconds -- !query 16 @@ -144,4 +144,4 @@ select timestamp'2019-10-06 10:11:12.345678' - date'2020-01-01' -- !query 16 schema struct -- !query 16 output -interval -2078 hours -48 minutes -47 seconds -654 milliseconds -322 microseconds +interval -2078 hours -48 minutes -47.654322 seconds diff --git a/sql/core/src/test/resources/sql-tests/results/literals.sql.out b/sql/core/src/test/resources/sql-tests/results/literals.sql.out index b7a0dcaa1ea0..ae1528cb52ac 100644 --- a/sql/core/src/test/resources/sql-tests/results/literals.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/literals.sql.out @@ -323,33 +323,33 @@ select timestamp '2016-33-11 20:54:00.000' -- !query 34 select interval 13.123456789 seconds, interval -13.123456789 second -- !query 34 schema -struct +struct -- !query 34 output -interval 13 seconds 123 milliseconds 456 microseconds interval -13 seconds -123 milliseconds -456 microseconds +interval 13.123456 seconds interval -13.123456 seconds -- !query 35 -select interval 1 year 2 month 3 week 4 day 5 hour 6 minute 7 seconds 8 millisecond, 9 microsecond +select interval 1 year 2 month 3 week 4 day 5 hour 6 minute 7 seconds 8 millisecond 9 microsecond -- !query 35 schema -struct +struct -- !query 35 output -interval 1 years 2 months 3 weeks 4 days 5 hours 6 minutes 7 seconds 8 milliseconds 9 +interval 1 years 2 months 25 days 5 hours 6 minutes 7.008009 seconds -- !query 36 select interval '30' year '25' month '-100' day '40' hour '80' minute '299.889987299' second -- !query 36 schema -struct +struct -- !query 36 output -interval 32 years 1 months -14 weeks -2 days 41 hours 24 minutes 59 seconds 889 milliseconds 987 microseconds +interval 32 years 1 months -100 days 41 hours 24 minutes 59.889987 seconds -- !query 37 select interval '0 0:0:0.1' day to second -- !query 37 schema -struct +struct -- !query 37 output -interval 100 milliseconds +interval 0.1 seconds -- !query 38 @@ -363,25 +363,25 @@ interval 10 years 9 months -- !query 39 select interval '20 15:40:32.99899999' day to hour -- !query 39 schema -struct +struct -- !query 39 output -interval 2 weeks 6 days 15 hours +interval 20 days 15 hours -- !query 40 select interval '20 15:40:32.99899999' day to minute -- !query 40 schema -struct +struct -- !query 40 output -interval 2 weeks 6 days 15 hours 40 minutes +interval 20 days 15 hours 40 minutes -- !query 41 select interval '20 15:40:32.99899999' day to second -- !query 41 schema -struct +struct -- !query 41 output -interval 2 weeks 6 days 15 hours 40 minutes 32 seconds 998 milliseconds 999 microseconds +interval 20 days 15 hours 40 minutes 32.998999 seconds -- !query 42 @@ -395,9 +395,9 @@ interval 15 hours 40 minutes -- !query 43 select interval '15:40.99899999' hour to second -- !query 43 schema -struct +struct -- !query 43 output -interval 15 minutes 40 seconds 998 milliseconds 999 microseconds +interval 15 minutes 40.998999 seconds -- !query 44 @@ -411,25 +411,25 @@ interval 15 hours 40 minutes -- !query 45 select interval '15:40:32.99899999' hour to second -- !query 45 schema -struct +struct -- !query 45 output -interval 15 hours 40 minutes 32 seconds 998 milliseconds 999 microseconds +interval 15 hours 40 minutes 32.998999 seconds -- !query 46 select interval '20 40:32.99899999' minute to second -- !query 46 schema -struct +struct -- !query 46 output -interval 2 weeks 6 days 40 minutes 32 seconds 998 milliseconds 999 microseconds +interval 20 days 40 minutes 32.998999 seconds -- !query 47 select interval '40:32.99899999' minute to second -- !query 47 schema -struct +struct -- !query 47 output -interval 40 minutes 32 seconds 998 milliseconds 999 microseconds +interval 40 minutes 32.998999 seconds -- !query 48 @@ -523,9 +523,9 @@ struct<3.14:decimal(3,2),-3.14:decimal(3,2),3.14E+8:decimal(3,-6),3.14E-8:decima -- !query 56 select map(1, interval 1 day, 2, interval 3 week) -- !query 56 schema -struct> +struct> -- !query 56 output -{1:interval 1 days,2:interval 3 weeks} +{1:interval 1 days,2:interval 21 days} -- !query 57 diff --git a/sql/core/src/test/resources/sql-tests/results/postgreSQL/interval.sql.out b/sql/core/src/test/resources/sql-tests/results/postgreSQL/interval.sql.out index 31e0d65e9a51..bd4825003aa5 100644 --- a/sql/core/src/test/resources/sql-tests/results/postgreSQL/interval.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/postgreSQL/interval.sql.out @@ -29,9 +29,9 @@ interval 999 hours -- !query 3 SELECT interval '999' day -- !query 3 schema -struct +struct -- !query 3 output -interval 142 weeks 5 days +interval 999 days -- !query 4 diff --git a/sql/core/src/test/resources/sql-tests/results/udf/udf-window.sql.out b/sql/core/src/test/resources/sql-tests/results/udf/udf-window.sql.out index 9354d5e3117f..a44e67dcd807 100644 --- a/sql/core/src/test/resources/sql-tests/results/udf/udf-window.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/udf/udf-window.sql.out @@ -154,7 +154,7 @@ SELECT val_timestamp, udf(cate), avg(val_timestamp) OVER(PARTITION BY udf(cate) RANGE BETWEEN CURRENT ROW AND interval 23 days 4 hours FOLLOWING) FROM testData ORDER BY udf(cate), val_timestamp -- !query 9 schema -struct +struct -- !query 9 output NULL NULL NULL 2017-07-31 17:00:00 NULL 1.5015456E9 diff --git a/sql/core/src/test/resources/sql-tests/results/window.sql.out b/sql/core/src/test/resources/sql-tests/results/window.sql.out index 367dc4f51363..74036d078230 100644 --- a/sql/core/src/test/resources/sql-tests/results/window.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/window.sql.out @@ -154,7 +154,7 @@ SELECT val_timestamp, cate, avg(val_timestamp) OVER(PARTITION BY cate ORDER BY v RANGE BETWEEN CURRENT ROW AND interval 23 days 4 hours FOLLOWING) FROM testData ORDER BY cate, val_timestamp -- !query 9 schema -struct +struct -- !query 9 output NULL NULL NULL 2017-07-31 17:00:00 NULL 1.5015456E9