Skip to content

Commit 2ca2efe

Browse files
committed
Support precision after SECOND in PostgreSQL interval literal
1 parent 1fa8f88 commit 2ca2efe

File tree

4 files changed

+15
-2
lines changed

4 files changed

+15
-2
lines changed

src/cst/Literal.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,4 +156,5 @@ export interface IntervalUnit extends BaseNode {
156156
| "YEAR_MONTH"
157157
| "YEAR"
158158
>;
159+
precision?: ParenExpr<NumberLiteral>;
159160
}

src/parser.pegjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9078,7 +9078,10 @@ interval_unit_range
90789078
}
90799079

90809080
interval_unit
9081-
= kw:interval_unit_kw {
9081+
= &postgres kw:SECOND precision:(__ paren$number_literal)? {
9082+
return loc({ type: "interval_unit", unitKw: kw, precision: read(precision) })
9083+
}
9084+
/ kw:interval_unit_kw {
90829085
return loc({ type: "interval_unit", unitKw: kw })
90839086
}
90849087

src/showNode/expr.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export const exprMap: FullTransformMap<string, AllExprNodes> = {
7373
interval_literal: (node) =>
7474
show([node.intervalKw, node.precision, node.value, node.unit]),
7575
interval_unit_range: (node) => show([node.fromUnit, node.toKw, node.toUnit]),
76-
interval_unit: (node) => show([node.unitKw]),
76+
interval_unit: (node) => show([node.unitKw, node.precision]),
7777

7878
// Basic language elements
7979
identifier: (node) => node.text,

test/literal/interval.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,15 @@ describe("INTERVAL literal", () => {
146146
it("supports INTERVAL with precision argument", () => {
147147
testExpr(`INTERVAL (4) '8 second'`);
148148
});
149+
150+
it("supports INTERVAL with range and precision argument", () => {
151+
testExpr(`INTERVAL '8' SECOND (4)`);
152+
testExpr(`INTERVAL '8' DAY TO SECOND (2)`);
153+
});
154+
155+
it("parses INTERVAL range with precision as interval_literal", () => {
156+
expect(parseExpr(`INTERVAL '8' SECOND (4)`).type).toBe("interval_literal");
157+
});
149158
});
150159

151160
dialect("sqlite", () => {

0 commit comments

Comments
 (0)