Skip to content

Commit 85d2874

Browse files
authored
parser: support like clause in create foreign table (#666)
https://www.postgresql.org/about/news/postgresql-18-released-3142/
1 parent 2085545 commit 85d2874

File tree

12 files changed

+354
-47
lines changed

12 files changed

+354
-47
lines changed

PLAN.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,22 @@ type: string
791791
-- id of the customer that rents the CPU
792792
```
793793

794+
#### Star
795+
796+
```sql
797+
select * from (select case
798+
-- ^$ hover
799+
when random() > 0.5 then
800+
true
801+
else
802+
false
803+
end)
804+
```
805+
806+
```
807+
("case": boolean)
808+
```
809+
794810
### Semantic Syntax Highlighting
795811

796812
https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide

crates/squawk_parser/src/generated/syntax_kind.rs

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/squawk_parser/src/grammar.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3796,7 +3796,7 @@ fn on_delete_action(p: &mut Parser<'_>) {
37963796
m.complete(p, ON_DELETE_ACTION);
37973797
}
37983798

3799-
const LIKE_OPTION: TokenSet = TokenSet::new(&[
3799+
const LIKE_OPTION_FIRST: TokenSet = TokenSet::new(&[
38003800
COMMENTS_KW,
38013801
COMPRESSION_KW,
38023802
CONSTRAINTS_KW,
@@ -3811,17 +3811,18 @@ const LIKE_OPTION: TokenSet = TokenSet::new(&[
38113811

38123812
// where like_option is:
38133813
// { INCLUDING | EXCLUDING } { COMMENTS | COMPRESSION | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }
3814-
fn like_option(p: &mut Parser<'_>) -> bool {
3814+
fn opt_like_option(p: &mut Parser<'_>) -> Option<CompletedMarker> {
38153815
if p.at(INCLUDING_KW) || p.at(EXCLUDING_KW) {
3816+
let m = p.start();
38163817
p.bump_any();
3817-
if p.at_ts(LIKE_OPTION) {
3818+
if p.at_ts(LIKE_OPTION_FIRST) {
38183819
p.bump_any();
38193820
} else {
3820-
p.error("expected like option");
3821+
p.err_and_bump(&format!("expected like option, got {:?}", p.current()));
38213822
}
3822-
true
3823+
Some(m.complete(p, LIKE_OPTION))
38233824
} else {
3824-
false
3825+
None
38253826
}
38263827
}
38273828

@@ -4235,7 +4236,7 @@ fn like_clause(p: &mut Parser<'_>) -> CompletedMarker {
42354236
p.bump(LIKE_KW);
42364237
path_name_ref(p);
42374238
while !p.at(EOF) {
4238-
if !like_option(p) {
4239+
if opt_like_option(p).is_none() {
42394240
break;
42404241
}
42414242
}
@@ -8522,6 +8523,8 @@ fn create_foreign_table(p: &mut Parser<'_>) -> CompletedMarker {
85228523
while !p.at(EOF) && !p.at(R_PAREN) {
85238524
if p.at_ts(TABLE_CONSTRAINT_FIRST) {
85248525
table_constraint(p);
8526+
} else if p.at(LIKE_KW) {
8527+
like_clause(p);
85258528
} else {
85268529
name(p);
85278530
type_name(p);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-- like clause is >=pg18
2+
create foreign table u (
3+
like t
4+
) server s;
5+
6+
-- like clause is >=pg18
7+
create foreign table remote_users (
8+
like local_users
9+
including defaults
10+
including constraints
11+
excluding generated
12+
excluding statistics
13+
excluding all
14+
) server remote_server;
15+

crates/squawk_parser/tests/data/ok/create_table_pg17.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ create table t (
2323
unique (a without overlaps)
2424
);
2525

26+
27+
-- primary key without overlaps
28+
create table t (
29+
a text,
30+
b text,
31+
c text,
32+
constraint pk
33+
primary key (a, b, c without overlaps)
34+
);
35+
2636
-- temporal_primary_key
2737
CREATE TABLE addresses (
2838
id int8 generated BY DEFAULT AS IDENTITY,
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
---
2+
source: crates/squawk_parser/tests/tests.rs
3+
input_file: crates/squawk_parser/tests/data/ok/create_foreign_table_pg18.sql
4+
---
5+
SOURCE_FILE
6+
COMMENT "-- like clause is >=pg18"
7+
WHITESPACE "\n"
8+
CREATE_FOREIGN_TABLE
9+
CREATE_KW "create"
10+
WHITESPACE " "
11+
FOREIGN_KW "foreign"
12+
WHITESPACE " "
13+
TABLE_KW "table"
14+
WHITESPACE " "
15+
PATH
16+
PATH_SEGMENT
17+
NAME
18+
IDENT "u"
19+
WHITESPACE " "
20+
L_PAREN "("
21+
WHITESPACE "\n "
22+
LIKE_CLAUSE
23+
LIKE_KW "like"
24+
WHITESPACE " "
25+
PATH
26+
PATH_SEGMENT
27+
NAME_REF
28+
IDENT "t"
29+
WHITESPACE "\n"
30+
R_PAREN ")"
31+
WHITESPACE " "
32+
SERVER_KW "server"
33+
WHITESPACE " "
34+
NAME_REF
35+
IDENT "s"
36+
SEMICOLON ";"
37+
WHITESPACE "\n\n"
38+
COMMENT "-- like clause is >=pg18"
39+
WHITESPACE "\n"
40+
CREATE_FOREIGN_TABLE
41+
CREATE_KW "create"
42+
WHITESPACE " "
43+
FOREIGN_KW "foreign"
44+
WHITESPACE " "
45+
TABLE_KW "table"
46+
WHITESPACE " "
47+
PATH
48+
PATH_SEGMENT
49+
NAME
50+
IDENT "remote_users"
51+
WHITESPACE " "
52+
L_PAREN "("
53+
WHITESPACE "\n "
54+
LIKE_CLAUSE
55+
LIKE_KW "like"
56+
WHITESPACE " "
57+
PATH
58+
PATH_SEGMENT
59+
NAME_REF
60+
IDENT "local_users"
61+
WHITESPACE "\n "
62+
LIKE_OPTION
63+
INCLUDING_KW "including"
64+
WHITESPACE " "
65+
DEFAULTS_KW "defaults"
66+
WHITESPACE "\n "
67+
LIKE_OPTION
68+
INCLUDING_KW "including"
69+
WHITESPACE " "
70+
CONSTRAINTS_KW "constraints"
71+
WHITESPACE "\n "
72+
LIKE_OPTION
73+
EXCLUDING_KW "excluding"
74+
WHITESPACE " "
75+
GENERATED_KW "generated"
76+
WHITESPACE "\n "
77+
LIKE_OPTION
78+
EXCLUDING_KW "excluding"
79+
WHITESPACE " "
80+
STATISTICS_KW "statistics"
81+
WHITESPACE "\n "
82+
LIKE_OPTION
83+
EXCLUDING_KW "excluding"
84+
WHITESPACE " "
85+
ALL_KW "all"
86+
WHITESPACE "\n"
87+
R_PAREN ")"
88+
WHITESPACE " "
89+
SERVER_KW "server"
90+
WHITESPACE " "
91+
NAME_REF
92+
IDENT "remote_server"
93+
SEMICOLON ";"
94+
WHITESPACE "\n\n"

crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,10 @@ SOURCE_FILE
175175
NAME_REF
176176
IDENT "b"
177177
WHITESPACE " "
178-
INCLUDING_KW "including"
179-
WHITESPACE " "
180-
COMMENTS_KW "comments"
178+
LIKE_OPTION
179+
INCLUDING_KW "including"
180+
WHITESPACE " "
181+
COMMENTS_KW "comments"
181182
WHITESPACE "\n"
182183
R_PAREN ")"
183184
SEMICOLON ";"
@@ -221,41 +222,50 @@ SOURCE_FILE
221222
NAME_REF
222223
IDENT "b"
223224
WHITESPACE " "
224-
INCLUDING_KW "including"
225-
WHITESPACE " "
226-
COMMENTS_KW "comments"
227-
WHITESPACE " "
228-
INCLUDING_KW "including"
229-
WHITESPACE " "
230-
CONSTRAINTS_KW "constraints"
231-
WHITESPACE " "
232-
EXCLUDING_KW "excluding"
233-
WHITESPACE " "
234-
DEFAULTS_KW "defaults"
235-
WHITESPACE " "
236-
EXCLUDING_KW "excluding"
237-
WHITESPACE " "
238-
GENERATED_KW "generated"
239-
WHITESPACE " "
240-
EXCLUDING_KW "excluding"
241-
WHITESPACE " "
242-
IDENTITY_KW "identity"
225+
LIKE_OPTION
226+
INCLUDING_KW "including"
227+
WHITESPACE " "
228+
COMMENTS_KW "comments"
243229
WHITESPACE " "
244-
EXCLUDING_KW "excluding"
230+
LIKE_OPTION
231+
INCLUDING_KW "including"
232+
WHITESPACE " "
233+
CONSTRAINTS_KW "constraints"
245234
WHITESPACE " "
246-
INDEXES_KW "indexes"
235+
LIKE_OPTION
236+
EXCLUDING_KW "excluding"
237+
WHITESPACE " "
238+
DEFAULTS_KW "defaults"
247239
WHITESPACE " "
248-
EXCLUDING_KW "excluding"
240+
LIKE_OPTION
241+
EXCLUDING_KW "excluding"
242+
WHITESPACE " "
243+
GENERATED_KW "generated"
249244
WHITESPACE " "
250-
STATISTICS_KW "statistics"
245+
LIKE_OPTION
246+
EXCLUDING_KW "excluding"
247+
WHITESPACE " "
248+
IDENTITY_KW "identity"
251249
WHITESPACE " "
252-
INCLUDING_KW "including"
250+
LIKE_OPTION
251+
EXCLUDING_KW "excluding"
252+
WHITESPACE " "
253+
INDEXES_KW "indexes"
253254
WHITESPACE " "
254-
STORAGE_KW "storage"
255+
LIKE_OPTION
256+
EXCLUDING_KW "excluding"
257+
WHITESPACE " "
258+
STATISTICS_KW "statistics"
255259
WHITESPACE " "
256-
EXCLUDING_KW "excluding"
260+
LIKE_OPTION
261+
INCLUDING_KW "including"
262+
WHITESPACE " "
263+
STORAGE_KW "storage"
257264
WHITESPACE " "
258-
ALL_KW "all"
265+
LIKE_OPTION
266+
EXCLUDING_KW "excluding"
267+
WHITESPACE " "
268+
ALL_KW "all"
259269
WHITESPACE "\n"
260270
R_PAREN ")"
261271
SEMICOLON ";"

crates/squawk_parser/tests/snapshots/tests__create_table_pg17_ok.snap

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,88 @@ SOURCE_FILE
286286
WHITESPACE "\n"
287287
R_PAREN ")"
288288
SEMICOLON ";"
289+
WHITESPACE "\n\n\n"
290+
CREATE_TABLE
291+
COMMENT "-- primary key without overlaps"
292+
WHITESPACE "\n"
293+
CREATE_KW "create"
294+
WHITESPACE " "
295+
TABLE_KW "table"
296+
WHITESPACE " "
297+
PATH
298+
PATH_SEGMENT
299+
NAME
300+
IDENT "t"
301+
WHITESPACE " "
302+
TABLE_ARG_LIST
303+
L_PAREN "("
304+
WHITESPACE "\n "
305+
COLUMN
306+
NAME
307+
IDENT "a"
308+
WHITESPACE " "
309+
PATH_TYPE
310+
PATH
311+
PATH_SEGMENT
312+
NAME_REF
313+
TEXT_KW "text"
314+
COMMA ","
315+
WHITESPACE "\n "
316+
COLUMN
317+
NAME
318+
IDENT "b"
319+
WHITESPACE " "
320+
PATH_TYPE
321+
PATH
322+
PATH_SEGMENT
323+
NAME_REF
324+
TEXT_KW "text"
325+
COMMA ","
326+
WHITESPACE "\n "
327+
COLUMN
328+
NAME
329+
IDENT "c"
330+
WHITESPACE " "
331+
PATH_TYPE
332+
PATH
333+
PATH_SEGMENT
334+
NAME_REF
335+
TEXT_KW "text"
336+
COMMA ","
337+
WHITESPACE "\n "
338+
PRIMARY_KEY_CONSTRAINT
339+
CONSTRAINT_KW "constraint"
340+
WHITESPACE " "
341+
NAME
342+
IDENT "pk"
343+
WHITESPACE " \n "
344+
PRIMARY_KW "primary"
345+
WHITESPACE " "
346+
KEY_KW "key"
347+
WHITESPACE " "
348+
COLUMN_LIST
349+
L_PAREN "("
350+
COLUMN
351+
NAME_REF
352+
IDENT "a"
353+
COMMA ","
354+
WHITESPACE " "
355+
COLUMN
356+
NAME_REF
357+
IDENT "b"
358+
COMMA ","
359+
WHITESPACE " "
360+
COLUMN
361+
NAME_REF
362+
IDENT "c"
363+
WHITESPACE " "
364+
WITHOUT_KW "without"
365+
WHITESPACE " "
366+
OVERLAPS_KW "overlaps"
367+
R_PAREN ")"
368+
WHITESPACE "\n"
369+
R_PAREN ")"
370+
SEMICOLON ";"
289371
WHITESPACE "\n\n"
290372
CREATE_TABLE
291373
COMMENT "-- temporal_primary_key"

0 commit comments

Comments
 (0)