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
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.

85 changes: 64 additions & 21 deletions crates/squawk_parser/src/grammar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,14 @@ fn literal(p: &mut Parser<'_>) -> Option<CompletedMarker> {
return None;
}
let m = p.start();
p.bump_any();
// E021-03 string continuation syntax
// If two string literals are next to each other, and don't have a comment
// between them, then they are automatically combined.
if p.eat(STRING) {
while !p.at(EOF) && p.eat(STRING) {}
} else {
p.bump_any();
}
Some(m.complete(p, LITERAL))
}

Expand Down Expand Up @@ -1795,27 +1802,33 @@ fn name_ref_(p: &mut Parser<'_>) -> Option<CompletedMarker> {
return None;
}
let m = p.start();
// TODO: this needs to be cleaned up
let mut is_interval_cast = false;
if p.eat(COLLATION_KW) {
let kind = if p.eat(COLLATION_KW) {
p.expect(FOR_KW);
NAME_REF
// timestamp with time zone / time with time zone
} else if p.eat(TIMESTAMP_KW) || p.eat(TIME_KW) {
if p.eat(WITH_KW) {
p.expect(TIME_KW);
p.expect(ZONE_KW);
}
} else if p.eat(INTERVAL_KW) {
if p.eat(L_PAREN) {
if opt_numeric_literal(p).is_none() {
p.error("expected number");
p.error("expected numeric literal");
}
p.expect(R_PAREN);
}
if p.eat(WITH_KW) {
p.expect(TIME_KW);
p.expect(ZONE_KW);
}
TIME_TYPE
} else if p.eat(INTERVAL_KW) {
opt_interval_trailing(p);
is_interval_cast = true;
INTERVAL_TYPE
} else {
p.bump_any();
}
let cm = m.complete(p, NAME_REF);
NAME_REF
};
let cm = m.complete(p, if p.at(STRING) { kind } else { NAME_REF });
// A path followed by a string is a type cast so we insert a CAST_EXPR
// preceding it to wrap the previously parsed data.
// e.g., `select numeric '12312'`
Expand Down Expand Up @@ -2540,14 +2553,12 @@ fn opt_from_clause(p: &mut Parser<'_>) -> bool {
m.abandon(p);
return false;
}
while !p.at(EOF) {
if !opt_from_item(p) {
p.error(format!("expected from item, got {:?}", p.current()));
}
while !p.at(EOF) && p.eat(COMMA) {
if !opt_from_item(p) {
m.complete(p, FROM_CLAUSE);
return false;
}
// foo, bar, buzz
// ^
if !p.eat(COMMA) {
p.error("expected from item");
break;
}
}
Expand Down Expand Up @@ -2626,18 +2637,48 @@ const COL_NAME_KEYWORD_FIRST: TokenSet = TokenSet::new(&[
// Generated via the above grammar, but we only take the keywords that are
// single items. So `CURRENT_DATE` but not `COLLATION FOR '(' a_expr ')'`
const FUNC_EXPR_COMMON_SUBEXPR_FIRST: TokenSet = TokenSet::new(&[
CAST_KW,
COALESCE_KW,
COLLATION_KW,
CURRENT_CATALOG_KW,
CURRENT_DATE_KW,
CURRENT_ROLE_KW,
CURRENT_SCHEMA_KW,
CURRENT_TIME_KW,
CURRENT_TIMESTAMP_KW,
CURRENT_USER_KW,
EXTRACT_KW,
GREATEST_KW,
JSON_KW,
JSON_ARRAY_KW,
JSON_EXISTS_KW,
JSON_OBJECT_KW,
JSON_QUERY_KW,
JSON_SCALAR_KW,
JSON_SERIALIZE_KW,
JSON_VALUE_KW,
LEAST_KW,
LOCALTIME_KW,
LOCALTIMESTAMP_KW,
CURRENT_ROLE_KW,
CURRENT_USER_KW,
MERGE_ACTION_KW,
NORMALIZE_KW,
NULLIF_KW,
OVERLAY_KW,
POSITION_KW,
SESSION_USER_KW,
SUBSTRING_KW,
SYSTEM_USER_KW,
TREAT_KW,
TRIM_KW,
USER_KW,
CURRENT_CATALOG_KW,
CURRENT_SCHEMA_KW,
XMLCONCAT_KW,
XMLELEMENT_KW,
XMLEXISTS_KW,
XMLFOREST_KW,
XMLPARSE_KW,
XMLPI_KW,
XMLROOT_KW,
XMLSERIALIZE_KW,
]);

const FROM_ITEM_KEYWORDS_FIRST: TokenSet = TokenSet::new(&[])
Expand Down Expand Up @@ -2808,10 +2849,12 @@ fn opt_from_item(p: &mut Parser<'_>) -> bool {
if !p.at_ts(FROM_ITEM_FIRST) {
return false;
}
let m = p.start();
data_source(p);
while p.at_ts(JOIN_FIRST) {
join(p);
}
m.complete(p, FROM_ITEM);
true
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ select f1, f1[1], (f1[2])[1] from dposintatable;
-- it'd be nice if you could do something like this, but for now you can't:
update dposintatable set f1[2][1] = array[97];
-- maybe someday we can make this syntax work:
update dposintatable set (f1[2])[1] = array[98];
-- update dposintatable set (f1[2])[1] = array[98];

drop table dposintatable;
drop domain posint cascade;
Expand Down
5 changes: 3 additions & 2 deletions crates/squawk_parser/tests/snapshots/tests__copy_ok.snap
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,9 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "FROM"
WHITESPACE " "
NAME_REF
IDENT "country"
FROM_ITEM
NAME_REF
IDENT "country"
WHITESPACE " "
WHERE_CLAUSE
WHERE_KW "WHERE"
Expand Down
15 changes: 9 additions & 6 deletions crates/squawk_parser/tests/snapshots/tests__create_rule_ok.snap
Original file line number Diff line number Diff line change
Expand Up @@ -234,8 +234,9 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "FROM"
WHITESPACE " "
NAME_REF
IDENT "t2"
FROM_ITEM
NAME_REF
IDENT "t2"
SEMICOLON ";"
WHITESPACE "\n\n"
CREATE_RULE
Expand Down Expand Up @@ -274,8 +275,9 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "FROM"
WHITESPACE " "
NAME_REF
IDENT "t1"
FROM_ITEM
NAME_REF
IDENT "t1"
SEMICOLON ";"
WHITESPACE "\n\n"
SELECT
Expand All @@ -289,8 +291,9 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "FROM"
WHITESPACE " "
NAME_REF
IDENT "t1"
FROM_ITEM
NAME_REF
IDENT "t1"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- doc_2"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,9 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
NAME_REF
IDENT "u"
FROM_ITEM
NAME_REF
IDENT "u"
WHITESPACE " "
WHERE_CLAUSE
WHERE_KW "where"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,34 +31,37 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
PAREN_EXPR
L_PAREN "("
FROM_ITEM
PAREN_EXPR
L_PAREN "("
WHITESPACE " "
SELECT
SELECT_CLAUSE
SELECT_KW "select"
FROM_ITEM
PAREN_EXPR
L_PAREN "("
WHITESPACE " "
TARGET_LIST
TARGET
NAME_REF
IDENT "y"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
NAME_REF
IDENT "y"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
FROM_ITEM
NAME_REF
IDENT "bar"
WHITESPACE " "
NAME_REF
IDENT "bar"
WHITESPACE " "
R_PAREN ")"
R_PAREN ")"
R_PAREN ")"
WHITESPACE " "
ALIAS
AS_KW "as"
WHITESPACE " "
NAME
IDENT "b"
ALIAS
AS_KW "as"
WHITESPACE " "
NAME
IDENT "b"
WHITESPACE "\n "
ORDER_BY_CLAUSE
ORDER_KW "order"
Expand Down
51 changes: 29 additions & 22 deletions crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,9 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "FROM"
WHITESPACE " "
NAME_REF
IDENT "films"
FROM_ITEM
NAME_REF
IDENT "films"
WHITESPACE "\n "
WHERE_CLAUSE
WHERE_KW "WHERE"
Expand Down Expand Up @@ -120,8 +121,9 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "FROM"
WHITESPACE " "
NAME_REF
IDENT "comedies"
FROM_ITEM
NAME_REF
IDENT "comedies"
WHITESPACE "\n "
WHERE_CLAUSE
WHERE_KW "WHERE"
Expand Down Expand Up @@ -167,8 +169,9 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "FROM"
WHITESPACE " "
NAME_REF
IDENT "comedies"
FROM_ITEM
NAME_REF
IDENT "comedies"
WHITESPACE "\n "
WHERE_CLAUSE
WHERE_KW "WHERE"
Expand Down Expand Up @@ -261,12 +264,13 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "FROM"
WHITESPACE " "
NAME_REF
IDENT "user_ratings"
WHITESPACE " "
ALIAS
NAME
IDENT "r"
FROM_ITEM
NAME_REF
IDENT "user_ratings"
WHITESPACE " "
ALIAS
NAME
IDENT "r"
WHITESPACE "\n "
WHERE_CLAUSE
WHERE_KW "WHERE"
Expand Down Expand Up @@ -297,12 +301,13 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "FROM"
WHITESPACE " "
NAME_REF
IDENT "films"
WHITESPACE " "
ALIAS
NAME
IDENT "f"
FROM_ITEM
NAME_REF
IDENT "films"
WHITESPACE " "
ALIAS
NAME
IDENT "f"
WHITESPACE "\n "
WHERE_CLAUSE
WHERE_KW "WHERE"
Expand Down Expand Up @@ -376,8 +381,9 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "FROM"
WHITESPACE " "
NAME_REF
IDENT "nums_1_100"
FROM_ITEM
NAME_REF
IDENT "nums_1_100"
WHITESPACE " "
WHERE_CLAUSE
WHERE_KW "WHERE"
Expand Down Expand Up @@ -549,7 +555,8 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
NAME_REF
IDENT "foo"
FROM_ITEM
NAME_REF
IDENT "foo"
SEMICOLON ";"
WHITESPACE "\n"
5 changes: 3 additions & 2 deletions crates/squawk_parser/tests/snapshots/tests__declare_ok.snap
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@ SOURCE_FILE
FROM_CLAUSE
FROM_KW "FROM"
WHITESPACE " "
NAME_REF
IDENT "t"
FROM_ITEM
NAME_REF
IDENT "t"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- full"
Expand Down
Loading
Loading