[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:
parent
937a74e6e7
commit
0fdca1f0df
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue