Skip to content

Commit 7b1cf65

Browse files
committed
fixup! Add GRACE PERIOD to SHOW CREATE MATERIALIZED VIEW
1 parent aec8b27 commit 7b1cf65

File tree

3 files changed

+49
-101
lines changed

3 files changed

+49
-101
lines changed

core/trino-main/src/main/java/io/trino/util/DateTimeUtils.java

Lines changed: 5 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@
5050
import static io.trino.spi.StandardErrorCode.INVALID_LITERAL;
5151
import static io.trino.sql.tree.IntervalLiteral.IntervalField;
5252
import static io.trino.sql.tree.IntervalLiteral.IntervalField.DAY;
53-
import static io.trino.sql.tree.IntervalLiteral.IntervalField.HOUR;
54-
import static io.trino.sql.tree.IntervalLiteral.IntervalField.MINUTE;
5553
import static io.trino.sql.tree.IntervalLiteral.IntervalField.SECOND;
5654
import static io.trino.sql.tree.IntervalLiteral.Sign.NEGATIVE;
5755
import static io.trino.sql.tree.IntervalLiteral.Sign.POSITIVE;
@@ -269,62 +267,12 @@ public static IntervalLiteral formatDayTimeInterval(Duration duration)
269267
Period period = new Period(Math.abs(millis)).normalizedStandard(PeriodType.dayTime());
270268

271269
IntervalLiteral.Sign sign = millis < 0 ? NEGATIVE : POSITIVE;
272-
IntervalLiteral.IntervalField startField;
273-
Optional<IntervalLiteral.IntervalField> endField;
274-
String value;
275-
276-
if (period.getDays() > 0) {
277-
startField = DAY;
278-
if (period.getSeconds() > 0 || period.getMillis() > 0) {
279-
endField = Optional.of(SECOND);
280-
value = INTERVAL_DAY_SECOND_FORMATTER.print(period);
281-
}
282-
else if (period.getMinutes() > 0) {
283-
endField = Optional.of(MINUTE);
284-
value = INTERVAL_DAY_MINUTE_FORMATTER.print(period);
285-
}
286-
else if (period.getHours() > 0) {
287-
endField = Optional.of(HOUR);
288-
value = INTERVAL_DAY_HOUR_FORMATTER.print(period);
289-
}
290-
else {
291-
endField = Optional.empty();
292-
value = INTERVAL_DAY_FORMATTER.print(period);
293-
}
294-
}
295-
else if (period.getHours() > 0) {
296-
startField = HOUR;
297-
if (period.getSeconds() > 0 || period.getMillis() > 0) {
298-
endField = Optional.of(SECOND);
299-
value = INTERVAL_HOUR_SECOND_FORMATTER.print(period);
300-
}
301-
else if (period.getMinutes() > 0) {
302-
endField = Optional.of(MINUTE);
303-
value = INTERVAL_HOUR_MINUTE_FORMATTER.print(period);
304-
}
305-
else {
306-
endField = Optional.empty();
307-
value = INTERVAL_HOUR_FORMATTER.print(period);
308-
}
309-
}
310-
else if (period.getMinutes() > 0) {
311-
startField = MINUTE;
312-
if (period.getSeconds() > 0 || period.getMillis() > 0) {
313-
endField = Optional.of(SECOND);
314-
value = INTERVAL_MINUTE_SECOND_FORMATTER.print(period);
315-
}
316-
else {
317-
endField = Optional.empty();
318-
value = INTERVAL_MINUTE_FORMATTER.print(period);
319-
}
320-
}
321-
else {
322-
startField = SECOND;
323-
endField = Optional.empty();
324-
value = INTERVAL_SECOND_FORMATTER.print(period);
325-
}
270+
// Always use INTERVAL DAY TO SECOND. The output is more verbose
271+
// (e.g., "1 0:00:00" instead of "1"), but this avoids the need to
272+
// determine the minimal field range and choose a specialized formatter.
273+
String value = INTERVAL_DAY_SECOND_FORMATTER.print(period);
326274

327-
return new IntervalLiteral(value, sign, startField, endField);
275+
return new IntervalLiteral(value, sign, DAY, Optional.of(SECOND));
328276
}
329277

330278
private static long parsePeriodMillis(PeriodFormatter periodFormatter, String value)

