Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -791,6 +791,22 @@ type: string
-- id of the customer that rents the CPU
```

#### Star

```sql
select * from (select case
-- ^$ hover
when random() > 0.5 then
true
else
false
end)
```

```
("case": boolean)
```

### Semantic Syntax Highlighting

https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide
Expand Down
1 change: 1 addition & 0 deletions crates/squawk_parser/src/generated/syntax_kind.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 10 additions & 7 deletions crates/squawk_parser/src/grammar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3796,7 +3796,7 @@ fn on_delete_action(p: &mut Parser<'_>) {
m.complete(p, ON_DELETE_ACTION);
}

const LIKE_OPTION: TokenSet = TokenSet::new(&[
const LIKE_OPTION_FIRST: TokenSet = TokenSet::new(&[
COMMENTS_KW,
COMPRESSION_KW,
CONSTRAINTS_KW,
Expand All @@ -3811,17 +3811,18 @@ const LIKE_OPTION: TokenSet = TokenSet::new(&[

// where like_option is:
// { INCLUDING | EXCLUDING } { COMMENTS | COMPRESSION | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }
fn like_option(p: &mut Parser<'_>) -> bool {
fn opt_like_option(p: &mut Parser<'_>) -> Option<CompletedMarker> {
if p.at(INCLUDING_KW) || p.at(EXCLUDING_KW) {
let m = p.start();
p.bump_any();
if p.at_ts(LIKE_OPTION) {
if p.at_ts(LIKE_OPTION_FIRST) {
p.bump_any();
} else {
p.error("expected like option");
p.err_and_bump(&format!("expected like option, got {:?}", p.current()));
}
true
Some(m.complete(p, LIKE_OPTION))
} else {
false
None
}
}

Expand Down Expand Up @@ -4235,7 +4236,7 @@ fn like_clause(p: &mut Parser<'_>) -> CompletedMarker {
p.bump(LIKE_KW);
path_name_ref(p);
while !p.at(EOF) {
if !like_option(p) {
if opt_like_option(p).is_none() {
break;
}
}
Expand Down Expand Up @@ -8522,6 +8523,8 @@ fn create_foreign_table(p: &mut Parser<'_>) -> CompletedMarker {
while !p.at(EOF) && !p.at(R_PAREN) {
if p.at_ts(TABLE_CONSTRAINT_FIRST) {
table_constraint(p);
} else if p.at(LIKE_KW) {
like_clause(p);
} else {
name(p);
type_name(p);
Expand Down
15 changes: 15 additions & 0 deletions crates/squawk_parser/tests/data/ok/create_foreign_table_pg18.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
-- like clause is >=pg18
create foreign table u (
like t
) server s;

-- like clause is >=pg18
create foreign table remote_users (
like local_users
including defaults
including constraints
excluding generated
excluding statistics
excluding all
) server remote_server;

10 changes: 10 additions & 0 deletions crates/squawk_parser/tests/data/ok/create_table_pg17.sql
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,16 @@ create table t (
unique (a without overlaps)
);


-- primary key without overlaps
create table t (
a text,
b text,
c text,
constraint pk
primary key (a, b, c without overlaps)
);

-- temporal_primary_key
CREATE TABLE addresses (
id int8 generated BY DEFAULT AS IDENTITY,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
---
source: crates/squawk_parser/tests/tests.rs
input_file: crates/squawk_parser/tests/data/ok/create_foreign_table_pg18.sql
---
SOURCE_FILE
COMMENT "-- like clause is >=pg18"
WHITESPACE "\n"
CREATE_FOREIGN_TABLE
CREATE_KW "create"
WHITESPACE " "
FOREIGN_KW "foreign"
WHITESPACE " "
TABLE_KW "table"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME
IDENT "u"
WHITESPACE " "
L_PAREN "("
WHITESPACE "\n "
LIKE_CLAUSE
LIKE_KW "like"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME_REF
IDENT "t"
WHITESPACE "\n"
R_PAREN ")"
WHITESPACE " "
SERVER_KW "server"
WHITESPACE " "
NAME_REF
IDENT "s"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- like clause is >=pg18"
WHITESPACE "\n"
CREATE_FOREIGN_TABLE
CREATE_KW "create"
WHITESPACE " "
FOREIGN_KW "foreign"
WHITESPACE " "
TABLE_KW "table"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME
IDENT "remote_users"
WHITESPACE " "
L_PAREN "("
WHITESPACE "\n "
LIKE_CLAUSE
LIKE_KW "like"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME_REF
IDENT "local_users"
WHITESPACE "\n "
LIKE_OPTION
INCLUDING_KW "including"
WHITESPACE " "
DEFAULTS_KW "defaults"
WHITESPACE "\n "
LIKE_OPTION
INCLUDING_KW "including"
WHITESPACE " "
CONSTRAINTS_KW "constraints"
WHITESPACE "\n "
LIKE_OPTION
EXCLUDING_KW "excluding"
WHITESPACE " "
GENERATED_KW "generated"
WHITESPACE "\n "
LIKE_OPTION
EXCLUDING_KW "excluding"
WHITESPACE " "
STATISTICS_KW "statistics"
WHITESPACE "\n "
LIKE_OPTION
EXCLUDING_KW "excluding"
WHITESPACE " "
ALL_KW "all"
WHITESPACE "\n"
R_PAREN ")"
WHITESPACE " "
SERVER_KW "server"
WHITESPACE " "
NAME_REF
IDENT "remote_server"
SEMICOLON ";"
WHITESPACE "\n\n"
70 changes: 40 additions & 30 deletions crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap
Original file line number Diff line number Diff line change
Expand Up @@ -175,9 +175,10 @@ SOURCE_FILE
NAME_REF
IDENT "b"
WHITESPACE " "
INCLUDING_KW "including"
WHITESPACE " "
COMMENTS_KW "comments"
LIKE_OPTION
INCLUDING_KW "including"
WHITESPACE " "
COMMENTS_KW "comments"
WHITESPACE "\n"
R_PAREN ")"
SEMICOLON ";"
Expand Down Expand Up @@ -221,41 +222,50 @@ SOURCE_FILE
NAME_REF
IDENT "b"
WHITESPACE " "
INCLUDING_KW "including"
WHITESPACE " "
COMMENTS_KW "comments"
WHITESPACE " "
INCLUDING_KW "including"
WHITESPACE " "
CONSTRAINTS_KW "constraints"
WHITESPACE " "
EXCLUDING_KW "excluding"
WHITESPACE " "
DEFAULTS_KW "defaults"
WHITESPACE " "
EXCLUDING_KW "excluding"
WHITESPACE " "
GENERATED_KW "generated"
WHITESPACE " "
EXCLUDING_KW "excluding"
WHITESPACE " "
IDENTITY_KW "identity"
LIKE_OPTION
INCLUDING_KW "including"
WHITESPACE " "
COMMENTS_KW "comments"
WHITESPACE " "
EXCLUDING_KW "excluding"
LIKE_OPTION
INCLUDING_KW "including"
WHITESPACE " "
CONSTRAINTS_KW "constraints"
WHITESPACE " "
INDEXES_KW "indexes"
LIKE_OPTION
EXCLUDING_KW "excluding"
WHITESPACE " "
DEFAULTS_KW "defaults"
WHITESPACE " "
EXCLUDING_KW "excluding"
LIKE_OPTION
EXCLUDING_KW "excluding"
WHITESPACE " "
GENERATED_KW "generated"
WHITESPACE " "
STATISTICS_KW "statistics"
LIKE_OPTION
EXCLUDING_KW "excluding"
WHITESPACE " "
IDENTITY_KW "identity"
WHITESPACE " "
INCLUDING_KW "including"
LIKE_OPTION
EXCLUDING_KW "excluding"
WHITESPACE " "
INDEXES_KW "indexes"
WHITESPACE " "
STORAGE_KW "storage"
LIKE_OPTION
EXCLUDING_KW "excluding"
WHITESPACE " "
STATISTICS_KW "statistics"
WHITESPACE " "
EXCLUDING_KW "excluding"
LIKE_OPTION
INCLUDING_KW "including"
WHITESPACE " "
STORAGE_KW "storage"
WHITESPACE " "
ALL_KW "all"
LIKE_OPTION
EXCLUDING_KW "excluding"
WHITESPACE " "
ALL_KW "all"
WHITESPACE "\n"
R_PAREN ")"
SEMICOLON ";"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,88 @@ SOURCE_FILE
WHITESPACE "\n"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n\n"
CREATE_TABLE
COMMENT "-- primary key without overlaps"
WHITESPACE "\n"
CREATE_KW "create"
WHITESPACE " "
TABLE_KW "table"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME
IDENT "t"
WHITESPACE " "
TABLE_ARG_LIST
L_PAREN "("
WHITESPACE "\n "
COLUMN
NAME
IDENT "a"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
TEXT_KW "text"
COMMA ","
WHITESPACE "\n "
COLUMN
NAME
IDENT "b"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
TEXT_KW "text"
COMMA ","
WHITESPACE "\n "
COLUMN
NAME
IDENT "c"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
TEXT_KW "text"
COMMA ","
WHITESPACE "\n "
PRIMARY_KEY_CONSTRAINT
CONSTRAINT_KW "constraint"
WHITESPACE " "
NAME
IDENT "pk"
WHITESPACE " \n "
PRIMARY_KW "primary"
WHITESPACE " "
KEY_KW "key"
WHITESPACE " "
COLUMN_LIST
L_PAREN "("
COLUMN
NAME_REF
IDENT "a"
COMMA ","
WHITESPACE " "
COLUMN
NAME_REF
IDENT "b"
COMMA ","
WHITESPACE " "
COLUMN
NAME_REF
IDENT "c"
WHITESPACE " "
WITHOUT_KW "without"
WHITESPACE " "
OVERLAPS_KW "overlaps"
R_PAREN ")"
WHITESPACE "\n"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
CREATE_TABLE
COMMENT "-- temporal_primary_key"
Expand Down
Loading
Loading