Skip to content

Commit 3be9f92

Browse files
committed
fix: preserve interval type compatibility
Signed-off-by: 付典 <fudianchn@gmail.com>
1 parent cdcb5cf commit 3be9f92

2 files changed

Lines changed: 58 additions & 3 deletions

File tree

src/main/java/net/sf/jsqlparser/expression/IntervalExpression.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,32 @@ public void setParameter(String parameter) {
4949
this.parameter = parameter;
5050
}
5151

52+
/**
53+
* Returns the interval type for backwards compatibility. If a structured qualifier is present,
54+
* its SQL representation is returned.
55+
*/
5256
public String getIntervalType() {
53-
return intervalType;
57+
return intervalQualifier != null ? intervalQualifier.toString() : intervalType;
5458
}
5559

60+
/**
61+
* Sets the legacy interval type and clears any structured qualifier.
62+
*/
5663
public void setIntervalType(String intervalType) {
5764
this.intervalType = intervalType;
65+
this.intervalQualifier = null;
5866
}
5967

6068
public IntervalQualifier getIntervalQualifier() {
6169
return intervalQualifier;
6270
}
6371

72+
/**
73+
* Sets the structured interval qualifier and clears the legacy interval type.
74+
*/
6475
public void setIntervalQualifier(IntervalQualifier intervalQualifier) {
6576
this.intervalQualifier = intervalQualifier;
77+
this.intervalType = null;
6678
}
6779

6880
public Expression getExpression() {

src/test/java/net/sf/jsqlparser/expression/IntervalExpressionTest.java

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,60 @@ void testIntervalSecondWithLeadingAndFractionalPrecisionRoundTrip() throws JSQLP
6262
TestUtils.assertSqlCanBeParsedAndDeparsed("SELECT INTERVAL '30.12345' SECOND(2, 4)", true);
6363
}
6464

65+
@Test
66+
void testIntervalSingleFieldKeepsLegacyGetter() throws JSQLParserException {
67+
String sql = "SELECT INTERVAL '1' DAY";
68+
Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true);
69+
IntervalExpression interval = (IntervalExpression) select.getPlainSelect()
70+
.getSelectItems().get(0).getExpression();
71+
72+
assertEquals("DAY", interval.getIntervalType());
73+
assertEquals("INTERVAL '1' DAY", interval.toString());
74+
TestUtils.assertExpressionCanBeDeparsedAs(interval, "INTERVAL '1' DAY");
75+
}
76+
6577
@Test
6678
void testIntervalQualifierStructurallyAttached() throws JSQLParserException {
67-
Select select = (Select) CCJSqlParserUtil.parse("SELECT INTERVAL '1' HOUR TO MINUTE");
79+
String sql = "SELECT INTERVAL '1' HOUR TO MINUTE";
80+
Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true);
6881
IntervalExpression interval = (IntervalExpression) select.getPlainSelect()
6982
.getSelectItems().get(0).getExpression();
70-
assertNull(interval.getIntervalType(), "single-string intervalType must stay null");
83+
assertEquals("HOUR TO MINUTE", interval.getIntervalType());
7184
IntervalQualifier qualifier = interval.getIntervalQualifier();
7285
assertNotNull(qualifier, "qualifier must be a structured property of the interval");
7386
assertEquals("HOUR", qualifier.getLeadingField());
7487
assertEquals("MINUTE", qualifier.getTrailingField());
7588
assertEquals("HOUR TO MINUTE", qualifier.toString());
89+
TestUtils.assertExpressionCanBeDeparsedAs(interval, "INTERVAL '1' HOUR TO MINUTE");
90+
}
91+
92+
@Test
93+
void testLegacySetterOverridesStructuredQualifier() throws JSQLParserException {
94+
Select select = (Select) CCJSqlParserUtil.parse("SELECT INTERVAL '1' DAY");
95+
IntervalExpression interval = (IntervalExpression) select.getPlainSelect()
96+
.getSelectItems().get(0).getExpression();
97+
98+
interval.setIntervalType("HOUR");
99+
100+
assertNull(interval.getIntervalQualifier());
101+
assertEquals("HOUR", interval.getIntervalType());
102+
assertEquals("INTERVAL '1' HOUR", interval.toString());
103+
TestUtils.assertExpressionCanBeDeparsedAs(interval, "INTERVAL '1' HOUR");
104+
TestUtils.assertSqlCanBeParsedAndDeparsed("SELECT " + interval, true);
105+
}
106+
107+
@Test
108+
void testStructuredSetterOverridesLegacyType() throws JSQLParserException {
109+
IntervalExpression interval = new IntervalExpression()
110+
.withExpression(new StringValue("1"))
111+
.withIntervalType("DAY");
112+
113+
interval.withIntervalQualifier(new IntervalQualifier("HOUR", null, "MINUTE", null));
114+
115+
assertEquals("HOUR TO MINUTE", interval.getIntervalType());
116+
assertEquals("INTERVAL '1' HOUR TO MINUTE", interval.toString());
117+
TestUtils.assertExpressionCanBeDeparsedAs(interval, "INTERVAL '1' HOUR TO MINUTE");
118+
TestUtils.assertSqlCanBeParsedAndDeparsed("SELECT " + interval, true);
76119
}
77120

78121
@Test

0 commit comments

Comments
 (0)