core/trino-main/src/test/java/io/trino/type/TestIntervalDayTime.java

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -534,51 +534,51 @@ public void testIndeterminate()
534534
@Test
535535
void testIntervalDayTimeRoundTrip()
536536
{
537-
testIntervalDayTimeRoundTrip("INTERVAL '0' SECOND", "INTERVAL '0' SECOND");
538-
testIntervalDayTimeRoundTrip("INTERVAL -'0' SECOND", "INTERVAL '0' SECOND");
539-
testIntervalDayTimeRoundTrip("INTERVAL '0.000' SECOND", "INTERVAL '0' SECOND");
540-
testIntervalDayTimeRoundTrip("INTERVAL '0.4' SECOND", "INTERVAL '0.400' SECOND");
541-
testIntervalDayTimeRoundTrip("INTERVAL '0.04' SECOND", "INTERVAL '0.040' SECOND");
542-
testIntervalDayTimeRoundTrip("INTERVAL '0.040' SECOND", "INTERVAL '0.040' SECOND");
543-
testIntervalDayTimeRoundTrip("INTERVAL '45' SECOND", "INTERVAL '45' SECOND");
544-
testIntervalDayTimeRoundTrip("INTERVAL -'45' SECOND", "INTERVAL -'45' SECOND");
545-
testIntervalDayTimeRoundTrip("INTERVAL '0.555' SECOND", "INTERVAL '0.555' SECOND");
546-
testIntervalDayTimeRoundTrip("INTERVAL '59.999' SECOND", "INTERVAL '59.999' SECOND");
547-
testIntervalDayTimeRoundTrip("INTERVAL '60' SECOND", "INTERVAL '1' MINUTE");
548-
testIntervalDayTimeRoundTrip("INTERVAL '61' SECOND", "INTERVAL '1:01' MINUTE TO SECOND");
549-
testIntervalDayTimeRoundTrip("INTERVAL '3661' SECOND", "INTERVAL '1:01:01' HOUR TO SECOND");
537+
testIntervalDayTimeRoundTrip("INTERVAL '0' SECOND", "INTERVAL '0 0:00:00' DAY TO SECOND");
538+
testIntervalDayTimeRoundTrip("INTERVAL -'0' SECOND", "INTERVAL '0 0:00:00' DAY TO SECOND");
539+
testIntervalDayTimeRoundTrip("INTERVAL '0.000' SECOND", "INTERVAL '0 0:00:00' DAY TO SECOND");
540+
testIntervalDayTimeRoundTrip("INTERVAL '0.4' SECOND", "INTERVAL '0 0:00:00.400' DAY TO SECOND");
541+
testIntervalDayTimeRoundTrip("INTERVAL '0.04' SECOND", "INTERVAL '0 0:00:00.040' DAY TO SECOND");
542+
testIntervalDayTimeRoundTrip("INTERVAL '0.040' SECOND", "INTERVAL '0 0:00:00.040' DAY TO SECOND");
543+
testIntervalDayTimeRoundTrip("INTERVAL '45' SECOND", "INTERVAL '0 0:00:45' DAY TO SECOND");
544+
testIntervalDayTimeRoundTrip("INTERVAL -'45' SECOND", "INTERVAL -'0 0:00:45' DAY TO SECOND");
545+
testIntervalDayTimeRoundTrip("INTERVAL '0.555' SECOND", "INTERVAL '0 0:00:00.555' DAY TO SECOND");
546+
testIntervalDayTimeRoundTrip("INTERVAL '59.999' SECOND", "INTERVAL '0 0:00:59.999' DAY TO SECOND");
547+
testIntervalDayTimeRoundTrip("INTERVAL '60' SECOND", "INTERVAL '0 0:01:00' DAY TO SECOND");
548+
testIntervalDayTimeRoundTrip("INTERVAL '61' SECOND", "INTERVAL '0 0:01:01' DAY TO SECOND");
549+
testIntervalDayTimeRoundTrip("INTERVAL '3661' SECOND", "INTERVAL '0 1:01:01' DAY TO SECOND");
550550
testIntervalDayTimeRoundTrip("INTERVAL '90061' SECOND", "INTERVAL '1 1:01:01' DAY TO SECOND");
551551

552-
testIntervalDayTimeRoundTrip("INTERVAL '0' MINUTE", "INTERVAL '0' SECOND");
553-
testIntervalDayTimeRoundTrip("INTERVAL -'0' MINUTE", "INTERVAL '0' SECOND");
554-
testIntervalDayTimeRoundTrip("INTERVAL '25' MINUTE", "INTERVAL '25' MINUTE");
555-
testIntervalDayTimeRoundTrip("INTERVAL -'25' MINUTE", "INTERVAL -'25' MINUTE");
556-
testIntervalDayTimeRoundTrip("INTERVAL '15:30' MINUTE TO SECOND", "INTERVAL '15:30' MINUTE TO SECOND");
557-
testIntervalDayTimeRoundTrip("INTERVAL '59:00.999' MINUTE TO SECOND", "INTERVAL '59:00.999' MINUTE TO SECOND");
558-
testIntervalDayTimeRoundTrip("INTERVAL '60' MINUTE", "INTERVAL '1' HOUR");
559-
testIntervalDayTimeRoundTrip("INTERVAL '61' MINUTE", "INTERVAL '1:01' HOUR TO MINUTE");
560-
testIntervalDayTimeRoundTrip("INTERVAL '1500' MINUTE", "INTERVAL '1 1' DAY TO HOUR");
561-
testIntervalDayTimeRoundTrip("INTERVAL '1501' MINUTE", "INTERVAL '1 1:01' DAY TO MINUTE");
562-
563-
testIntervalDayTimeRoundTrip("INTERVAL '0' HOUR", "INTERVAL '0' SECOND");
564-
testIntervalDayTimeRoundTrip("INTERVAL -'0' HOUR", "INTERVAL '0' SECOND");
565-
testIntervalDayTimeRoundTrip("INTERVAL '8' HOUR", "INTERVAL '8' HOUR");
566-
testIntervalDayTimeRoundTrip("INTERVAL -'8' HOUR", "INTERVAL -'8' HOUR");
567-
testIntervalDayTimeRoundTrip("INTERVAL '2:45' HOUR TO MINUTE", "INTERVAL '2:45' HOUR TO MINUTE");
568-
testIntervalDayTimeRoundTrip("INTERVAL '2:00:45' HOUR TO SECOND", "INTERVAL '2:00:45' HOUR TO SECOND");
569-
testIntervalDayTimeRoundTrip("INTERVAL '1:30:45' HOUR TO SECOND", "INTERVAL '1:30:45' HOUR TO SECOND");
570-
testIntervalDayTimeRoundTrip("INTERVAL '1:00:00.999' HOUR TO SECOND", "INTERVAL '1:00:00.999' HOUR TO SECOND");
571-
testIntervalDayTimeRoundTrip("INTERVAL '24' HOUR", "INTERVAL '1' DAY");
572-
testIntervalDayTimeRoundTrip("INTERVAL '25' HOUR", "INTERVAL '1 1' DAY TO HOUR");
573-
testIntervalDayTimeRoundTrip("INTERVAL '17520' HOUR", "INTERVAL '730' DAY");
574-
575-
testIntervalDayTimeRoundTrip("INTERVAL '0' DAY", "INTERVAL '0' SECOND");
576-
testIntervalDayTimeRoundTrip("INTERVAL -'0' DAY", "INTERVAL '0' SECOND");
577-
testIntervalDayTimeRoundTrip("INTERVAL '340' DAY", "INTERVAL '340' DAY");
578-
testIntervalDayTimeRoundTrip("INTERVAL -'340' DAY", "INTERVAL -'340' DAY");
579-
testIntervalDayTimeRoundTrip("INTERVAL '2 6' DAY TO HOUR", "INTERVAL '2 6' DAY TO HOUR");
580-
testIntervalDayTimeRoundTrip("INTERVAL '3 0:30' DAY TO MINUTE", "INTERVAL '3 0:30' DAY TO MINUTE");
581-
testIntervalDayTimeRoundTrip("INTERVAL '3 12:30' DAY TO MINUTE", "INTERVAL '3 12:30' DAY TO MINUTE");
552+
testIntervalDayTimeRoundTrip("INTERVAL '0' MINUTE", "INTERVAL '0 0:00:00' DAY TO SECOND");
553+
testIntervalDayTimeRoundTrip("INTERVAL -'0' MINUTE", "INTERVAL '0 0:00:00' DAY TO SECOND");
554+
testIntervalDayTimeRoundTrip("INTERVAL '25' MINUTE", "INTERVAL '0 0:25:00' DAY TO SECOND");
555+
testIntervalDayTimeRoundTrip("INTERVAL -'25' MINUTE", "INTERVAL -'0 0:25:00' DAY TO SECOND");
556+
testIntervalDayTimeRoundTrip("INTERVAL '15:30' MINUTE TO SECOND", "INTERVAL '0 0:15:30' DAY TO SECOND");
557+
testIntervalDayTimeRoundTrip("INTERVAL '59:00.999' MINUTE TO SECOND", "INTERVAL '0 0:59:00.999' DAY TO SECOND");
558+
testIntervalDayTimeRoundTrip("INTERVAL '60' MINUTE", "INTERVAL '0 1:00:00' DAY TO SECOND");
559+
testIntervalDayTimeRoundTrip("INTERVAL '61' MINUTE", "INTERVAL '0 1:01:00' DAY TO SECOND");
560+
testIntervalDayTimeRoundTrip("INTERVAL '1500' MINUTE", "INTERVAL '1 1:00:00' DAY TO SECOND");
561+
testIntervalDayTimeRoundTrip("INTERVAL '1501' MINUTE", "INTERVAL '1 1:01:00' DAY TO SECOND");
562+
563+
testIntervalDayTimeRoundTrip("INTERVAL '0' HOUR", "INTERVAL '0 0:00:00' DAY TO SECOND");
564+
testIntervalDayTimeRoundTrip("INTERVAL -'0' HOUR", "INTERVAL '0 0:00:00' DAY TO SECOND");
565+
testIntervalDayTimeRoundTrip("INTERVAL '8' HOUR", "INTERVAL '0 8:00:00' DAY TO SECOND");
566+
testIntervalDayTimeRoundTrip("INTERVAL -'8' HOUR", "INTERVAL -'0 8:00:00' DAY TO SECOND");
567+
testIntervalDayTimeRoundTrip("INTERVAL '2:45' HOUR TO MINUTE", "INTERVAL '0 2:45:00' DAY TO SECOND");
568+
testIntervalDayTimeRoundTrip("INTERVAL '2:00:45' HOUR TO SECOND", "INTERVAL '0 2:00:45' DAY TO SECOND");
569+
testIntervalDayTimeRoundTrip("INTERVAL '1:30:45' HOUR TO SECOND", "INTERVAL '0 1:30:45' DAY TO SECOND");
570+
testIntervalDayTimeRoundTrip("INTERVAL '1:00:00.999' HOUR TO SECOND", "INTERVAL '0 1:00:00.999' DAY TO SECOND");
571+
testIntervalDayTimeRoundTrip("INTERVAL '24' HOUR", "INTERVAL '1 0:00:00' DAY TO SECOND");
572+
testIntervalDayTimeRoundTrip("INTERVAL '25' HOUR", "INTERVAL '1 1:00:00' DAY TO SECOND");
573+
testIntervalDayTimeRoundTrip("INTERVAL '17520' HOUR", "INTERVAL '730 0:00:00' DAY TO SECOND");
574+
575+
testIntervalDayTimeRoundTrip("INTERVAL '0' DAY", "INTERVAL '0 0:00:00' DAY TO SECOND");
576+
testIntervalDayTimeRoundTrip("INTERVAL -'0' DAY", "INTERVAL '0 0:00:00' DAY TO SECOND");
577+
testIntervalDayTimeRoundTrip("INTERVAL '340' DAY", "INTERVAL '340 0:00:00' DAY TO SECOND");
578+
testIntervalDayTimeRoundTrip("INTERVAL -'340' DAY", "INTERVAL -'340 0:00:00' DAY TO SECOND");
579+
testIntervalDayTimeRoundTrip("INTERVAL '2 6' DAY TO HOUR", "INTERVAL '2 6:00:00' DAY TO SECOND");
580+
testIntervalDayTimeRoundTrip("INTERVAL '3 0:30' DAY TO MINUTE", "INTERVAL '3 0:30:00' DAY TO SECOND");
581+
testIntervalDayTimeRoundTrip("INTERVAL '3 12:30' DAY TO MINUTE", "INTERVAL '3 12:30:00' DAY TO SECOND");
582582
testIntervalDayTimeRoundTrip("INTERVAL '1 0:00:15' DAY TO SECOND", "INTERVAL '1 0:00:15' DAY TO SECOND");
583583
testIntervalDayTimeRoundTrip("INTERVAL '1 4:20:15' DAY TO SECOND", "INTERVAL '1 4:20:15' DAY TO SECOND");
584584
testIntervalDayTimeRoundTrip("INTERVAL '1 0:00:00.999' DAY TO SECOND", "INTERVAL '1 0:00:00.999' DAY TO SECOND");

testing/trino-testing/src/main/java/io/trino/testing/BaseConnectorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1533,7 +1533,7 @@ public void testMaterializedViewGracePeriod()
15331533
"GRACE PERIOD INTERVAL '1' HOUR " +
15341534
"AS SELECT DISTINCT regionkey, format('%s', name) name FROM " + table.getName());
15351535
assertThat((String) computeScalar("SHOW CREATE MATERIALIZED VIEW " + viewName))
1536-
.matches("(?sm).*^GRACE PERIOD INTERVAL '1' HOUR$.*");
1536+
.matches("(?sm).*^GRACE PERIOD INTERVAL '0 1:00:00' DAY TO SECOND$.*");
15371537

15381538
String initialResults = "SELECT DISTINCT regionkey, CAST(name AS varchar) FROM region";
15391539

0 commit comments

Comments
 (0)