[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)) {
|
if (value.exists(Character.isLetter)) {
|
||||||
throw QueryParsingErrors.invalidIntervalFormError(value, ctx)
|
throw QueryParsingErrors.invalidIntervalFormError(value, ctx)
|
||||||
}
|
}
|
||||||
value
|
if (values(i).MINUS() == null) {
|
||||||
|
value
|
||||||
|
} else {
|
||||||
|
value.startsWith("-") match {
|
||||||
|
case true => value.replaceFirst("-", "")
|
||||||
|
case false => s"-$value"
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
values(i).getText
|
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 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
|
-- make intervals
|
||||||
select make_interval(1);
|
select make_interval(1);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
-- Automatically generated by SQLQueryTestSuite
|
-- Automatically generated by SQLQueryTestSuite
|
||||||
-- Number of queries: 257
|
-- Number of queries: 269
|
||||||
|
|
||||||
|
|
||||||
-- !query
|
-- !query
|
||||||
|
@ -474,6 +474,102 @@ struct<INTERVAL '1 02:03:04.001' DAY TO SECOND:interval day to second>
|
||||||
1 02:03:04.001000000
|
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
|
-- !query
|
||||||
select make_interval(1)
|
select make_interval(1)
|
||||||
-- !query schema
|
-- !query schema
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
-- Automatically generated by SQLQueryTestSuite
|
-- Automatically generated by SQLQueryTestSuite
|
||||||
-- Number of queries: 257
|
-- Number of queries: 269
|
||||||
|
|
||||||
|
|
||||||
-- !query
|
-- !query
|
||||||
|
@ -468,6 +468,102 @@ struct<INTERVAL '1 02:03:04.001' DAY TO SECOND:interval day to second>
|
||||||
1 02:03:04.001000000
|
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
|
-- !query
|
||||||
select make_interval(1)
|
select make_interval(1)
|
||||||
-- !query schema
|
-- !query schema
|
||||||
|
|
Loading…
Reference in a new issue