[SPARK-36851][SQL] Incorrect parsing of negative ANSI typed interval literals

### What changes were proposed in this pull request?
Handle incorrect parsing of negative ANSI typed interval literals
[SPARK-36851](https://issues.apache.org/jira/browse/SPARK-36851)

### Why are the changes needed?
Incorrect result:
```
spark-sql> select interval -'1' year;
1-0
```

### Does this PR introduce _any_ user-facing change?
No

### How was this patch tested?
Add ut testcase

Closes #34107 from Peng-Lei/SPARK-36851.

Authored-by: PengLei <peng.8lei@gmail.com>
Signed-off-by: Gengliang Wang <gengliang@apache.org>
This commit is contained in:
PengLei 2021-09-26 18:43:26 +08:00 committed by Gengliang Wang
parent 937a74e6e7
commit 0fdca1f0df
4 changed files with 214 additions and 3 deletions

View file

@ -2527,7 +2527,14 @@ class AstBuilder extends SqlBaseBaseVisitor[AnyRef] with SQLConfHelper with Logg
if (value.exists(Character.isLetter)) {
throw QueryParsingErrors.invalidIntervalFormError(value, ctx)
}
if (values(i).MINUS() == null) {
value
} else {
value.startsWith("-") match {
case true => value.replaceFirst("-", "")
case false => s"-$value"
}
}
} else {
values(i).getText
}

View file

@ -65,6 +65,18 @@ select interval +'-1-1' year to month;
select interval - '1 2:3:4.001' day to second;
select interval +'1 2:3:4.001' day to second;
select interval -'-1 2:3:4.001' day to second;
select interval -'1' year;
select interval -'-1' year;
select interval -'11' month;
select interval -'-11' month;
select interval -'1' day;
select interval -'-1' day;
select interval -'23' hour;
select interval -'-23' hour;
select interval -'59' minute;
select interval -'-59' minute;
select interval -'59' second;
select interval -'-59' second;
-- make intervals
select make_interval(1);

View file

@ -1,5 +1,5 @@
-- Automatically generated by SQLQueryTestSuite
-- Number of queries: 257
-- Number of queries: 269
-- !query
@ -474,6 +474,102 @@ struct<INTERVAL '1 02:03:04.001' DAY TO SECOND:interval day to second>
1 02:03:04.001000000
-- !query
select interval -'1' year
-- !query schema
struct<INTERVAL '-1' YEAR:interval year>
-- !query output
-1-0
-- !query
select interval -'-1' year
-- !query schema
struct<INTERVAL '1' YEAR:interval year>
-- !query output
1-0
-- !query
select interval -'11' month
-- !query schema
struct<INTERVAL '-11' MONTH:interval month>
-- !query output
-0-11
-- !query
select interval -'-11' month
-- !query schema
struct<INTERVAL '11' MONTH:interval month>
-- !query output
0-11
-- !query
select interval -'1' day
-- !query schema
struct<INTERVAL '-1' DAY:interval day>
-- !query output
-1 00:00:00.000000000
-- !query
select interval -'-1' day
-- !query schema
struct<INTERVAL '1' DAY:interval day>
-- !query output
1 00:00:00.000000000
-- !query
select interval -'23' hour
-- !query schema
struct<INTERVAL '-23' HOUR:interval hour>
-- !query output
-0 23:00:00.000000000
-- !query
select interval -'-23' hour
-- !query schema
struct<INTERVAL '23' HOUR:interval hour>
-- !query output
0 23:00:00.000000000
-- !query
select interval -'59' minute
-- !query schema
struct<INTERVAL '-59' MINUTE:interval minute>
-- !query output
-0 00:59:00.000000000
-- !query
select interval -'-59' minute
-- !query schema
struct<INTERVAL '59' MINUTE:interval minute>
-- !query output
0 00:59:00.000000000
-- !query
select interval -'59' second
-- !query schema
struct<INTERVAL '-59' SECOND:interval second>
-- !query output
-0 00:00:59.000000000
-- !query
select interval -'-59' second
-- !query schema
struct<INTERVAL '59' SECOND:interval second>
-- !query output
0 00:00:59.000000000
-- !query
select make_interval(1)
-- !query schema

View file

@ -1,5 +1,5 @@
-- Automatically generated by SQLQueryTestSuite
-- Number of queries: 257
-- Number of queries: 269
-- !query
@ -468,6 +468,102 @@ struct<INTERVAL '1 02:03:04.001' DAY TO SECOND:interval day to second>
1 02:03:04.001000000
-- !query
select interval -'1' year
-- !query schema
struct<INTERVAL '-1' YEAR:interval year>
-- !query output
-1-0
-- !query
select interval -'-1' year
-- !query schema
struct<INTERVAL '1' YEAR:interval year>
-- !query output
1-0
-- !query
select interval -'11' month
-- !query schema
struct<INTERVAL '-11' MONTH:interval month>
-- !query output
-0-11
-- !query
select interval -'-11' month
-- !query schema
struct<INTERVAL '11' MONTH:interval month>
-- !query output
0-11
-- !query
select interval -'1' day
-- !query schema
struct<INTERVAL '-1' DAY:interval day>
-- !query output
-1 00:00:00.000000000
-- !query
select interval -'-1' day
-- !query schema
struct<INTERVAL '1' DAY:interval day>
-- !query output
1 00:00:00.000000000
-- !query
select interval -'23' hour
-- !query schema
struct<INTERVAL '-23' HOUR:interval hour>
-- !query output
-0 23:00:00.000000000
-- !query
select interval -'-23' hour
-- !query schema
struct<INTERVAL '23' HOUR:interval hour>
-- !query output
0 23:00:00.000000000
-- !query
select interval -'59' minute
-- !query schema
struct<INTERVAL '-59' MINUTE:interval minute>
-- !query output
-0 00:59:00.000000000
-- !query
select interval -'-59' minute
-- !query schema
struct<INTERVAL '59' MINUTE:interval minute>
-- !query output
0 00:59:00.000000000
-- !query
select interval -'59' second
-- !query schema
struct<INTERVAL '-59' SECOND:interval second>
-- !query output
-0 00:00:59.000000000
-- !query
select interval -'-59' second
-- !query schema
struct<INTERVAL '59' SECOND:interval second>
-- !query output
0 00:00:59.000000000
-- !query
select make_interval(1)
-- !query schema