Skip to content

Commit 3c42fe1

Browse files
committed
Use stricter date and time formatters
Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
1 parent bc2c9e2 commit 3c42fe1

3 files changed

Lines changed: 24 additions & 6 deletions

File tree

core/src/main/java/org/opensearch/sql/calcite/utils/datetime/DateTimeParser.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55

66
package org.opensearch.sql.calcite.utils.datetime;
77

8+
import static org.opensearch.sql.utils.DateTimeFormatters.DATE_TIME_FORMATTER_VARIABLE_NANOS;
9+
import static org.opensearch.sql.utils.DateTimeFormatters.STRICT_DATE_FORMATTER;
10+
import static org.opensearch.sql.utils.DateTimeFormatters.STRICT_TIME_FORMATTER;
11+
812
import com.google.common.collect.ImmutableList;
913
import java.time.LocalDate;
1014
import java.time.LocalDateTime;
@@ -13,7 +17,6 @@
1317
import java.time.format.DateTimeFormatter;
1418
import java.util.List;
1519
import org.opensearch.sql.exception.SemanticCheckException;
16-
import org.opensearch.sql.utils.DateTimeFormatters;
1720

1821
public interface DateTimeParser {
1922
/**
@@ -91,7 +94,7 @@ static LocalDateTime parseDateOrTimestamp(String input) {
9194

9295
static LocalDateTime parseTimestamp(String input) {
9396
List<DateTimeFormatter> dateTimeFormatters =
94-
ImmutableList.of(DateTimeFormatters.DATE_TIME_FORMATTER_VARIABLE_NANOS_OPTIONAL);
97+
ImmutableList.of(DATE_TIME_FORMATTER_VARIABLE_NANOS);
9598

9699
for (DateTimeFormatter fmt : dateTimeFormatters) {
97100
try {
@@ -106,7 +109,7 @@ static LocalDateTime parseTimestamp(String input) {
106109
}
107110

108111
static LocalTime parseTime(String input) {
109-
List<DateTimeFormatter> timeFormatters = ImmutableList.of(DateTimeFormatter.ISO_TIME);
112+
List<DateTimeFormatter> timeFormatters = ImmutableList.of(STRICT_TIME_FORMATTER);
110113
for (DateTimeFormatter fmt : timeFormatters) {
111114
try {
112115
return LocalTime.parse(input, fmt);
@@ -118,7 +121,7 @@ static LocalTime parseTime(String input) {
118121
}
119122

120123
static LocalDate parseDate(String input) {
121-
List<DateTimeFormatter> dateFormatters = ImmutableList.of(DateTimeFormatter.ISO_DATE);
124+
List<DateTimeFormatter> dateFormatters = ImmutableList.of(STRICT_DATE_FORMATTER);
122125
for (DateTimeFormatter fmt : dateFormatters) {
123126
try {
124127
return LocalDate.parse(input, fmt);

core/src/main/java/org/opensearch/sql/utils/DateTimeFormatters.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,20 @@ public class DateTimeFormatters {
129129
.toFormatter(Locale.ROOT)
130130
.withResolverStyle(ResolverStyle.STRICT);
131131

132+
public static final DateTimeFormatter STRICT_DATE_FORMATTER =
133+
new DateTimeFormatterBuilder()
134+
.appendPattern("[uuuu-MM-dd]")
135+
.toFormatter(Locale.ROOT)
136+
.withResolverStyle(ResolverStyle.STRICT);
137+
138+
public static final DateTimeFormatter STRICT_TIME_FORMATTER =
139+
new DateTimeFormatterBuilder()
140+
.appendPattern("[HH:mm:ss][HH:mm]")
141+
.appendFraction(
142+
ChronoField.NANO_OF_SECOND, MIN_FRACTION_SECONDS, MAX_FRACTION_SECONDS, true)
143+
.toFormatter(Locale.ROOT)
144+
.withResolverStyle(ResolverStyle.STRICT);
145+
132146
// MDD
133147
public static final DateTimeFormatter DATE_FORMATTER_SINGLE_DIGIT_MONTH =
134148
new DateTimeFormatterBuilder()

integ-test/src/test/java/org/opensearch/sql/sql/DateTimeFunctionIT.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,8 +1471,9 @@ public void testBracketFails() {
14711471
assertThrows(ResponseException.class, () -> executeQuery("select {t '2020-09-16'}"));
14721472
assertThrows(ResponseException.class, () -> executeQuery("select {date '17:30:00'}"));
14731473
assertThrows(ResponseException.class, () -> executeQuery("select {d '17:30:00'}"));
1474-
assertThrows(ResponseException.class, () -> executeQuery("select {timestamp '2020-09-16'}"));
1475-
assertThrows(ResponseException.class, () -> executeQuery("select {ts '2020-09-16'}"));
1474+
// The following test case is removed because they will be parsed to proper timestamps
1475+
// assertThrows(ResponseException.class, () -> executeQuery("select {timestamp '2020-09-16'}"));
1476+
// assertThrows(ResponseException.class, () -> executeQuery("select {ts '2020-09-16'}"));
14761477
assertThrows(ResponseException.class, () -> executeQuery("select {timestamp '17:30:00'}"));
14771478
assertThrows(ResponseException.class, () -> executeQuery("select {ts '17:30:00'}"));
14781479
}

0 commit comments

Comments
 (0)