diff --git a/crates/squawk_parser/src/generated/syntax_kind.rs b/crates/squawk_parser/src/generated/syntax_kind.rs index 99efa1fe..e83b8653 100644 --- a/crates/squawk_parser/src/generated/syntax_kind.rs +++ b/crates/squawk_parser/src/generated/syntax_kind.rs @@ -760,6 +760,7 @@ pub enum SyntaxKind { FORCE_RLS, FOREIGN_KEY_CONSTRAINT, FROM_CLAUSE, + FROM_ITEM, FUNC_OPTION, FUNC_OPTION_LIST, GENERATED_CONSTRAINT, diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index d9c3af79..4d070b24 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -27,7 +27,14 @@ fn literal(p: &mut Parser<'_>) -> Option { 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)) } @@ -1795,27 +1802,33 @@ fn name_ref_(p: &mut Parser<'_>) -> Option { 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'` @@ -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; } } @@ -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(&[]) @@ -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 } diff --git a/crates/squawk_parser/tests/data/regression_suite/domain.sql b/crates/squawk_parser/tests/data/regression_suite/domain.sql index 358c4e5d..a6af5604 100644 --- a/crates/squawk_parser/tests/data/regression_suite/domain.sql +++ b/crates/squawk_parser/tests/data/regression_suite/domain.sql @@ -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; diff --git a/crates/squawk_parser/tests/snapshots/tests__copy_ok.snap b/crates/squawk_parser/tests/snapshots/tests__copy_ok.snap index 6e1bbc69..d6edb1ef 100644 --- a/crates/squawk_parser/tests/snapshots/tests__copy_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__copy_ok.snap @@ -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" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_rule_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_rule_ok.snap index 78fe15bb..6f1483e8 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_rule_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_rule_ok.snap @@ -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 @@ -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 @@ -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" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_table_as_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_table_as_ok.snap index a34983bc..ae895931 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_table_as_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_table_as_ok.snap @@ -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" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_view_extra_parens_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_view_extra_parens_ok.snap index 7474a0d4..141560fa 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_view_extra_parens_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_view_extra_parens_ok.snap @@ -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" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap index 2a1c2317..33a7b9d4 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" diff --git a/crates/squawk_parser/tests/snapshots/tests__declare_ok.snap b/crates/squawk_parser/tests/snapshots/tests__declare_ok.snap index 75296085..c7623942 100644 --- a/crates/squawk_parser/tests/snapshots/tests__declare_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__declare_ok.snap @@ -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" diff --git a/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap b/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap index 40aee4e4..9b6342a4 100644 --- a/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap @@ -131,12 +131,14 @@ SOURCE_FILE USING_CLAUSE USING_KW "using" WHITESPACE " " - NAME_REF - IDENT "foo" + FROM_ITEM + NAME_REF + IDENT "foo" COMMA "," WHITESPACE " " - NAME_REF - IDENT "bar" + FROM_ITEM + NAME_REF + IDENT "bar" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "where" @@ -171,20 +173,22 @@ SOURCE_FILE USING_CLAUSE USING_KW "using" WHITESPACE " " - NAME_REF - IDENT "foo" - WHITESPACE " " - ALIAS - NAME - IDENT "f" + FROM_ITEM + NAME_REF + IDENT "foo" + WHITESPACE " " + ALIAS + NAME + IDENT "f" COMMA "," WHITESPACE " " - NAME_REF - IDENT "b" - WHITESPACE " " - ALIAS - NAME - IDENT "a" + FROM_ITEM + NAME_REF + IDENT "b" + WHITESPACE " " + ALIAS + NAME + IDENT "a" SEMICOLON ";" WHITESPACE "\n\n" DELETE @@ -201,43 +205,45 @@ SOURCE_FILE USING_CLAUSE USING_KW "using" WHITESPACE " " - NAME_REF - IDENT "order_items" - WHITESPACE " " - ALIAS - NAME - IDENT "oi" - WHITESPACE "\n " - JOIN - LEFT_KW "left" - WHITESPACE " " - JOIN_KW "join" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "orders" + IDENT "order_items" WHITESPACE " " ALIAS NAME - IDENT "o" - WHITESPACE " " - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "oi" - DOT "." - NAME_REF - IDENT "order_id" + IDENT "oi" + WHITESPACE "\n " + JOIN + LEFT_KW "left" WHITESPACE " " - EQ "=" + JOIN_KW "join" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "o" - DOT "." + FROM_ITEM NAME_REF - IDENT "id" + IDENT "orders" + WHITESPACE " " + ALIAS + NAME + IDENT "o" + WHITESPACE " " + ON_KW "on" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "oi" + DOT "." + NAME_REF + IDENT "order_id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "o" + DOT "." + NAME_REF + IDENT "id" SEMICOLON ";" WHITESPACE "\n\n" DELETE @@ -256,59 +262,62 @@ SOURCE_FILE USING_CLAUSE USING_KW "using" WHITESPACE " " - NAME_REF - IDENT "users" - WHITESPACE " " - ALIAS - NAME - IDENT "u" + FROM_ITEM + NAME_REF + IDENT "users" + WHITESPACE " " + ALIAS + NAME + IDENT "u" COMMA "," WHITESPACE "\n " - PAREN_EXPR - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - NAME_REF - IDENT "user_id" - COMMA "," + FROM_ITEM + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" WHITESPACE " " - TARGET - CALL_EXPR + TARGET_LIST + TARGET NAME_REF - IDENT "max" - ARG_LIST - L_PAREN "(" - NAME_REF - IDENT "login_time" - R_PAREN ")" + IDENT "user_id" + COMMA "," WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "last_login" - WHITESPACE "\n " - FROM_CLAUSE - FROM_KW "from" - WHITESPACE " " - NAME_REF - IDENT "login_history" - WHITESPACE "\n " - GROUP_BY_CLAUSE - GROUP_KW "group" - WHITESPACE " " - BY_KW "by" - WHITESPACE " " - NAME_REF - IDENT "user_id" - R_PAREN ")" - WHITESPACE " " - ALIAS - NAME - IDENT "lh" + TARGET + CALL_EXPR + NAME_REF + IDENT "max" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "login_time" + R_PAREN ")" + WHITESPACE " " + AS_KW "as" + WHITESPACE " " + NAME + IDENT "last_login" + WHITESPACE "\n " + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "login_history" + WHITESPACE "\n " + GROUP_BY_CLAUSE + GROUP_KW "group" + WHITESPACE " " + BY_KW "by" + WHITESPACE " " + NAME_REF + IDENT "user_id" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "lh" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- where return" @@ -384,8 +393,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "departments" + FROM_ITEM + NAME_REF + IDENT "departments" WHITESPACE " \n " WHERE_CLAUSE WHERE_KW "where" @@ -526,14 +536,15 @@ SOURCE_FILE USING_CLAUSE USING_KW "using" WHITESPACE " " - NAME_REF - IDENT "q" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + NAME_REF + IDENT "q" WHITESPACE " " - NAME - IDENT "d" + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "d" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "where" @@ -598,14 +609,15 @@ SOURCE_FILE USING_CLAUSE USING_KW "using" WHITESPACE " " - NAME_REF - IDENT "q" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + NAME_REF + IDENT "q" WHITESPACE " " - NAME - IDENT "d" + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "d" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "where" @@ -675,8 +687,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE "\n" R_PAREN ")" WHITESPACE "\n" @@ -693,8 +706,9 @@ SOURCE_FILE USING_CLAUSE USING_KW "using" WHITESPACE " " - NAME_REF - IDENT "t2" + FROM_ITEM + NAME_REF + IDENT "t2" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- pg_docs" @@ -713,8 +727,9 @@ SOURCE_FILE USING_CLAUSE USING_KW "USING" WHITESPACE " " - NAME_REF - IDENT "producers" + FROM_ITEM + NAME_REF + IDENT "producers" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -783,8 +798,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "producers" + FROM_ITEM + NAME_REF + IDENT "producers" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -912,14 +928,15 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "user_logs" - WHITESPACE " " - ALIAS - AS_KW "AS" + FROM_ITEM + NAME_REF + IDENT "user_logs" WHITESPACE " " - NAME - IDENT "l" + ALIAS + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "l" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -979,14 +996,15 @@ SOURCE_FILE USING_CLAUSE USING_KW "USING" WHITESPACE " " - NAME_REF - IDENT "delete_batch" - WHITESPACE " " - ALIAS - AS_KW "AS" + FROM_ITEM + NAME_REF + IDENT "delete_batch" WHITESPACE " " - NAME - IDENT "del" + ALIAS + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "del" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" diff --git a/crates/squawk_parser/tests/snapshots/tests__explain_ok.snap b/crates/squawk_parser/tests/snapshots/tests__explain_ok.snap index 3fa5791d..18040bb7 100644 --- a/crates/squawk_parser/tests/snapshots/tests__explain_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__explain_ok.snap @@ -19,8 +19,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- explain_analyze" @@ -42,8 +43,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- all_options" @@ -166,8 +168,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "foo" + FROM_ITEM + NAME_REF + IDENT "foo" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- doc_example_2" @@ -186,8 +189,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "foo" + FROM_ITEM + NAME_REF + IDENT "foo" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -224,8 +228,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "foo" + FROM_ITEM + NAME_REF + IDENT "foo" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -261,8 +266,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "foo" + FROM_ITEM + NAME_REF + IDENT "foo" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -300,8 +306,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "foo" + FROM_ITEM + NAME_REF + IDENT "foo" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -358,8 +365,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "test" + FROM_ITEM + NAME_REF + IDENT "test" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -442,8 +450,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "test" + FROM_ITEM + NAME_REF + IDENT "test" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -505,8 +514,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "test" + FROM_ITEM + NAME_REF + IDENT "test" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -641,8 +651,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "foo" + FROM_ITEM + NAME_REF + IDENT "foo" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -680,8 +691,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "foo" + FROM_ITEM + NAME_REF + IDENT "foo" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -719,8 +731,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "foo" + FROM_ITEM + NAME_REF + IDENT "foo" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -758,8 +771,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "foo" + FROM_ITEM + NAME_REF + IDENT "foo" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" diff --git a/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap b/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap index 601d4ae4..ca2b2a47 100644 --- a/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap @@ -256,8 +256,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "new_products" + FROM_ITEM + NAME_REF + IDENT "new_products" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "where" @@ -669,8 +670,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "tmp_films" + FROM_ITEM + NAME_REF + IDENT "tmp_films" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -875,8 +877,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "accounts" + FROM_ITEM + NAME_REF + IDENT "accounts" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -922,8 +925,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "upd" + FROM_ITEM + NAME_REF + IDENT "upd" SEMICOLON ";" WHITESPACE "\n\n" INSERT diff --git a/crates/squawk_parser/tests/snapshots/tests__merge_ok.snap b/crates/squawk_parser/tests/snapshots/tests__merge_ok.snap index 707d7f34..d9924057 100644 --- a/crates/squawk_parser/tests/snapshots/tests__merge_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__merge_ok.snap @@ -355,8 +355,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "bar" + FROM_ITEM + NAME_REF + IDENT "bar" R_PAREN ")" WHITESPACE "\n " ON_KW "on" @@ -419,39 +420,41 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "bar" - WHITESPACE " " - JOIN - JOIN_KW "join" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "foo" + IDENT "bar" WHITESPACE " " - ALIAS - AS_KW "as" + JOIN + JOIN_KW "join" WHITESPACE " " - NAME - IDENT "f" - WHITESPACE " " - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR + FROM_ITEM NAME_REF - IDENT "f" - DOT "." - NAME_REF - IDENT "id" + IDENT "foo" + WHITESPACE " " + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "f" WHITESPACE " " - EQ "=" + ON_KW "on" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "bar" - DOT "." - NAME_REF - IDENT "id" + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "f" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "bar" + DOT "." + NAME_REF + IDENT "id" R_PAREN ")" WHITESPACE " " ALIAS @@ -520,8 +523,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "bar" + FROM_ITEM + NAME_REF + IDENT "bar" R_PAREN ")" WHITESPACE " " ALIAS diff --git a/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap b/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap index 5df70b05..0e57410f 100644 --- a/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap @@ -1055,8 +1055,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "recent_transactions" + FROM_ITEM + NAME_REF + IDENT "recent_transactions" R_PAREN ")" WHITESPACE " " ALIAS diff --git a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap index a6f41a67..dffc8ec6 100644 --- a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap @@ -91,54 +91,55 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "unnest" - ARG_LIST - L_PAREN "(" - WHITESPACE "\n " - CAST_EXPR - LITERAL - POSITIONAL_PARAM "$1" - COLON_COLON "::" - ARRAY_TYPE - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "timestamptz" - L_BRACK "[" - R_BRACK "]" - COMMA "," - WHITESPACE " \n " - CAST_EXPR - LITERAL - POSITIONAL_PARAM "$2" - COLON_COLON "::" - ARRAY_TYPE - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - L_BRACK "[" - R_BRACK "]" - COMMA "," - WHITESPACE " \n " - CAST_EXPR - LITERAL - POSITIONAL_PARAM "$3" - COLON_COLON "::" - ARRAY_TYPE - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "float8" - L_BRACK "[" - R_BRACK "]" - WHITESPACE "\n" - R_PAREN ")" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "unnest" + ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + CAST_EXPR + LITERAL + POSITIONAL_PARAM "$1" + COLON_COLON "::" + ARRAY_TYPE + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "timestamptz" + L_BRACK "[" + R_BRACK "]" + COMMA "," + WHITESPACE " \n " + CAST_EXPR + LITERAL + POSITIONAL_PARAM "$2" + COLON_COLON "::" + ARRAY_TYPE + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + L_BRACK "[" + R_BRACK "]" + COMMA "," + WHITESPACE " \n " + CAST_EXPR + LITERAL + POSITIONAL_PARAM "$3" + COLON_COLON "::" + ARRAY_TYPE + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "float8" + L_BRACK "[" + R_BRACK "]" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" INSERT @@ -328,26 +329,28 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "movies" - COMMA "," - WHITESPACE " " - CALL_EXPR + FROM_ITEM NAME_REF - IDENT "plainto_tsquery" - ARG_LIST - L_PAREN "(" - LITERAL - STRING "'english'" - COMMA "," - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$1" - R_PAREN ")" + IDENT "movies" + COMMA "," WHITESPACE " " - ALIAS - NAME - IDENT "query" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "plainto_tsquery" + ARG_LIST + L_PAREN "(" + LITERAL + STRING "'english'" + COMMA "," + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$1" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "query" WHITESPACE "\n" WHERE_CLAUSE WHERE_KW "WHERE" @@ -539,12 +542,14 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "movies" + FROM_ITEM + NAME_REF + IDENT "movies" COMMA "," WHITESPACE " " - NAME_REF - IDENT "query_embedding" + FROM_ITEM + NAME_REF + IDENT "query_embedding" WHITESPACE "\n" ORDER_BY_CLAUSE ORDER_KW "ORDER" @@ -624,113 +629,114 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "jsonb_to_recordset" - ARG_LIST - L_PAREN "(" - WHITESPACE "\n " - BIN_EXPR - CALL_EXPR - FIELD_EXPR - NAME_REF - IDENT "ai" - DOT "." - NAME_REF - IDENT "cohere_rerank" - ARG_LIST - L_PAREN "(" - WHITESPACE "\n " - LITERAL - STRING "'rerank-english-v3.0'" - COMMA "," - WHITESPACE "\n " - COMMENT "-- %s," - WHITESPACE "\n " - LITERAL - POSITIONAL_PARAM "$1" - COMMA "," - WHITESPACE "\n " - COMMENT "-- %s::jsonb," - WHITESPACE "\n " - CAST_EXPR - LITERAL - POSITIONAL_PARAM "$2" - COLON_COLON "::" - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "jsonb" - COMMA "," - WHITESPACE "\n " - NAMED_ARG + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "jsonb_to_recordset" + ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + BIN_EXPR + CALL_EXPR + FIELD_EXPR NAME_REF - IDENT "return_documents" - WHITESPACE " " - FAT_ARROW "=>" - WHITESPACE " " - LITERAL - TRUE_KW "true" - COMMA "," - WHITESPACE "\n " - COMMENT "-- api_key=>%s" - WHITESPACE "\n " - NAMED_ARG + IDENT "ai" + DOT "." NAME_REF - IDENT "api_key" - FAT_ARROW "=>" + IDENT "cohere_rerank" + ARG_LIST + L_PAREN "(" + WHITESPACE "\n " LITERAL - POSITIONAL_PARAM "$3" - WHITESPACE "\n " - R_PAREN ")" - CUSTOM_OP - MINUS "-" - R_ANGLE ">" - LITERAL - STRING "'results'" - WHITESPACE "\n" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "AS" + STRING "'rerank-english-v3.0'" + COMMA "," + WHITESPACE "\n " + COMMENT "-- %s," + WHITESPACE "\n " + LITERAL + POSITIONAL_PARAM "$1" + COMMA "," + WHITESPACE "\n " + COMMENT "-- %s::jsonb," + WHITESPACE "\n " + CAST_EXPR + LITERAL + POSITIONAL_PARAM "$2" + COLON_COLON "::" + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "jsonb" + COMMA "," + WHITESPACE "\n " + NAMED_ARG + NAME_REF + IDENT "return_documents" + WHITESPACE " " + FAT_ARROW "=>" + WHITESPACE " " + LITERAL + TRUE_KW "true" + COMMA "," + WHITESPACE "\n " + COMMENT "-- api_key=>%s" + WHITESPACE "\n " + NAMED_ARG + NAME_REF + IDENT "api_key" + FAT_ARROW "=>" + LITERAL + POSITIONAL_PARAM "$3" + WHITESPACE "\n " + R_PAREN ")" + CUSTOM_OP + MINUS "-" + R_ANGLE ">" + LITERAL + STRING "'results'" + WHITESPACE "\n" + R_PAREN ")" WHITESPACE " " - NAME - IDENT "x" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "\"index\"" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - INT_KW "int" - COMMA "," + ALIAS + AS_KW "AS" WHITESPACE " " - COLUMN - NAME - IDENT "\"document\"" + NAME + IDENT "x" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "\"index\"" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + COMMA "," WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "jsonb" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "relevance_score" + COLUMN + NAME + IDENT "\"document\"" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "jsonb" + COMMA "," WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "float8" - R_PAREN ")" + COLUMN + NAME + IDENT "relevance_score" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "float8" + R_PAREN ")" WHITESPACE "\n" ORDER_BY_CLAUSE ORDER_KW "ORDER" @@ -1080,8 +1086,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE "\n " - NAME_REF - IDENT "input_data" + FROM_ITEM + NAME_REF + IDENT "input_data" WHITESPACE "\n" GROUP_BY_CLAUSE GROUP_KW "GROUP" @@ -1309,12 +1316,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "partman_test" - DOT "." - NAME_REF - IDENT "time_taptest_table_default" + FROM_ITEM + FIELD_EXPR + NAME_REF + IDENT "partman_test" + DOT "." + NAME_REF + IDENT "time_taptest_table_default" SEMICOLON ";" WHITESPACE "\n\n" TABLE @@ -1500,8 +1508,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "partition_data" + FROM_ITEM + NAME_REF + IDENT "partition_data" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -1634,8 +1643,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "partition_data" + FROM_ITEM + NAME_REF + IDENT "partition_data" SEMICOLON ";" WHITESPACE "\n\n" DROP_TABLE @@ -1664,12 +1674,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "partman_test" - DOT "." - NAME_REF - IDENT "time_taptest_table_default" + FROM_ITEM + FIELD_EXPR + NAME_REF + IDENT "partman_test" + DOT "." + NAME_REF + IDENT "time_taptest_table_default" WHITESPACE " " SEMICOLON ";" WHITESPACE "\n\n" @@ -1684,12 +1695,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "partman_test" - DOT "." - NAME_REF - IDENT "time_taptest_table" + FROM_ITEM + FIELD_EXPR + NAME_REF + IDENT "partman_test" + DOT "." + NAME_REF + IDENT "time_taptest_table" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -1703,12 +1715,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "partman_test" - DOT "." - NAME_REF - IDENT "time_taptest_table_p20241225" + FROM_ITEM + FIELD_EXPR + NAME_REF + IDENT "partman_test" + DOT "." + NAME_REF + IDENT "time_taptest_table_p20241225" WHITESPACE " " SEMICOLON ";" WHITESPACE "\n\n" @@ -1723,16 +1736,17 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - CALL_EXPR - FIELD_EXPR - NAME_REF - IDENT "partman" - DOT "." - NAME_REF - IDENT "check_default" - ARG_LIST - L_PAREN "(" - R_PAREN ")" + FROM_ITEM + CALL_EXPR + FIELD_EXPR + NAME_REF + IDENT "partman" + DOT "." + NAME_REF + IDENT "check_default" + ARG_LIST + L_PAREN "(" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -1746,18 +1760,19 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - CALL_EXPR - FIELD_EXPR - NAME_REF - IDENT "partman" - DOT "." - NAME_REF - IDENT "check_default" - ARG_LIST - L_PAREN "(" - LITERAL - FALSE_KW "false" - R_PAREN ")" + FROM_ITEM + CALL_EXPR + FIELD_EXPR + NAME_REF + IDENT "partman" + DOT "." + NAME_REF + IDENT "check_default" + ARG_LIST + L_PAREN "(" + LITERAL + FALSE_KW "false" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -1771,12 +1786,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "partman_test" - DOT "." - NAME_REF - IDENT "time_taptest_table_default" + FROM_ITEM + FIELD_EXPR + NAME_REF + IDENT "partman_test" + DOT "." + NAME_REF + IDENT "time_taptest_table_default" SEMICOLON ";" WHITESPACE "\n\n" CALL @@ -1825,18 +1841,19 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - CALL_EXPR - FIELD_EXPR - NAME_REF - IDENT "partman" - DOT "." - NAME_REF - IDENT "partition_gap_fill" - ARG_LIST - L_PAREN "(" - LITERAL - STRING "'partman_test.time_taptest_table'" - R_PAREN ")" + FROM_ITEM + CALL_EXPR + FIELD_EXPR + NAME_REF + IDENT "partman" + DOT "." + NAME_REF + IDENT "partition_gap_fill" + ARG_LIST + L_PAREN "(" + LITERAL + STRING "'partman_test.time_taptest_table'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n\n" COMMENT "-- https://www.crunchydata.com/blog/smarter-postgres-llm-with-retrieval-augmented-generation" @@ -2056,8 +2073,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "tng" + FROM_ITEM + NAME_REF + IDENT "tng" WHITESPACE "\n" ORDER_BY_CLAUSE ORDER_KW "ORDER" @@ -2395,21 +2413,22 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "generate_series" - ARG_LIST - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - LITERAL - INT_NUMBER "1000000" - R_PAREN ")" - WHITESPACE " " - ALIAS - NAME - IDENT "s" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "generate_series" + ARG_LIST + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + LITERAL + INT_NUMBER "1000000" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "s" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "/* define a sequence pipeline that periodically upserts view counts */" @@ -2468,8 +2487,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "view_counts" + FROM_ITEM + NAME_REF + IDENT "view_counts" WHITESPACE " " WHERE_CLAUSE WHERE_KW "where" @@ -2754,8 +2774,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "user_counts" + FROM_ITEM + NAME_REF + IDENT "user_counts" WHITESPACE " " ORDER_BY_CLAUSE ORDER_KW "order" @@ -3006,32 +3027,34 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "cron" - DOT "." - NAME_REF - IDENT "job_run_details" - WHITESPACE " " - JOIN - JOIN_KW "join" - WHITESPACE " " + FROM_ITEM FIELD_EXPR NAME_REF IDENT "cron" DOT "." NAME_REF - IDENT "job" + IDENT "job_run_details" WHITESPACE " " - USING_CLAUSE - USING_KW "using" + JOIN + JOIN_KW "join" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN + FROM_ITEM + FIELD_EXPR NAME_REF - IDENT "jobid" - R_PAREN ")" + IDENT "cron" + DOT "." + NAME_REF + IDENT "job" + WHITESPACE " " + USING_CLAUSE + USING_KW "using" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "jobid" + R_PAREN ")" WHITESPACE "\n" WHERE_CLAUSE WHERE_KW "where" @@ -3334,84 +3357,87 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "cal" - DOT "." - NAME_REF - IDENT "event_types" - WHITESPACE " " - ALIAS - NAME - IDENT "t" - WHITESPACE "\n " - JOIN - CROSS_KW "cross" - WHITESPACE " " - JOIN_KW "join" - WHITESPACE " " - CALL_EXPR + FROM_ITEM + FIELD_EXPR NAME_REF - IDENT "json_array_elements" - ARG_LIST - L_PAREN "(" - CAST_EXPR - PAREN_EXPR - L_PAREN "(" - BIN_EXPR - NAME_REF - IDENT "attrs" - CUSTOM_OP - MINUS "-" - R_ANGLE ">" - LITERAL - STRING "'eventTypeGroups'" - R_PAREN ")" - COLON_COLON "::" - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - JSON_KW "json" - R_PAREN ")" + IDENT "cal" + DOT "." + NAME_REF + IDENT "event_types" WHITESPACE " " ALIAS NAME - IDENT "etg" + IDENT "t" WHITESPACE "\n " JOIN CROSS_KW "cross" WHITESPACE " " JOIN_KW "join" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "json_array_elements" - ARG_LIST - L_PAREN "(" - CAST_EXPR - PAREN_EXPR - L_PAREN "(" - BIN_EXPR - NAME_REF - IDENT "etg" - CUSTOM_OP - MINUS "-" - R_ANGLE ">" - LITERAL - STRING "'eventTypes'" - R_PAREN ")" - COLON_COLON "::" - PATH_TYPE - PATH - PATH_SEGMENT + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "json_array_elements" + ARG_LIST + L_PAREN "(" + CAST_EXPR + PAREN_EXPR + L_PAREN "(" + BIN_EXPR NAME_REF - JSON_KW "json" - R_PAREN ")" - WHITESPACE " " - ALIAS - NAME - IDENT "et" + IDENT "attrs" + CUSTOM_OP + MINUS "-" + R_ANGLE ">" + LITERAL + STRING "'eventTypeGroups'" + R_PAREN ")" + COLON_COLON "::" + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + JSON_KW "json" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "etg" + WHITESPACE "\n " + JOIN + CROSS_KW "cross" + WHITESPACE " " + JOIN_KW "join" + WHITESPACE " " + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "json_array_elements" + ARG_LIST + L_PAREN "(" + CAST_EXPR + PAREN_EXPR + L_PAREN "(" + BIN_EXPR + NAME_REF + IDENT "etg" + CUSTOM_OP + MINUS "-" + R_ANGLE ">" + LITERAL + STRING "'eventTypes'" + R_PAREN ")" + COLON_COLON "::" + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + JSON_KW "json" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "et" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- extract bookings" @@ -3497,50 +3523,52 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "cal" - DOT "." - NAME_REF - IDENT "bookings" - WHITESPACE " " - ALIAS - NAME - IDENT "t" - WHITESPACE "\n " - JOIN - CROSS_KW "cross" - WHITESPACE " " - JOIN_KW "join" - WHITESPACE " " - CALL_EXPR + FROM_ITEM + FIELD_EXPR NAME_REF - IDENT "json_array_elements" - ARG_LIST - L_PAREN "(" - CAST_EXPR - PAREN_EXPR - L_PAREN "(" - BIN_EXPR - NAME_REF - IDENT "attrs" - CUSTOM_OP - MINUS "-" - R_ANGLE ">" - LITERAL - STRING "'bookings'" - R_PAREN ")" - COLON_COLON "::" - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - JSON_KW "json" - R_PAREN ")" + IDENT "cal" + DOT "." + NAME_REF + IDENT "bookings" WHITESPACE " " ALIAS NAME - IDENT "bk" + IDENT "t" + WHITESPACE "\n " + JOIN + CROSS_KW "cross" + WHITESPACE " " + JOIN_KW "join" + WHITESPACE " " + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "json_array_elements" + ARG_LIST + L_PAREN "(" + CAST_EXPR + PAREN_EXPR + L_PAREN "(" + BIN_EXPR + NAME_REF + IDENT "attrs" + CUSTOM_OP + MINUS "-" + R_ANGLE ">" + LITERAL + STRING "'bookings'" + R_PAREN ")" + COLON_COLON "::" + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + JSON_KW "json" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "bk" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- make a 15 minutes meeting with Elon Musk" @@ -3660,8 +3688,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "events" + FROM_ITEM + NAME_REF + IDENT "events" WHITESPACE " " GROUP_BY_CLAUSE GROUP_KW "GROUP" @@ -4074,74 +4103,77 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "events_core" - WHITESPACE " " - ALIAS - NAME - IDENT "e" - WHITESPACE "\n" - JOIN - LEFT_KW "LEFT" - WHITESPACE " " - JOIN_KW "JOIN" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "events_metadata" + IDENT "events_core" WHITESPACE " " ALIAS NAME - IDENT "m" - WHITESPACE "\n " - ON_KW "ON" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "e" - DOT "." - NAME_REF - IDENT "event_id" + IDENT "e" + WHITESPACE "\n" + JOIN + LEFT_KW "LEFT" WHITESPACE " " - EQ "=" + JOIN_KW "JOIN" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "m" - DOT "." - NAME_REF - IDENT "event_id" - WHITESPACE "\n" - JOIN - LEFT_KW "LEFT" - WHITESPACE " " - JOIN_KW "JOIN" - WHITESPACE " " - NAME_REF - IDENT "events_payload" - WHITESPACE " " - ALIAS - NAME - IDENT "p" - WHITESPACE "\n " - ON_KW "ON" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR + FROM_ITEM NAME_REF - IDENT "e" - DOT "." - NAME_REF - IDENT "event_id" + IDENT "events_metadata" + WHITESPACE " " + ALIAS + NAME + IDENT "m" + WHITESPACE "\n " + ON_KW "ON" WHITESPACE " " - EQ "=" + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "e" + DOT "." + NAME_REF + IDENT "event_id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "m" + DOT "." + NAME_REF + IDENT "event_id" + WHITESPACE "\n" + JOIN + LEFT_KW "LEFT" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "p" - DOT "." + JOIN_KW "JOIN" + WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "event_id" + IDENT "events_payload" + WHITESPACE " " + ALIAS + NAME + IDENT "p" + WHITESPACE "\n " + ON_KW "ON" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "e" + DOT "." + NAME_REF + IDENT "event_id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "p" + DOT "." + NAME_REF + IDENT "event_id" WHITESPACE "\n" WHERE_CLAUSE WHERE_KW "WHERE" @@ -4167,7 +4199,7 @@ SOURCE_FILE MINUS "-" WHITESPACE " " CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -4497,12 +4529,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "monthly_revenues" - WHITESPACE " " - ALIAS - NAME - IDENT "m2" + FROM_ITEM + NAME_REF + IDENT "monthly_revenues" + WHITESPACE " " + ALIAS + NAME + IDENT "m2" WHITESPACE " \n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -4548,7 +4581,7 @@ SOURCE_FILE MINUS "-" WHITESPACE " " CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -4564,12 +4597,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "monthly_revenues" - WHITESPACE " " - ALIAS - NAME - IDENT "m1" + FROM_ITEM + NAME_REF + IDENT "monthly_revenues" + WHITESPACE " " + ALIAS + NAME + IDENT "m1" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- Use this cleaner window function" @@ -4638,8 +4672,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "monthly_revenues" + FROM_ITEM + NAME_REF + IDENT "monthly_revenues" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -4745,8 +4780,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "transactions" + FROM_ITEM + NAME_REF + IDENT "transactions" WHITESPACE "\n" GROUP_BY_CLAUSE GROUP_KW "GROUP" @@ -4836,8 +4872,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "events" + FROM_ITEM + NAME_REF + IDENT "events" WHITESPACE " \n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -4859,7 +4896,7 @@ SOURCE_FILE MINUS "-" WHITESPACE " " CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -4947,8 +4984,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "users" + FROM_ITEM + NAME_REF + IDENT "users" WHITESPACE "\n" R_PAREN ")" WHITESPACE "\n" @@ -5006,41 +5044,43 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "events" - WHITESPACE " " - ALIAS - NAME - IDENT "e" - WHITESPACE "\n" - JOIN - JOIN_KW "JOIN" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "user_segments" + IDENT "events" WHITESPACE " " ALIAS NAME - IDENT "s" - WHITESPACE "\n " - ON_KW "ON" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "e" - DOT "." - NAME_REF - IDENT "user_id" - WHITESPACE " " - EQ "=" + IDENT "e" + WHITESPACE "\n" + JOIN + JOIN_KW "JOIN" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." + FROM_ITEM NAME_REF - IDENT "user_id" + IDENT "user_segments" + WHITESPACE " " + ALIAS + NAME + IDENT "s" + WHITESPACE "\n " + ON_KW "ON" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "e" + DOT "." + NAME_REF + IDENT "user_id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "user_id" WHITESPACE "\n" GROUP_BY_CLAUSE GROUP_KW "GROUP" @@ -5120,8 +5160,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "events" + FROM_ITEM + NAME_REF + IDENT "events" WHITESPACE "\n" GROUP_BY_CLAUSE GROUP_KW "GROUP" @@ -5251,40 +5292,42 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - WHITESPACE "\n " - SELECT - SELECT_CLAUSE - SELECT_KW "SELECT" - WHITESPACE " " - DISTINCT_CLAUSE - DISTINCT_KW "DISTINCT" - WHITESPACE " " - TARGET_LIST - TARGET + FROM_ITEM + PAREN_EXPR + L_PAREN "(" + WHITESPACE "\n " + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" + WHITESPACE " " + DISTINCT_CLAUSE + DISTINCT_KW "DISTINCT" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "user_id" + WHITESPACE " \n " + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "user_id" - WHITESPACE " \n " - FROM_CLAUSE - FROM_KW "FROM" - WHITESPACE " " - NAME_REF - IDENT "events" - WHITESPACE " \n " - ORDER_BY_CLAUSE - ORDER_KW "ORDER" - WHITESPACE " " - BY_KW "BY" - WHITESPACE " " - NAME_REF - TIMESTAMP_KW "timestamp" - WHITESPACE "\n" - R_PAREN ")" - WHITESPACE " " - ALIAS - NAME - IDENT "t" + IDENT "events" + WHITESPACE " \n " + ORDER_BY_CLAUSE + ORDER_KW "ORDER" + WHITESPACE " " + BY_KW "BY" + WHITESPACE " " + NAME_REF + TIMESTAMP_KW "timestamp" + WHITESPACE "\n" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "t" WHITESPACE "\n" GROUP_BY_CLAUSE GROUP_KW "GROUP" @@ -5319,32 +5362,34 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - WHITESPACE "\n " - SELECT - SELECT_CLAUSE - SELECT_KW "SELECT" - WHITESPACE " " - DISTINCT_CLAUSE - DISTINCT_KW "DISTINCT" - WHITESPACE " " - TARGET_LIST - TARGET + FROM_ITEM + PAREN_EXPR + L_PAREN "(" + WHITESPACE "\n " + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" + WHITESPACE " " + DISTINCT_CLAUSE + DISTINCT_KW "DISTINCT" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "user_id" + WHITESPACE " \n " + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "user_id" - WHITESPACE " \n " - FROM_CLAUSE - FROM_KW "FROM" - WHITESPACE " " - NAME_REF - IDENT "events" - WHITESPACE "\n" - R_PAREN ")" - WHITESPACE " " - ALIAS - NAME - IDENT "t" + IDENT "events" + WHITESPACE "\n" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "t" WHITESPACE "\n" GROUP_BY_CLAUSE GROUP_KW "GROUP" @@ -5374,8 +5419,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "user_status" + FROM_ITEM + NAME_REF + IDENT "user_status" WHITESPACE "\n" WHERE_CLAUSE WHERE_KW "WHERE" @@ -5419,8 +5465,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "user_status" + FROM_ITEM + NAME_REF + IDENT "user_status" WHITESPACE "\n " GROUP_BY_CLAUSE GROUP_KW "GROUP" @@ -5462,8 +5509,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "user_status" + FROM_ITEM + NAME_REF + IDENT "user_status" WHITESPACE "\n" ORDER_BY_CLAUSE ORDER_KW "ORDER" @@ -5607,8 +5655,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "event_logs" + FROM_ITEM + NAME_REF + IDENT "event_logs" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- https://www.crunchydata.com/blog/indexing-materialized-views-in-postgres" @@ -5663,70 +5712,73 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE "\n " - NAME_REF - IDENT "products" - WHITESPACE " " - ALIAS - NAME - IDENT "p" - WHITESPACE "\n " - JOIN - JOIN_KW "JOIN" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "product_orders" + IDENT "products" WHITESPACE " " ALIAS NAME - IDENT "po" - WHITESPACE " " - ON_KW "ON" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "p" - DOT "." + IDENT "p" + WHITESPACE "\n " + JOIN + JOIN_KW "JOIN" + WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "sku" + IDENT "product_orders" + WHITESPACE " " + ALIAS + NAME + IDENT "po" WHITESPACE " " - EQ "=" + ON_KW "ON" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "po" - DOT "." - NAME_REF - IDENT "sku" - WHITESPACE "\n " - JOIN - JOIN_KW "JOIN" - WHITESPACE " " - NAME_REF - IDENT "orders" - WHITESPACE " " - ALIAS - NAME - IDENT "o" - WHITESPACE " " - ON_KW "ON" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "po" - DOT "." + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "p" + DOT "." + NAME_REF + IDENT "sku" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "po" + DOT "." + NAME_REF + IDENT "sku" + WHITESPACE "\n " + JOIN + JOIN_KW "JOIN" + WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "order_id" + IDENT "orders" + WHITESPACE " " + ALIAS + NAME + IDENT "o" WHITESPACE " " - EQ "=" + ON_KW "ON" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "o" - DOT "." - NAME_REF - IDENT "order_id" + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "po" + DOT "." + NAME_REF + IDENT "order_id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "o" + DOT "." + NAME_REF + IDENT "order_id" WHITESPACE "\n" WHERE_CLAUSE WHERE_KW "WHERE" @@ -6062,25 +6114,27 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "solar_panel_metrics" - WHITESPACE "\n" - JOIN - JOIN_KW "JOIN" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "panel_specifications" - WHITESPACE " " - ON_KW "ON" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "panel_id" + IDENT "solar_panel_metrics" + WHITESPACE "\n" + JOIN + JOIN_KW "JOIN" WHITESPACE " " - EQ "=" + FROM_ITEM + NAME_REF + IDENT "panel_specifications" WHITESPACE " " - NAME_REF - IDENT "specs_id" + ON_KW "ON" + WHITESPACE " " + BIN_EXPR + NAME_REF + IDENT "panel_id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + NAME_REF + IDENT "specs_id" WHITESPACE "\n" WHERE_CLAUSE WHERE_KW "WHERE" @@ -6102,7 +6156,7 @@ SOURCE_FILE MINUS "-" WHITESPACE " " CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "INTERVAL" WHITESPACE " " LITERAL @@ -6195,8 +6249,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "turbine_metrics" + FROM_ITEM + NAME_REF + IDENT "turbine_metrics" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -6218,7 +6273,7 @@ SOURCE_FILE MINUS "-" WHITESPACE " " CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "INTERVAL" WHITESPACE " " LITERAL @@ -6295,32 +6350,34 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "turbine_metrics" - WHITESPACE " " - ALIAS - NAME - IDENT "t" - WHITESPACE "\n" - JOIN - JOIN_KW "JOIN" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "baseline_stats" + IDENT "turbine_metrics" WHITESPACE " " ALIAS NAME - IDENT "b" - WHITESPACE " " - USING_CLAUSE - USING_KW "USING" + IDENT "t" + WHITESPACE "\n" + JOIN + JOIN_KW "JOIN" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "turbine_id" - R_PAREN ")" + FROM_ITEM + NAME_REF + IDENT "baseline_stats" + WHITESPACE " " + ALIAS + NAME + IDENT "b" + WHITESPACE " " + USING_CLAUSE + USING_KW "USING" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "turbine_id" + R_PAREN ")" WHITESPACE "\n" WHERE_CLAUSE WHERE_KW "WHERE" @@ -6343,7 +6400,7 @@ SOURCE_FILE MINUS "-" WHITESPACE " " CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "INTERVAL" WHITESPACE " " LITERAL @@ -6448,8 +6505,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "vpp_resources" + FROM_ITEM + NAME_REF + IDENT "vpp_resources" WHITESPACE "\n" WHERE_CLAUSE WHERE_KW "WHERE" @@ -6471,7 +6529,7 @@ SOURCE_FILE MINUS "-" WHITESPACE " " CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "INTERVAL" WHITESPACE " " LITERAL @@ -6588,8 +6646,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "energy_prices" + FROM_ITEM + NAME_REF + IDENT "energy_prices" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -6611,7 +6670,7 @@ SOURCE_FILE MINUS "-" WHITESPACE " " CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "INTERVAL" WHITESPACE " " LITERAL @@ -6699,8 +6758,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "price_analysis" + FROM_ITEM + NAME_REF + IDENT "price_analysis" WHITESPACE "\n" ORDER_BY_CLAUSE ORDER_KW "ORDER" diff --git a/crates/squawk_parser/tests/snapshots/tests__prepare_ok.snap b/crates/squawk_parser/tests/snapshots/tests__prepare_ok.snap index 52ca86f6..c3fdfa7b 100644 --- a/crates/squawk_parser/tests/snapshots/tests__prepare_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__prepare_ok.snap @@ -101,20 +101,22 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "users" - WHITESPACE " " - ALIAS - NAME - IDENT "u" + FROM_ITEM + NAME_REF + IDENT "users" + WHITESPACE " " + ALIAS + NAME + IDENT "u" COMMA "," WHITESPACE " " - NAME_REF - IDENT "logs" - WHITESPACE " " - ALIAS - NAME - IDENT "l" + FROM_ITEM + NAME_REF + IDENT "logs" + WHITESPACE " " + ALIAS + NAME + IDENT "l" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -204,8 +206,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- update" diff --git a/crates/squawk_parser/tests/snapshots/tests__regression_create_view.snap b/crates/squawk_parser/tests/snapshots/tests__regression_create_view.snap index 71c68ff0..8b8b76e2 100644 --- a/crates/squawk_parser/tests/snapshots/tests__regression_create_view.snap +++ b/crates/squawk_parser/tests/snapshots/tests__regression_create_view.snap @@ -2,28 +2,8 @@ source: crates/squawk_parser/tests/tests.rs input_file: crates/squawk_parser/tests/data/regression_suite/create_view.sql --- -ERROR@21388: expected SEMICOLON -ERROR@21391: expected command, found COLLATION_KW -ERROR@21401: expected command, found FOR_KW -ERROR@21405: expected command, found L_PAREN -ERROR@21406: expected command, found STRING -ERROR@21409: expected command, found COLON -ERROR@21410: expected command, found COLON -ERROR@21411: expected command, found TEXT_KW -ERROR@21415: expected command, found R_PAREN -ERROR@21417: expected command, found IDENT -ERROR@21420: expected command, found COMMA -ERROR@21424: expected command, found CURRENT_DATE_KW -ERROR@21437: expected command, found AS_KW -ERROR@21440: expected command, found IDENT -ERROR@21441: expected command, found COMMA -ERROR@21445: expected command, found LOCALTIMESTAMP_KW -ERROR@21459: expected command, found L_PAREN -ERROR@21460: expected command, found INT_NUMBER -ERROR@21461: expected command, found R_PAREN -ERROR@21463: expected command, found AS_KW -ERROR@21466: expected command, found IDENT -ERROR@21467: expected command, found COMMA +ERROR@21471: expected name +ERROR@21471: expected SEMICOLON ERROR@21471: expected command, found CAST_KW ERROR@21475: expected command, found L_PAREN ERROR@21476: expected command, found INT_NUMBER @@ -47,6 +27,7 @@ ERROR@21516: expected command, found AS_KW ERROR@21519: expected command, found IDENT ERROR@21912: missing comma ERROR@22280: expected R_PAREN +ERROR@22285: expected from item, got STRING ERROR@22285: expected SEMICOLON ERROR@22286: expected command, found STRING ERROR@22293: expected command, found R_PAREN diff --git a/crates/squawk_parser/tests/snapshots/tests__regression_domain.snap b/crates/squawk_parser/tests/snapshots/tests__regression_domain.snap deleted file mode 100644 index 4487a82f..00000000 --- a/crates/squawk_parser/tests/snapshots/tests__regression_domain.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: crates/squawk_parser/tests/tests.rs -input_file: crates/squawk_parser/tests/data/regression_suite/domain.sql ---- -ERROR@10394: expected EQ -ERROR@10394: expected SEMICOLON -ERROR@10394: expected command, found L_BRACK -ERROR@10395: expected command, found INT_NUMBER -ERROR@10396: expected command, found R_BRACK -ERROR@10398: expected command, found EQ -ERROR@10400: expected command, found ARRAY_KW -ERROR@10405: expected command, found L_BRACK -ERROR@10406: expected command, found INT_NUMBER -ERROR@10408: expected command, found R_BRACK diff --git a/crates/squawk_parser/tests/snapshots/tests__regression_strings.snap b/crates/squawk_parser/tests/snapshots/tests__regression_strings.snap index 7fd48401..911908e7 100644 --- a/crates/squawk_parser/tests/snapshots/tests__regression_strings.snap +++ b/crates/squawk_parser/tests/snapshots/tests__regression_strings.snap @@ -2,10 +2,6 @@ source: crates/squawk_parser/tests/tests.rs input_file: crates/squawk_parser/tests/data/regression_suite/strings.sql --- -ERROR@145: missing comma -ERROR@160: missing comma -ERROR@262: missing comma -ERROR@277: missing comma ERROR@466: expected column label, got BYTE_STRING ERROR@521: missing comma ERROR@529: expected column label, got BYTE_STRING @@ -168,6 +164,7 @@ ERROR@30096: expected command, found STRING ERROR@30103: expected command, found AS_KW ERROR@30106: expected command, found IDENT ERROR@31129: expected R_PAREN +ERROR@31134: expected from item, got ESC_STRING ERROR@31134: expected SEMICOLON ERROR@31135: expected command, found ESC_STRING ERROR@31151: expected command, found COLON @@ -175,6 +172,7 @@ ERROR@31152: expected command, found COLON ERROR@31153: expected command, found IDENT ERROR@31158: expected command, found R_PAREN ERROR@31196: expected R_PAREN +ERROR@31201: expected from item, got ESC_STRING ERROR@31201: expected SEMICOLON ERROR@31202: expected command, found ESC_STRING ERROR@31218: expected command, found COLON @@ -182,6 +180,7 @@ ERROR@31219: expected command, found COLON ERROR@31220: expected command, found IDENT ERROR@31225: expected command, found R_PAREN ERROR@31264: expected R_PAREN +ERROR@31269: expected from item, got ESC_STRING ERROR@31269: expected SEMICOLON ERROR@31270: expected command, found ESC_STRING ERROR@31286: expected command, found COLON diff --git a/crates/squawk_parser/tests/snapshots/tests__regression_suite_errors.snap b/crates/squawk_parser/tests/snapshots/tests__regression_suite_errors.snap index c0663c51..0783e340 100644 --- a/crates/squawk_parser/tests/snapshots/tests__regression_suite_errors.snap +++ b/crates/squawk_parser/tests/snapshots/tests__regression_suite_errors.snap @@ -2,8 +2,7 @@ source: crates/squawk_parser/tests/tests.rs expression: "out.join(\"\\n\")" --- -tests/snapshots/tests__regression_create_view.snap:254 -tests/snapshots/tests__regression_domain.snap:10 +tests/snapshots/tests__regression_create_view.snap:235 tests/snapshots/tests__regression_errors.snap:286 tests/snapshots/tests__regression_foreign_data.snap:51 tests/snapshots/tests__regression_foreign_key.snap:24 @@ -22,10 +21,10 @@ tests/snapshots/tests__regression_rules.snap:59 tests/snapshots/tests__regression_sqljson.snap:1073 tests/snapshots/tests__regression_sqljson_jsontable.snap:185 tests/snapshots/tests__regression_sqljson_queryfuncs.snap:51 -tests/snapshots/tests__regression_strings.snap:188 +tests/snapshots/tests__regression_strings.snap:187 tests/snapshots/tests__regression_subselect.snap:52 tests/snapshots/tests__regression_timestamp.snap:65 -tests/snapshots/tests__regression_timestamptz.snap:13 +tests/snapshots/tests__regression_timestamptz.snap:5 tests/snapshots/tests__regression_transactions.snap:114 tests/snapshots/tests__regression_triggers.snap:51 tests/snapshots/tests__regression_tsearch.snap:62 diff --git a/crates/squawk_parser/tests/snapshots/tests__regression_timestamptz.snap b/crates/squawk_parser/tests/snapshots/tests__regression_timestamptz.snap index b4a51da1..9b056a5d 100644 --- a/crates/squawk_parser/tests/snapshots/tests__regression_timestamptz.snap +++ b/crates/squawk_parser/tests/snapshots/tests__regression_timestamptz.snap @@ -2,14 +2,6 @@ source: crates/squawk_parser/tests/tests.rs input_file: crates/squawk_parser/tests/data/regression_suite/timestamptz.sql --- -ERROR@1583: expected SEMICOLON -ERROR@1593: expected AS_KW -ERROR@1593: expected L_PAREN -ERROR@1594: expected command, found ZONE_KW -ERROR@1598: expected SELECT, TABLE, VALUES, INSERT, UPDATE, DELETE, or MERGE statement -ERROR@1598: expected R_PAREN -ERROR@1598: expected DELETE, SELECT, TABLE, UPDATE, or MERGE, got: STRING -ERROR@1599: expected command, found STRING ERROR@28897: expected COMMA ERROR@28900: expected COMMA ERROR@29074: expected COMMA diff --git a/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap index cc55d9b4..f05bf655 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap @@ -801,7 +801,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + TIME_TYPE TIMESTAMP_KW "timestamp" WHITESPACE " " WITH_KW "with" @@ -824,7 +824,7 @@ SOURCE_FILE TARGET BIN_EXPR CAST_EXPR - NAME_REF + TIME_TYPE TIMESTAMP_KW "timestamp" WHITESPACE " " WITH_KW "with" @@ -857,7 +857,7 @@ SOURCE_FILE TARGET BIN_EXPR CAST_EXPR - NAME_REF + TIME_TYPE TIMESTAMP_KW "timestamp" WHITESPACE " " LITERAL @@ -885,7 +885,7 @@ SOURCE_FILE BIN_EXPR BIN_EXPR CAST_EXPR - NAME_REF + TIME_TYPE TIMESTAMP_KW "timestamp" WHITESPACE " " LITERAL @@ -922,7 +922,7 @@ SOURCE_FILE TARGET POSTFIX_EXPR CAST_EXPR - NAME_REF + TIME_TYPE TIME_KW "time" WHITESPACE " " WITH_KW "with" @@ -962,7 +962,7 @@ SOURCE_FILE TARGET POSTFIX_EXPR CAST_EXPR - NAME_REF + TIME_TYPE TIMESTAMP_KW "timestamp" WHITESPACE " " WITH_KW "with" @@ -1996,7 +1996,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2012,7 +2012,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2028,7 +2028,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2044,7 +2044,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2060,7 +2060,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2076,7 +2076,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2092,7 +2092,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2112,7 +2112,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2132,7 +2132,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2152,7 +2152,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2172,7 +2172,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2196,7 +2196,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2216,7 +2216,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2236,7 +2236,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2260,7 +2260,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL @@ -2280,7 +2280,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - NAME_REF + INTERVAL_TYPE INTERVAL_KW "interval" WHITESPACE " " LITERAL diff --git a/crates/squawk_parser/tests/snapshots/tests__select_compound_union_select_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_compound_union_select_ok.snap index c42d3da6..53a18fd0 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_compound_union_select_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_compound_union_select_ok.snap @@ -1,7 +1,6 @@ --- source: crates/squawk_parser/tests/tests.rs input_file: crates/squawk_parser/tests/data/ok/select_compound_union_select.sql -snapshot_kind: text --- SOURCE_FILE SELECT @@ -28,8 +27,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "code_categories" + FROM_ITEM + NAME_REF + IDENT "code_categories" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -89,8 +89,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "code_categories" + FROM_ITEM + NAME_REF + IDENT "code_categories" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -156,8 +157,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "code_categories" + FROM_ITEM + NAME_REF + IDENT "code_categories" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -215,8 +217,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "code_categories" + FROM_ITEM + NAME_REF + IDENT "code_categories" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_cte_err.snap b/crates/squawk_parser/tests/snapshots/tests__select_cte_err.snap index 34debfc9..324432cd 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_cte_err.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_cte_err.snap @@ -1,7 +1,6 @@ --- source: crates/squawk_parser/tests/tests.rs input_file: crates/squawk_parser/tests/data/err/select_cte.sql -snapshot_kind: text --- SOURCE_FILE SELECT @@ -41,8 +40,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n" --- diff --git a/crates/squawk_parser/tests/snapshots/tests__select_cte_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_cte_ok.snap index c745ec0f..74473581 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_cte_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_cte_ok.snap @@ -61,8 +61,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- with_values" @@ -99,8 +100,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- with" @@ -140,8 +142,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- column names" @@ -195,8 +198,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- materialized " @@ -236,8 +240,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- not materialized " @@ -279,8 +284,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- nested" @@ -348,8 +354,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE "\n" R_PAREN ")" SEMICOLON ";" @@ -421,12 +428,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "tree" - WHITESPACE " " - ALIAS - NAME - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "tree" + WHITESPACE " " + ALIAS + NAME + IDENT "t" WHITESPACE "\n " UNION_KW "UNION" WHITESPACE " " @@ -466,20 +474,22 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "tree" - WHITESPACE " " - ALIAS - NAME - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "tree" + WHITESPACE " " + ALIAS + NAME + IDENT "t" COMMA "," WHITESPACE " " - NAME_REF - IDENT "search_tree" - WHITESPACE " " - ALIAS - NAME - IDENT "st" + FROM_ITEM + NAME_REF + IDENT "search_tree" + WHITESPACE " " + ALIAS + NAME + IDENT "st" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -529,8 +539,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "search_tree" + FROM_ITEM + NAME_REF + IDENT "search_tree" WHITESPACE " " ORDER_BY_CLAUSE ORDER_KW "ORDER" @@ -608,12 +619,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "tree" - WHITESPACE " " - ALIAS - NAME - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "tree" + WHITESPACE " " + ALIAS + NAME + IDENT "t" WHITESPACE "\n " UNION_KW "UNION" WHITESPACE " " @@ -653,20 +665,22 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "tree" - WHITESPACE " " - ALIAS - NAME - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "tree" + WHITESPACE " " + ALIAS + NAME + IDENT "t" COMMA "," WHITESPACE " " - NAME_REF - IDENT "search_tree" - WHITESPACE " " - ALIAS - NAME - IDENT "st" + FROM_ITEM + NAME_REF + IDENT "search_tree" + WHITESPACE " " + ALIAS + NAME + IDENT "st" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -716,8 +730,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "search_tree" + FROM_ITEM + NAME_REF + IDENT "search_tree" WHITESPACE " " ORDER_BY_CLAUSE ORDER_KW "ORDER" @@ -805,12 +820,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "graph" - WHITESPACE " " - ALIAS - NAME - IDENT "g" + FROM_ITEM + NAME_REF + IDENT "graph" + WHITESPACE " " + ALIAS + NAME + IDENT "g" WHITESPACE "\n " UNION_KW "UNION" WHITESPACE " " @@ -865,20 +881,22 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "graph" - WHITESPACE " " - ALIAS - NAME - IDENT "g" + FROM_ITEM + NAME_REF + IDENT "graph" + WHITESPACE " " + ALIAS + NAME + IDENT "g" COMMA "," WHITESPACE " " - NAME_REF - IDENT "search_graph" - WHITESPACE " " - ALIAS - NAME - IDENT "sg" + FROM_ITEM + NAME_REF + IDENT "search_graph" + WHITESPACE " " + ALIAS + NAME + IDENT "sg" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -927,8 +945,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "search_graph" + FROM_ITEM + NAME_REF + IDENT "search_graph" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- search cycle with to and default values" @@ -1019,8 +1038,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "search_graph" + FROM_ITEM + NAME_REF + IDENT "search_graph" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- multi" @@ -1078,12 +1098,14 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" COMMA "," WHITESPACE " " - NAME_REF - IDENT "b" + FROM_ITEM + NAME_REF + IDENT "b" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- recursive" @@ -1123,8 +1145,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -1172,8 +1195,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE "\n" R_PAREN ")" WHITESPACE "\n" @@ -1187,8 +1211,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t2" + FROM_ITEM + NAME_REF + IDENT "t2" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- timestamp_edge_cases" @@ -1231,8 +1256,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -1273,8 +1299,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n\n" COMMENT "-- regression gh issue #509" @@ -1341,12 +1368,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "public" - DOT "." - NAME_REF - IDENT "notification" + FROM_ITEM + FIELD_EXPR + NAME_REF + IDENT "public" + DOT "." + NAME_REF + IDENT "notification" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -1409,8 +1437,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "ranked_notifications" + FROM_ITEM + NAME_REF + IDENT "ranked_notifications" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_err.snap b/crates/squawk_parser/tests/snapshots/tests__select_err.snap index c94f939d..5cd7b14b 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_err.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_err.snap @@ -70,22 +70,23 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE " " - NAME - IDENT "u" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - ERROR - COMMA "," - R_PAREN ")" + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "u" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + ERROR + COMMA "," + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- missing comma" @@ -119,8 +120,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n" COMMENT "-- ^ ^ comma missing" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap index e306d753..4040b208 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap @@ -2187,8 +2187,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -2218,8 +2219,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "u" + FROM_ITEM + NAME_REF + IDENT "u" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -2471,8 +2473,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE " " WHERE_CLAUSE WHERE_KW "where" @@ -2530,8 +2533,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -2571,8 +2575,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE " " WHERE_CLAUSE WHERE_KW "where" @@ -2948,7 +2953,7 @@ SOURCE_FILE FROM_KW "from" WHITESPACE " " CAST_EXPR - NAME_REF + TIME_TYPE TIMESTAMP_KW "timestamp" WHITESPACE " " LITERAL @@ -2972,7 +2977,7 @@ SOURCE_FILE FROM_KW "from" WHITESPACE " " CAST_EXPR - NAME_REF + TIME_TYPE TIMESTAMP_KW "timestamp" WHITESPACE " " LITERAL @@ -3044,7 +3049,7 @@ SOURCE_FILE FROM_KW "from" WHITESPACE " " CAST_EXPR - NAME_REF + TIME_TYPE TIME_KW "time" WHITESPACE " " LITERAL @@ -3068,7 +3073,7 @@ SOURCE_FILE FROM_KW "from" WHITESPACE " " CAST_EXPR - NAME_REF + TIME_TYPE TIMESTAMP_KW "timestamp" WHITESPACE " " LITERAL @@ -3092,7 +3097,7 @@ SOURCE_FILE FROM_KW "from" WHITESPACE " " CAST_EXPR - NAME_REF + TIME_TYPE TIMESTAMP_KW "timestamp" WHITESPACE " " LITERAL @@ -3250,8 +3255,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "vals" + FROM_ITEM + NAME_REF + IDENT "vals" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- order by param 2" @@ -3286,8 +3292,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "vals" + FROM_ITEM + NAME_REF + IDENT "vals" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- order by param 2 const" @@ -3322,8 +3329,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- order by param 1" @@ -3358,8 +3366,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "\"table\"" + FROM_ITEM + NAME_REF + IDENT "\"table\"" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- within group" @@ -3397,8 +3406,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- filter expr simple" @@ -3436,8 +3446,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- filter expr" @@ -3495,30 +3506,31 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "generate_series" - ARG_LIST - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "10" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "generate_series" + ARG_LIST + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "10" + R_PAREN ")" WHITESPACE " " - NAME - IDENT "s" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "i" - R_PAREN ")" + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "s" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "i" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -3763,8 +3775,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- window name" @@ -3793,7 +3806,8 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_funcs_pg17_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_funcs_pg17_ok.snap index f7bd692c..a090f704 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_funcs_pg17_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_funcs_pg17_ok.snap @@ -1,7 +1,6 @@ --- source: crates/squawk_parser/tests/tests.rs input_file: crates/squawk_parser/tests/data/ok/select_funcs_pg17.sql -snapshot_kind: text --- SOURCE_FILE WHITESPACE "\n" @@ -22,94 +21,96 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE "\n " - NAME_REF - IDENT "my_films" + FROM_ITEM + NAME_REF + IDENT "my_films" COMMA "," WHITESPACE "\n " - CALL_EXPR - NAME_REF - JSON_TABLE_KW "JSON_TABLE" - WHITESPACE " " - ARG_LIST - L_PAREN "(" + FROM_ITEM + CALL_EXPR NAME_REF - IDENT "js" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'$.favorites[*]'" - WHITESPACE " " - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "id" - WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "kind" + JSON_TABLE_KW "JSON_TABLE" WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.kind'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "title" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.films[*].title'" - WHITESPACE " " - WITH_KW "WITH" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "js" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'$.favorites[*]'" + WHITESPACE " " + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + NAME + IDENT "id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + NAME + IDENT "kind" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.kind'" + COMMA "," + WHITESPACE "\n " + NAME + IDENT "title" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.films[*].title'" + WHITESPACE " " + WITH_KW "WITH" + WHITESPACE " " + WRAPPER_KW "WRAPPER" + COMMA "," + WHITESPACE "\n " + NAME + IDENT "director" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.films[*].director'" + WHITESPACE " " + WITH_KW "WITH" + WHITESPACE " " + WRAPPER_KW "WRAPPER" + R_PAREN ")" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "AS" WHITESPACE " " - WRAPPER_KW "WRAPPER" - COMMA "," - WHITESPACE "\n " NAME - IDENT "director" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.films[*].director'" - WHITESPACE " " - WITH_KW "WITH" - WHITESPACE " " - WRAPPER_KW "WRAPPER" - R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "jt" + IDENT "jt" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- json_table_nested_path" @@ -129,122 +130,124 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE "\n " - NAME_REF - IDENT "my_films" + FROM_ITEM + NAME_REF + IDENT "my_films" COMMA "," WHITESPACE "\n " - CALL_EXPR - NAME_REF - JSON_TABLE_KW "JSON_TABLE" - WHITESPACE " " - ARG_LIST - L_PAREN "(" - WHITESPACE " " + FROM_ITEM + CALL_EXPR NAME_REF - IDENT "js" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'$.favorites[*] ? (@.films[*].director == $filter)'" - WHITESPACE "\n " - PASSING_KW "PASSING" + JSON_TABLE_KW "JSON_TABLE" WHITESPACE " " - LITERAL - STRING "'Alfred Hitchcock'" - WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - FILTER_KW "filter" - WHITESPACE "\n " - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "id" - WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "kind" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.kind'" - COMMA "," - WHITESPACE "\n " - NESTED_KW "NESTED" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.films[*]'" - WHITESPACE " " - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "title" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "FORMAT" + ARG_LIST + L_PAREN "(" WHITESPACE " " - JSON_KW "JSON" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.title'" - WHITESPACE " " - OMIT_KW "OMIT" + NAME_REF + IDENT "js" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'$.favorites[*] ? (@.films[*].director == $filter)'" + WHITESPACE "\n " + PASSING_KW "PASSING" + WHITESPACE " " + LITERAL + STRING "'Alfred Hitchcock'" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + FILTER_KW "filter" + WHITESPACE "\n " + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + NAME + IDENT "id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + NAME + IDENT "kind" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.kind'" + COMMA "," + WHITESPACE "\n " + NESTED_KW "NESTED" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.films[*]'" + WHITESPACE " " + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + NAME + IDENT "title" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "FORMAT" + WHITESPACE " " + JSON_KW "JSON" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.title'" + WHITESPACE " " + OMIT_KW "OMIT" + WHITESPACE " " + QUOTES_KW "QUOTES" + COMMA "," + WHITESPACE "\n " + NAME + IDENT "director" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.director'" + WHITESPACE " " + KEEP_KW "KEEP" + WHITESPACE " " + QUOTES_KW "QUOTES" + R_PAREN ")" + R_PAREN ")" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "AS" WHITESPACE " " - QUOTES_KW "QUOTES" - COMMA "," - WHITESPACE "\n " NAME - IDENT "director" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.director'" - WHITESPACE " " - KEEP_KW "KEEP" - WHITESPACE " " - QUOTES_KW "QUOTES" - R_PAREN ")" - R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "jt" + IDENT "jt" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- json_table_without_filter" @@ -264,112 +267,114 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE "\n " - NAME_REF - IDENT "my_films" + FROM_ITEM + NAME_REF + IDENT "my_films" COMMA "," WHITESPACE "\n " - CALL_EXPR - NAME_REF - JSON_TABLE_KW "JSON_TABLE" - WHITESPACE " " - ARG_LIST - L_PAREN "(" - WHITESPACE " " + FROM_ITEM + CALL_EXPR NAME_REF - IDENT "js" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'$.favorites[*]'" - WHITESPACE "\n " - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "id" + JSON_TABLE_KW "JSON_TABLE" WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "kind" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.kind'" - COMMA "," - WHITESPACE "\n " - NESTED_KW "NESTED" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.films[*]'" - WHITESPACE " " - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "title" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "FORMAT" + ARG_LIST + L_PAREN "(" WHITESPACE " " - JSON_KW "JSON" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.title'" - WHITESPACE " " - OMIT_KW "OMIT" + NAME_REF + IDENT "js" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'$.favorites[*]'" + WHITESPACE "\n " + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + NAME + IDENT "id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + NAME + IDENT "kind" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.kind'" + COMMA "," + WHITESPACE "\n " + NESTED_KW "NESTED" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.films[*]'" + WHITESPACE " " + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + NAME + IDENT "title" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "FORMAT" + WHITESPACE " " + JSON_KW "JSON" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.title'" + WHITESPACE " " + OMIT_KW "OMIT" + WHITESPACE " " + QUOTES_KW "QUOTES" + COMMA "," + WHITESPACE "\n " + NAME + IDENT "director" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.director'" + WHITESPACE " " + KEEP_KW "KEEP" + WHITESPACE " " + QUOTES_KW "QUOTES" + R_PAREN ")" + R_PAREN ")" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "AS" WHITESPACE " " - QUOTES_KW "QUOTES" - COMMA "," - WHITESPACE "\n " NAME - IDENT "director" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.director'" - WHITESPACE " " - KEEP_KW "KEEP" - WHITESPACE " " - QUOTES_KW "QUOTES" - R_PAREN ")" - R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "jt" + IDENT "jt" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- json_table_union" @@ -385,148 +390,149 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - CALL_EXPR - NAME_REF - JSON_TABLE_KW "JSON_TABLE" - WHITESPACE " " - ARG_LIST - L_PAREN "(" - WHITESPACE "\n" - CAST_EXPR + FROM_ITEM + CALL_EXPR + NAME_REF + JSON_TABLE_KW "JSON_TABLE" + WHITESPACE " " + ARG_LIST + L_PAREN "(" + WHITESPACE "\n" + CAST_EXPR + LITERAL + STRING "'{\"favorites\":\n {\"movies\":\n [{\"name\": \"One\", \"director\": \"John Doe\"},\n {\"name\": \"Two\", \"director\": \"Don Joe\"}],\n \"books\":\n [{\"name\": \"Mystery\", \"authors\": [{\"name\": \"Brown Dan\"}]},\n {\"name\": \"Wonder\", \"authors\": [{\"name\": \"Jun Murakami\"}, {\"name\":\"Craig Doe\"}]}]\n}}'" + COLON_COLON "::" + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + JSON_KW "json" + COMMA "," + WHITESPACE " " LITERAL - STRING "'{\"favorites\":\n {\"movies\":\n [{\"name\": \"One\", \"director\": \"John Doe\"},\n {\"name\": \"Two\", \"director\": \"Don Joe\"}],\n \"books\":\n [{\"name\": \"Mystery\", \"authors\": [{\"name\": \"Brown Dan\"}]},\n {\"name\": \"Wonder\", \"authors\": [{\"name\": \"Jun Murakami\"}, {\"name\":\"Craig Doe\"}]}]\n}}'" - COLON_COLON "::" + STRING "'$.favorites[*]'" + WHITESPACE "\n" + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + NAME + IDENT "user_id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + NESTED_KW "NESTED" + WHITESPACE " " + LITERAL + STRING "'$.movies[*]'" + WHITESPACE "\n " + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + NAME + IDENT "movie_id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + NAME + IDENT "mname" + WHITESPACE " " PATH_TYPE PATH PATH_SEGMENT NAME_REF - JSON_KW "json" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'$.favorites[*]'" - WHITESPACE "\n" - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "user_id" - WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - NESTED_KW "NESTED" - WHITESPACE " " - LITERAL - STRING "'$.movies[*]'" - WHITESPACE "\n " - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "movie_id" - WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "mname" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.name'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "director" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - R_PAREN ")" - COMMA "," - WHITESPACE "\n " - NESTED_KW "NESTED" - WHITESPACE " " - LITERAL - STRING "'$.books[*]'" - WHITESPACE "\n " - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "book_id" - WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "bname" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.name'" - COMMA "," - WHITESPACE "\n " - NESTED_KW "NESTED" - WHITESPACE " " - LITERAL - STRING "'$.authors[*]'" - WHITESPACE "\n " - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "author_id" - WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "author_name" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.name'" - R_PAREN ")" - R_PAREN ")" - R_PAREN ")" - R_PAREN ")" + TEXT_KW "text" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.name'" + COMMA "," + WHITESPACE "\n " + NAME + IDENT "director" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + NESTED_KW "NESTED" + WHITESPACE " " + LITERAL + STRING "'$.books[*]'" + WHITESPACE "\n " + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + NAME + IDENT "book_id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + NAME + IDENT "bname" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.name'" + COMMA "," + WHITESPACE "\n " + NESTED_KW "NESTED" + WHITESPACE " " + LITERAL + STRING "'$.authors[*]'" + WHITESPACE "\n " + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + NAME + IDENT "author_id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + NAME + IDENT "author_name" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.name'" + R_PAREN ")" + R_PAREN ")" + R_PAREN ")" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- json" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_into_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_into_ok.snap index 4f1c359d..e61ee7a6 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_into_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_into_ok.snap @@ -24,8 +24,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "films" + FROM_ITEM + NAME_REF + IDENT "films" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -72,7 +73,8 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t2" + FROM_ITEM + NAME_REF + IDENT "t2" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_ok.snap index b2cfb600..845f1766 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_ok.snap @@ -151,49 +151,50 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "2" - COMMA "," + FROM_ITEM + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "3" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "3" + R_PAREN ")" WHITESPACE " " - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" - COMMA "," + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "c" - R_PAREN ")" + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" COMMENT "-- from alias" @@ -210,14 +211,15 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "bar" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + NAME_REF + IDENT "bar" WHITESPACE " " - NAME - IDENT "t" + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- non-ident column and table names" @@ -233,44 +235,45 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "2" - COMMA "," + FROM_ITEM + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "3" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "3" + R_PAREN ")" WHITESPACE " " - NAME - TARGET_KW "target" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - TARGET_KW "target" - COMMA "," + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - FUNCTION_KW "function" - R_PAREN ")" + NAME + TARGET_KW "target" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + TARGET_KW "target" + COMMA "," + WHITESPACE " " + COLUMN + NAME + FUNCTION_KW "function" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" COMMENT "-- from column aliases" @@ -287,25 +290,26 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "bar" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + NAME_REF + IDENT "bar" WHITESPACE " " - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "col1" - COMMA "," + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "col2" - R_PAREN ")" + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "col1" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "col2" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- w/o as" @@ -321,42 +325,43 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "3" - R_PAREN ")" - WHITESPACE " " - ALIAS - NAME - TARGET_KW "target" - COLUMN_LIST + FROM_ITEM + PAREN_EXPR L_PAREN "(" - COLUMN - NAME - TARGET_KW "target" - COMMA "," - WHITESPACE " " - COLUMN - NAME - FUNCTION_KW "function" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "3" R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + TARGET_KW "target" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + TARGET_KW "target" + COMMA "," + WHITESPACE " " + COLUMN + NAME + FUNCTION_KW "function" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" COMMENT "-- from alias shorthand" @@ -376,12 +381,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "bar" - WHITESPACE " " - ALIAS - NAME - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "bar" + WHITESPACE " " + ALIAS + NAME + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- date_funcs" @@ -535,8 +541,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "pg_proc" + FROM_ITEM + NAME_REF + IDENT "pg_proc" WHITESPACE " " WHERE_CLAUSE WHERE_KW "where" @@ -575,8 +582,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE " " WHERE_CLAUSE WHERE_KW "where" @@ -606,8 +614,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE " " WHERE_CLAUSE WHERE_KW "where" @@ -640,8 +649,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE " " WHERE_CLAUSE WHERE_KW "where" @@ -672,8 +682,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE " " WHERE_CLAUSE WHERE_KW "where" @@ -779,8 +790,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -887,8 +899,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE "\n" WHERE_CLAUSE WHERE_KW "where" @@ -939,8 +952,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE " " WHERE_CLAUSE WHERE_KW "where" @@ -1162,8 +1176,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- generic conditional case" @@ -1226,8 +1241,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "test" + FROM_ITEM + NAME_REF + IDENT "test" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- ommitted else" @@ -1285,8 +1301,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "test" + FROM_ITEM + NAME_REF + IDENT "test" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- switch style case" @@ -1340,8 +1357,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "test" + FROM_ITEM + NAME_REF + IDENT "test" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- col_labels" @@ -1363,8 +1381,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -1382,8 +1401,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -1414,8 +1434,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- select" @@ -1476,8 +1497,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- select_with_from_clause" @@ -1496,8 +1518,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "bar" + FROM_ITEM + NAME_REF + IDENT "bar" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- from only" @@ -1514,10 +1537,11 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - ONLY_KW "only" - WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + ONLY_KW "only" + WHITESPACE " " + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- from field expr" @@ -1534,12 +1558,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "foo" - DOT "." - NAME_REF - IDENT "bar" + FROM_ITEM + FIELD_EXPR + NAME_REF + IDENT "foo" + DOT "." + NAME_REF + IDENT "bar" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- from with everything" @@ -1555,60 +1580,61 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - STAR "*" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE " " - NAME - IDENT "r" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," + STAR "*" + WHITESPACE " " + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "b" - COMMA "," + NAME + IDENT "r" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" + WHITESPACE " " + TABLESAMPLE_KW "tablesample" + WHITESPACE " " + CALL_EXPR + NAME_REF + IDENT "sample_method" WHITESPACE " " - COLUMN - NAME - IDENT "c" - R_PAREN ")" - WHITESPACE " " - TABLESAMPLE_KW "tablesample" - WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "sample_method" + ARG_LIST + L_PAREN "(" + LITERAL + INT_NUMBER "10" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "23" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "50" + R_PAREN ")" WHITESPACE " " - ARG_LIST + REPEATABLE_KW "repeatable" + WHITESPACE " " + PAREN_EXPR L_PAREN "(" LITERAL - INT_NUMBER "10" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "23" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "50" + INT_NUMBER "42" R_PAREN ")" - WHITESPACE " " - REPEATABLE_KW "repeatable" - WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - LITERAL - INT_NUMBER "42" - R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- from select stmt" @@ -1624,17 +1650,18 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - R_PAREN ")" + FROM_ITEM + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -1648,41 +1675,42 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - LATERAL_KW "lateral" - WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + LATERAL_KW "lateral" WHITESPACE " " - NAME - IDENT "t" - COLUMN_LIST + PAREN_EXPR L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "c" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- function call complex" @@ -1704,39 +1732,40 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "foo" - ARG_LIST - L_PAREN "(" - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE " " + FROM_ITEM + CALL_EXPR NAME_REF - IDENT "buzz" - R_PAREN ")" - WHITESPACE " " - WITH_KW "with" - WHITESPACE " " - ORDINALITY_KW "ordinality" - WHITESPACE " " - ALIAS - AS_KW "as" + IDENT "foo" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE " " + NAME_REF + IDENT "buzz" + R_PAREN ")" WHITESPACE " " - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," + WITH_KW "with" + WHITESPACE " " + ORDINALITY_KW "ordinality" + WHITESPACE " " + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "b" - R_PAREN ")" + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -1756,37 +1785,38 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "foo" - ARG_LIST - L_PAREN "(" - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE " " + FROM_ITEM + CALL_EXPR NAME_REF - IDENT "buzz" - R_PAREN ")" - WHITESPACE " " - WITH_KW "with" - WHITESPACE " " - ORDINALITY_KW "ordinality" - WHITESPACE " " - ALIAS - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" - R_PAREN ")" + IDENT "foo" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE " " + NAME_REF + IDENT "buzz" + R_PAREN ")" + WHITESPACE " " + WITH_KW "with" + WHITESPACE " " + ORDINALITY_KW "ordinality" + WHITESPACE " " + ALIAS + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- function with alias" @@ -1802,24 +1832,25 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "foo" - ARG_LIST - L_PAREN "(" - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE " " + FROM_ITEM + CALL_EXPR NAME_REF - IDENT "buzz" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + IDENT "foo" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE " " + NAME_REF + IDENT "buzz" + R_PAREN ")" WHITESPACE " " - NAME - IDENT "t" + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "t" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -1833,64 +1864,23 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "foo" - ARG_LIST - L_PAREN "(" - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE " " + FROM_ITEM + CALL_EXPR NAME_REF - IDENT "buzz" - R_PAREN ")" - WHITESPACE " " - ALIAS - NAME - IDENT "t" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - STAR "*" - WHITESPACE " " - FROM_CLAUSE - FROM_KW "from" - WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "foo" - ARG_LIST - L_PAREN "(" - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE " " - NAME_REF - IDENT "buzz" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + IDENT "foo" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE " " + NAME_REF + IDENT "buzz" + R_PAREN ")" WHITESPACE " " - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" - R_PAREN ")" + ALIAS + NAME + IDENT "t" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -1904,36 +1894,37 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "foo" - ARG_LIST - L_PAREN "(" - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE " " + FROM_ITEM + CALL_EXPR NAME_REF - IDENT "buzz" - R_PAREN ")" - WHITESPACE " " - ALIAS - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," + IDENT "foo" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE " " + NAME_REF + IDENT "buzz" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "b" - R_PAREN ")" + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + R_PAREN ")" SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- function with column def" WHITESPACE "\n" SELECT SELECT_CLAUSE @@ -1946,42 +1937,37 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "json_to_record" - ARG_LIST - L_PAREN "(" - LITERAL - STRING "'{\"a\": 1, \"b\": \"c\"}'" - R_PAREN ")" - WHITESPACE " " - ALIAS - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "foo" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "bar" + COMMA "," WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - INT_KW "int" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" + NAME_REF + IDENT "buzz" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - R_PAREN ")" + COLUMN + NAME + IDENT "b" + R_PAREN ")" SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- function with column def" WHITESPACE "\n" SELECT SELECT_CLAUSE @@ -1994,41 +1980,42 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "json_to_record" + ARG_LIST + L_PAREN "(" + LITERAL + STRING "'{\"a\": 1, \"b\": \"c\"}'" + R_PAREN ")" WHITESPACE " " - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - INT_KW "int" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" + ALIAS + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + COMMA "," WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - R_PAREN ")" + COLUMN + NAME + IDENT "b" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2042,42 +2029,43 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - INT_KW "int" - COMMA "," + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "b" + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + COMMA "," WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - R_PAREN ")" + COLUMN + NAME + IDENT "b" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + R_PAREN ")" SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- function with collate" WHITESPACE "\n" SELECT SELECT_CLAUSE @@ -2090,58 +2078,43 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - INT_KW "int" - COMMA "," + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "b" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + COMMA "," WHITESPACE " " - COLLATE - COLLATE_KW "collate" + COLUMN + NAME + IDENT "b" WHITESPACE " " - PATH + PATH_TYPE PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." PATH_SEGMENT NAME_REF - IDENT "bar" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "buzz" - R_PAREN ")" + TEXT_KW "text" + R_PAREN ")" SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- function with collate" WHITESPACE "\n" SELECT SELECT_CLAUSE @@ -2154,50 +2127,59 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - INT_KW "int" - COMMA "," + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "b" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + COMMA "," WHITESPACE " " - COLLATE - COLLATE_KW "collate" + COLUMN + NAME + IDENT "b" WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF - IDENT "\"bar\"" - R_PAREN ")" + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + COLLATE + COLLATE_KW "collate" + WHITESPACE " " + PATH + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "bar" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "buzz" + R_PAREN ")" SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- multiple tables" WHITESPACE "\n" SELECT SELECT_CLAUSE @@ -2210,13 +2192,51 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "a" - COMMA "," - WHITESPACE " " - NAME_REF - IDENT "b" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "as" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + COLLATE + COLLATE_KW "collate" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "\"bar\"" + R_PAREN ")" SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- multiple tables" WHITESPACE "\n" SELECT SELECT_CLAUSE @@ -2229,20 +2249,14 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "bar" - WHITESPACE " " - ALIAS - NAME - IDENT "x" + FROM_ITEM + NAME_REF + IDENT "a" COMMA "," WHITESPACE " " - NAME_REF - IDENT "buzz" - WHITESPACE " " - ALIAS - NAME - IDENT "y" + FROM_ITEM + NAME_REF + IDENT "b" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2256,29 +2270,23 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "foo" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + NAME_REF + IDENT "bar" WHITESPACE " " - NAME - IDENT "f" + ALIAS + NAME + IDENT "x" COMMA "," WHITESPACE " " - NAME_REF - IDENT "boo" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + NAME_REF + IDENT "buzz" WHITESPACE " " - NAME - IDENT "b" + ALIAS + NAME + IDENT "y" SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- from_item" - WHITESPACE "\n\n" - COMMENT "-- table_name from_item" WHITESPACE "\n" SELECT SELECT_CLAUSE @@ -2291,33 +2299,31 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - ONLY_KW "only" - WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + NAME_REF + IDENT "foo" WHITESPACE " " - NAME - IDENT "z" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "b" - COMMA "," + NAME + IDENT "f" + COMMA "," + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "boo" + WHITESPACE " " + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "c" - R_PAREN ")" + NAME + IDENT "b" SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- from_item" + WHITESPACE "\n\n" + COMMENT "-- table_name from_item" WHITESPACE "\n" SELECT SELECT_CLAUSE @@ -2330,32 +2336,33 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - STAR "*" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + ONLY_KW "only" WHITESPACE " " - NAME - IDENT "z" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" - COMMA "," + NAME_REF + IDENT "t" + WHITESPACE " " + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "c" - R_PAREN ")" + NAME + IDENT "z" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2369,28 +2376,33 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - ALIAS - NAME - IDENT "z" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" - COMMA "," + FROM_ITEM + NAME_REF + IDENT "t" + WHITESPACE " " + STAR "*" + WHITESPACE " " + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "c" - R_PAREN ")" + NAME + IDENT "z" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2404,12 +2416,29 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - ALIAS - NAME - IDENT "z" + FROM_ITEM + NAME_REF + IDENT "t" + WHITESPACE " " + ALIAS + NAME + IDENT "z" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2423,16 +2452,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "foo" - DOT "." + FROM_ITEM NAME_REF IDENT "t" - WHITESPACE " " - ALIAS - NAME - IDENT "z" + WHITESPACE " " + ALIAS + NAME + IDENT "z" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2446,11 +2472,18 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + FIELD_EXPR + NAME_REF + IDENT "foo" + DOT "." + NAME_REF + IDENT "t" + WHITESPACE " " + ALIAS + NAME + IDENT "z" SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- with_query_name" WHITESPACE "\n" SELECT SELECT_CLAUSE @@ -2463,9 +2496,12 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- with_query_name" WHITESPACE "\n" SELECT SELECT_CLAUSE @@ -2478,30 +2514,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - ALIAS - AS_KW "as" - WHITESPACE " " - NAME - IDENT "b" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "x" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "y" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "z" - R_PAREN ")" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2515,14 +2530,31 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE " " - NAME - IDENT "b" + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "b" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "x" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "y" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "z" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2536,12 +2568,35 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" + WHITESPACE " " + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "b" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" WHITESPACE " " - ALIAS - NAME - IDENT "b" + TARGET_LIST + TARGET + STAR "*" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "t" + WHITESPACE " " + ALIAS + NAME + IDENT "b" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- lateral select" @@ -2557,41 +2612,42 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - LATERAL_KW "lateral" - WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + LATERAL_KW "lateral" WHITESPACE " " - NAME - IDENT "t" - COLUMN_LIST + PAREN_EXPR L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "c" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2605,39 +2661,40 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" - WHITESPACE " " - NAME - IDENT "t" - COLUMN_LIST + FROM_ITEM + PAREN_EXPR L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "c" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2651,21 +2708,22 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - R_PAREN ")" - WHITESPACE " " - ALIAS - NAME - IDENT "t" + FROM_ITEM + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "t" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2679,17 +2737,18 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - R_PAREN ")" + FROM_ITEM + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- lateral function_name" @@ -2705,14 +2764,15 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - LATERAL_KW "lateral" - WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" + FROM_ITEM + LATERAL_KW "lateral" + WHITESPACE " " + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2726,16 +2786,17 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - ALIAS - NAME - IDENT "t" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "t" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2749,38 +2810,39 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - WITH_KW "with" - WHITESPACE " " - ORDINALITY_KW "ordinality" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" WHITESPACE " " - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" - COMMA "," + WITH_KW "with" + WHITESPACE " " + ORDINALITY_KW "ordinality" + WHITESPACE " " + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "c" - R_PAREN ")" + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2794,34 +2856,35 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" - WHITESPACE " " - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" - COMMA "," + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "c" - R_PAREN ")" + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2835,32 +2898,33 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - ALIAS - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "c" - R_PAREN ")" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2874,20 +2938,21 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - LATERAL_KW "lateral" - WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - NAME_REF - IDENT "a" - COMMA "," - WHITESPACE " " + FROM_ITEM + LATERAL_KW "lateral" + WHITESPACE " " + CALL_EXPR NAME_REF - IDENT "b" - R_PAREN ")" + IDENT "f" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "a" + COMMA "," + WHITESPACE " " + NAME_REF + IDENT "b" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2901,41 +2966,42 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" WHITESPACE " " - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - INT_KW "int" - COMMA "," + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "b" + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + COMMA "," WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - R_PAREN ")" + COLUMN + NAME + IDENT "b" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -2949,39 +3015,40 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - WHITESPACE " " - ALIAS - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - INT_KW "int" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" + FROM_ITEM + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + COMMA "," WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - R_PAREN ")" + COLUMN + NAME + IDENT "b" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n\n" COMMENT "-- lateral rows from(" @@ -2997,63 +3064,64 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - LATERAL_KW "lateral" - WHITESPACE " " - ROWS_KW "rows" - WHITESPACE " " - FROM_KW "from" - L_PAREN "(" - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - NAME_REF - IDENT "a" - COMMA "," - WHITESPACE " " - NAME_REF - IDENT "b" - R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + LATERAL_KW "lateral" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "x" + ROWS_KW "rows" + WHITESPACE " " + FROM_KW "from" + L_PAREN "(" + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "a" + COMMA "," WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - INT_KW "int" - COMMA "," + NAME_REF + IDENT "b" + R_PAREN ")" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "as" WHITESPACE " " - COLUMN - NAME - IDENT "y" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "x" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + COMMA "," WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "z" + COLUMN + NAME + IDENT "y" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + COMMA "," WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "int8" - R_PAREN ")" + COLUMN + NAME + IDENT "z" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "int8" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -3067,47 +3135,24 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - ROWS_KW "rows" - WHITESPACE " " - FROM_KW "from" - L_PAREN "(" - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - NAME_REF - IDENT "a" - COMMA "," - WHITESPACE " " + FROM_ITEM + ROWS_KW "rows" + WHITESPACE " " + FROM_KW "from" + L_PAREN "(" + CALL_EXPR NAME_REF - IDENT "b" - R_PAREN ")" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - STAR "*" - WHITESPACE " " - FROM_CLAUSE - FROM_KW "from" - WHITESPACE " " - ROWS_KW "rows" - WHITESPACE " " - FROM_KW "from" - L_PAREN "(" - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - R_PAREN ")" + IDENT "f" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "a" + COMMA "," + WHITESPACE " " + NAME_REF + IDENT "b" + R_PAREN ")" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -3121,21 +3166,18 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - ROWS_KW "rows" - WHITESPACE " " - FROM_KW "from" - L_PAREN "(" - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - WITH_KW "with" - WHITESPACE " " - ORDINALITY_KW "ordinality" + FROM_ITEM + ROWS_KW "rows" + WHITESPACE " " + FROM_KW "from" + L_PAREN "(" + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -3149,27 +3191,22 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - ROWS_KW "rows" - WHITESPACE " " - FROM_KW "from" - L_PAREN "(" - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - WITH_KW "with" - WHITESPACE " " - ORDINALITY_KW "ordinality" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + ROWS_KW "rows" WHITESPACE " " - NAME - IDENT "t" + FROM_KW "from" + L_PAREN "(" + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" + R_PAREN ")" + WHITESPACE " " + WITH_KW "with" + WHITESPACE " " + ORDINALITY_KW "ordinality" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -3183,39 +3220,28 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - ROWS_KW "rows" - WHITESPACE " " - FROM_KW "from" - L_PAREN "(" - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + ROWS_KW "rows" WHITESPACE " " - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "c" - R_PAREN ")" + FROM_KW "from" + L_PAREN "(" + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" + R_PAREN ")" + WHITESPACE " " + WITH_KW "with" + WHITESPACE " " + ORDINALITY_KW "ordinality" + WHITESPACE " " + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "t" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -3229,37 +3255,85 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - ROWS_KW "rows" + FROM_ITEM + ROWS_KW "rows" + WHITESPACE " " + FROM_KW "from" + L_PAREN "(" + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" WHITESPACE " " + TARGET_LIST + TARGET + STAR "*" + WHITESPACE " " + FROM_CLAUSE FROM_KW "from" - L_PAREN "(" - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - R_PAREN ")" WHITESPACE " " - ALIAS - NAME - IDENT "t" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "b" - COMMA "," - WHITESPACE " " - COLUMN - NAME - IDENT "c" - R_PAREN ")" + FROM_ITEM + ROWS_KW "rows" + WHITESPACE " " + FROM_KW "from" + L_PAREN "(" + CALL_EXPR + NAME_REF + IDENT "f" + ARG_LIST + L_PAREN "(" + R_PAREN ")" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "t" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- select_with_where_clause" @@ -4214,8 +4288,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE " " WHERE_CLAUSE WHERE_KW "where" @@ -4306,39 +4381,41 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - JOIN - JOIN_KW "join" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "t2" + IDENT "t" WHITESPACE " " - ALIAS - AS_KW "as" + JOIN + JOIN_KW "join" WHITESPACE " " - NAME - IDENT "tb" - WHITESPACE " " - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR + FROM_ITEM NAME_REF - IDENT "tb" - DOT "." - NAME_REF - IDENT "id" + IDENT "t2" + WHITESPACE " " + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "tb" WHITESPACE " " - EQ "=" + ON_KW "on" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "id" + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "tb" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "id" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- left" @@ -4354,26 +4431,28 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - JOIN - LEFT_KW "left" - WHITESPACE " " - JOIN_KW "join" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "t2" + IDENT "t" WHITESPACE " " - USING_CLAUSE - USING_KW "using" + JOIN + LEFT_KW "left" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "id" - R_PAREN ")" + JOIN_KW "join" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "t2" + WHITESPACE " " + USING_CLAUSE + USING_KW "using" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "id" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -4387,31 +4466,33 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - JOIN - LEFT_KW "left" - WHITESPACE " " - JOIN_KW "join" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "t2" + IDENT "t" WHITESPACE " " - USING_CLAUSE - USING_KW "using" + JOIN + LEFT_KW "left" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "id" - COMMA "," + JOIN_KW "join" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "t2" + WHITESPACE " " + USING_CLAUSE + USING_KW "using" WHITESPACE " " - COLUMN - NAME_REF - IDENT "foo" - R_PAREN ")" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "id" + COMMA "," + WHITESPACE " " + COLUMN + NAME_REF + IDENT "foo" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- right" @@ -4427,26 +4508,28 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - JOIN - RIGHT_KW "right" - WHITESPACE " " - JOIN_KW "join" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "t2" + IDENT "t" WHITESPACE " " - USING_CLAUSE - USING_KW "using" + JOIN + RIGHT_KW "right" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "id" - R_PAREN ")" + JOIN_KW "join" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "t2" + WHITESPACE " " + USING_CLAUSE + USING_KW "using" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "id" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- full" @@ -4462,26 +4545,28 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - JOIN - FULL_KW "full" - WHITESPACE " " - JOIN_KW "join" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "t2" + IDENT "t" WHITESPACE " " - USING_CLAUSE - USING_KW "using" + JOIN + FULL_KW "full" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "id" - R_PAREN ")" + JOIN_KW "join" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "t2" + WHITESPACE " " + USING_CLAUSE + USING_KW "using" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "id" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- multi conditions" @@ -4497,53 +4582,55 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - JOIN - JOIN_KW "join" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "t2" - WHITESPACE " " - ON_KW "on" + IDENT "t" WHITESPACE " " - BIN_EXPR - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t2" - DOT "." - NAME_REF - IDENT "team_id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "team_id" + JOIN + JOIN_KW "join" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "t2" WHITESPACE " " - AND_KW "and" + ON_KW "on" WHITESPACE " " BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t2" - DOT "." - NAME_REF - IDENT "id" + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t2" + DOT "." + NAME_REF + IDENT "team_id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "team_id" WHITESPACE " " - EQ "=" + AND_KW "and" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "org_id" + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t2" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "org_id" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- nested joins" @@ -4570,64 +4657,68 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE "\n" - NAME_REF - IDENT "t1" - WHITESPACE " " - ALIAS - NAME - IDENT "x" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "x0" - COMMA "," - COLUMN - NAME - IDENT "x1" - R_PAREN ")" - WHITESPACE " " - JOIN - LEFT_KW "left" + FROM_ITEM + NAME_REF + IDENT "t1" WHITESPACE " " - JOIN_KW "join" + ALIAS + NAME + IDENT "x" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "x0" + COMMA "," + COLUMN + NAME + IDENT "x1" + R_PAREN ")" WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - NAME_REF - IDENT "t1" + JOIN + LEFT_KW "left" WHITESPACE " " - JOIN - LEFT_KW "left" - WHITESPACE " " - JOIN_KW "join" - WHITESPACE " " - NAME_REF - IDENT "t2" - WHITESPACE " " - USING_CLAUSE - USING_KW "using" - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "f1" - R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - ON_KW "on" - WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - BIN_EXPR - NAME_REF - IDENT "x0" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "0" - R_PAREN ")" + JOIN_KW "join" + WHITESPACE " " + FROM_ITEM + PAREN_EXPR + L_PAREN "(" + FROM_ITEM + NAME_REF + IDENT "t1" + WHITESPACE " " + JOIN + LEFT_KW "left" + WHITESPACE " " + JOIN_KW "join" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "t2" + WHITESPACE " " + USING_CLAUSE + USING_KW "using" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "f1" + R_PAREN ")" + R_PAREN ")" + WHITESPACE " " + ON_KW "on" + WHITESPACE " " + PAREN_EXPR + L_PAREN "(" + BIN_EXPR + NAME_REF + IDENT "x0" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "0" + R_PAREN ")" WHITESPACE "\n" GROUP_BY_CLAUSE GROUP_KW "group" @@ -4651,30 +4742,32 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - JOIN - JOIN_KW "join" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "t2" + IDENT "t" WHITESPACE " " - USING_CLAUSE - USING_KW "using" + JOIN + JOIN_KW "join" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "id" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "as" + FROM_ITEM + NAME_REF + IDENT "t2" WHITESPACE " " - NAME - IDENT "foo" + USING_CLAUSE + USING_KW "using" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "id" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "foo" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- cross join" @@ -4704,24 +4797,26 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "colors" - WHITESPACE " " - ALIAS - NAME - IDENT "c" - WHITESPACE " " - JOIN - CROSS_KW "CROSS" - WHITESPACE " " - JOIN_KW "JOIN" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "sizes" + IDENT "colors" WHITESPACE " " ALIAS NAME - IDENT "s" + IDENT "c" + WHITESPACE " " + JOIN + CROSS_KW "CROSS" + WHITESPACE " " + JOIN_KW "JOIN" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "sizes" + WHITESPACE " " + ALIAS + NAME + IDENT "s" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- inner join on true" @@ -4751,32 +4846,34 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "fruits" - WHITESPACE " " - ALIAS - NAME - IDENT "f" - WHITESPACE " " - JOIN - INNER_KW "inner" - WHITESPACE " " - JOIN_KW "join" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "colors" + IDENT "fruits" WHITESPACE " " ALIAS NAME - IDENT "c" - WHITESPACE " " - ON_KW "on" + IDENT "f" WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - LITERAL - TRUE_KW "true" - R_PAREN ")" + JOIN + INNER_KW "inner" + WHITESPACE " " + JOIN_KW "join" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "colors" + WHITESPACE " " + ALIAS + NAME + IDENT "c" + WHITESPACE " " + ON_KW "on" + WHITESPACE " " + PAREN_EXPR + L_PAREN "(" + LITERAL + TRUE_KW "true" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- multiple join clauses" @@ -4793,44 +4890,47 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE "\n" - JOIN - LEFT_KW "left" - WHITESPACE " " - JOIN_KW "join" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "u" - WHITESPACE " " - USING_CLAUSE - USING_KW "using" + IDENT "t" + WHITESPACE "\n" + JOIN + LEFT_KW "left" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "id" - R_PAREN ")" - WHITESPACE "\n" - JOIN - LEFT_KW "left" - WHITESPACE " " - JOIN_KW "join" - WHITESPACE " " - NAME_REF - IDENT "k" - WHITESPACE " " - USING_CLAUSE - USING_KW "using" + JOIN_KW "join" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - EVENT_KW "event" - R_PAREN ")" + FROM_ITEM + NAME_REF + IDENT "u" + WHITESPACE " " + USING_CLAUSE + USING_KW "using" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "id" + R_PAREN ")" + WHITESPACE "\n" + JOIN + LEFT_KW "left" + WHITESPACE " " + JOIN_KW "join" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "k" + WHITESPACE " " + USING_CLAUSE + USING_KW "using" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + EVENT_KW "event" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- natural" @@ -4846,16 +4946,18 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "employees" - WHITESPACE " " - JOIN - NATURAL_KW "NATURAL" - WHITESPACE " " - JOIN_KW "JOIN" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "departments" + IDENT "employees" + WHITESPACE " " + JOIN + NATURAL_KW "NATURAL" + WHITESPACE " " + JOIN_KW "JOIN" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "departments" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- pg docs" @@ -4914,32 +5016,34 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "distributors" - WHITESPACE " " - ALIAS - NAME - IDENT "d" - WHITESPACE " " - JOIN - JOIN_KW "JOIN" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "films" + IDENT "distributors" WHITESPACE " " ALIAS NAME - IDENT "f" + IDENT "d" WHITESPACE " " - USING_CLAUSE - USING_KW "USING" + JOIN + JOIN_KW "JOIN" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "did" - R_PAREN ")" + FROM_ITEM + NAME_REF + IDENT "films" + WHITESPACE " " + ALIAS + NAME + IDENT "f" + WHITESPACE " " + USING_CLAUSE + USING_KW "USING" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "did" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -4953,24 +5057,26 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" - WHITESPACE " " - JOIN - JOIN_KW "join" - WHITESPACE " " + FROM_ITEM NAME_REF - IDENT "t2" + IDENT "t" WHITESPACE " " - USING_CLAUSE - USING_KW "using" + JOIN + JOIN_KW "join" WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "a_id" - R_PAREN ")" + FROM_ITEM + NAME_REF + IDENT "t2" + WHITESPACE " " + USING_CLAUSE + USING_KW "using" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "a_id" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- lateral" @@ -5001,41 +5107,43 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "manufacturers" - WHITESPACE " " - ALIAS - NAME - IDENT "m" - WHITESPACE " " - JOIN - LEFT_KW "LEFT" - WHITESPACE " " - JOIN_KW "JOIN" - WHITESPACE " " - LATERAL_KW "LATERAL" - WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "get_product_names" - ARG_LIST - L_PAREN "(" - FIELD_EXPR - NAME_REF - IDENT "m" - DOT "." - NAME_REF - IDENT "id" - R_PAREN ")" + FROM_ITEM + NAME_REF + IDENT "manufacturers" WHITESPACE " " ALIAS NAME - IDENT "pname" - WHITESPACE " " - ON_KW "ON" + IDENT "m" WHITESPACE " " - LITERAL - TRUE_KW "true" + JOIN + LEFT_KW "LEFT" + WHITESPACE " " + JOIN_KW "JOIN" + WHITESPACE " " + FROM_ITEM + LATERAL_KW "LATERAL" + WHITESPACE " " + CALL_EXPR + NAME_REF + IDENT "get_product_names" + ARG_LIST + L_PAREN "(" + FIELD_EXPR + NAME_REF + IDENT "m" + DOT "." + NAME_REF + IDENT "id" + R_PAREN ")" + WHITESPACE " " + ALIAS + NAME + IDENT "pname" + WHITESPACE " " + ON_KW "ON" + WHITESPACE " " + LITERAL + TRUE_KW "true" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- table" @@ -5695,8 +5803,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE " " ORDER_BY_CLAUSE ORDER_KW "order" @@ -5780,8 +5889,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "sensors_uncompressed" + FROM_ITEM + NAME_REF + IDENT "sensors_uncompressed" WHITESPACE "\n" WHERE_CLAUSE WHERE_KW "WHERE" @@ -5863,8 +5973,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - USER_KW "user" + FROM_ITEM + NAME_REF + USER_KW "user" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- select with aggregates" @@ -5925,7 +6036,8 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "varchar_tbl" + FROM_ITEM + NAME_REF + IDENT "varchar_tbl" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_operators_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_operators_ok.snap index 654d6787..1b65bf3e 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_operators_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_operators_ok.snap @@ -1,7 +1,6 @@ --- source: crates/squawk_parser/tests/tests.rs input_file: crates/squawk_parser/tests/data/ok/select_operators.sql -snapshot_kind: text --- SOURCE_FILE COMMENT "-- logical_operators" @@ -3833,8 +3832,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -3861,8 +3861,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -3911,8 +3912,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -3945,8 +3947,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -3960,8 +3963,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t" + FROM_ITEM + NAME_REF + IDENT "t" WHITESPACE " " ORDER_BY_CLAUSE ORDER_KW "order" diff --git a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap index b76f359f..aeea4155 100644 --- a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap @@ -196,8 +196,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "t1" + FROM_ITEM + NAME_REF + IDENT "t1" WHITESPACE " " WHERE_CLAUSE WHERE_KW "where" @@ -321,12 +322,14 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - NAME_REF - IDENT "a" + FROM_ITEM + NAME_REF + IDENT "a" COMMA "," WHITESPACE " " - NAME_REF - IDENT "b" + FROM_ITEM + NAME_REF + IDENT "b" WHITESPACE "\n" WHERE_CLAUSE WHERE_KW "where" @@ -645,8 +648,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "accounts" + FROM_ITEM + NAME_REF + IDENT "accounts" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -733,8 +737,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "accounts" + FROM_ITEM + NAME_REF + IDENT "accounts" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -790,8 +795,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "employees" + FROM_ITEM + NAME_REF + IDENT "employees" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -846,8 +852,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "employees" + FROM_ITEM + NAME_REF + IDENT "employees" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" @@ -956,12 +963,13 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - DATA_KW "data" - WHITESPACE " " - ALIAS - NAME - IDENT "d" + FROM_ITEM + NAME_REF + DATA_KW "data" + WHITESPACE " " + ALIAS + NAME + IDENT "d" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -1133,14 +1141,15 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "work_item" - WHITESPACE " " - ALIAS - AS_KW "AS" + FROM_ITEM + NAME_REF + IDENT "work_item" WHITESPACE " " - NAME - IDENT "w" + ALIAS + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "w" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -1220,14 +1229,15 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "exceeded_max_retries" - WHITESPACE " " - ALIAS - AS_KW "AS" + FROM_ITEM + NAME_REF + IDENT "exceeded_max_retries" WHITESPACE " " - NAME - IDENT "emr" + ALIAS + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "emr" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" diff --git a/crates/squawk_parser/tests/snapshots/tests__values_ok.snap b/crates/squawk_parser/tests/snapshots/tests__values_ok.snap index 5c5194a6..5d6f1140 100644 --- a/crates/squawk_parser/tests/snapshots/tests__values_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__values_ok.snap @@ -187,55 +187,57 @@ 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" COMMA "," WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - VALUES - VALUES_KW "VALUES" - L_PAREN "(" - LITERAL - STRING "'MGM'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Horror'" - R_PAREN ")" - COMMA "," - WHITESPACE " " + FROM_ITEM + PAREN_EXPR L_PAREN "(" - LITERAL - STRING "'UA'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Sci-Fi'" + VALUES + VALUES_KW "VALUES" + L_PAREN "(" + LITERAL + STRING "'MGM'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Horror'" + R_PAREN ")" + COMMA "," + WHITESPACE " " + L_PAREN "(" + LITERAL + STRING "'UA'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Sci-Fi'" + R_PAREN ")" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "AS" WHITESPACE " " - NAME - IDENT "t" - WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "studio" - COMMA "," + ALIAS + AS_KW "AS" WHITESPACE " " - COLUMN - NAME - IDENT "kind" - R_PAREN ")" + NAME + IDENT "t" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "studio" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "kind" + R_PAREN ")" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "WHERE" @@ -312,60 +314,61 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - PAREN_EXPR - L_PAREN "(" - VALUES - VALUES_KW "VALUES" - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "200000" - COMMA "," - WHITESPACE " " - LITERAL - FLOAT_NUMBER "1.2" - R_PAREN ")" - COMMA "," - WHITESPACE " " + FROM_ITEM + PAREN_EXPR L_PAREN "(" - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "400000" - COMMA "," - WHITESPACE " " - LITERAL - FLOAT_NUMBER "1.4" + VALUES + VALUES_KW "VALUES" + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "200000" + COMMA "," + WHITESPACE " " + LITERAL + FLOAT_NUMBER "1.2" + R_PAREN ")" + COMMA "," + WHITESPACE " " + L_PAREN "(" + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "400000" + COMMA "," + WHITESPACE " " + LITERAL + FLOAT_NUMBER "1.4" + R_PAREN ")" R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "AS" WHITESPACE " " - NAME - IDENT "v" - WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME - IDENT "depno" - COMMA "," + ALIAS + AS_KW "AS" WHITESPACE " " - COLUMN - NAME - TARGET_KW "target" - COMMA "," + NAME + IDENT "v" WHITESPACE " " - COLUMN - NAME - IDENT "increase" - R_PAREN ")" + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "depno" + COMMA "," + WHITESPACE " " + COLUMN + NAME + TARGET_KW "target" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "increase" + R_PAREN ")" WHITESPACE "\n" WHERE_CLAUSE WHERE_KW "WHERE" @@ -421,8 +424,9 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - NAME_REF - IDENT "machines" + FROM_ITEM + NAME_REF + IDENT "machines" WHITESPACE "\n" WHERE_CLAUSE WHERE_KW "WHERE" diff --git a/crates/squawk_syntax/src/ast/generated/nodes.rs b/crates/squawk_syntax/src/ast/generated/nodes.rs index 597ec78c..69384472 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -4572,12 +4572,27 @@ pub struct FromClause { pub(crate) syntax: SyntaxNode, } impl FromClause { + #[inline] + pub fn from_items(&self) -> AstChildren { + support::children(&self.syntax) + } #[inline] pub fn from_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::FROM_KW) } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct FromItem { + pub(crate) syntax: SyntaxNode, +} +impl FromItem { + #[inline] + pub fn only_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ONLY_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct FuncOptionList { pub(crate) syntax: SyntaxNode, @@ -12356,6 +12371,24 @@ impl AstNode for FromClause { &self.syntax } } +impl AstNode for FromItem { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::FROM_ITEM + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for FuncOptionList { #[inline] fn can_cast(kind: SyntaxKind) -> bool { diff --git a/crates/squawk_syntax/src/postgresql.ungram b/crates/squawk_syntax/src/postgresql.ungram index 58860ba9..feb334fa 100644 --- a/crates/squawk_syntax/src/postgresql.ungram +++ b/crates/squawk_syntax/src/postgresql.ungram @@ -851,8 +851,12 @@ LockingClause = OrderByClause = 'order' 'by' +FromItem = + 'only'? + FromClause = 'from' + (FromItem (',' FromItem)*) ConstraintIndexMethod = 'using' diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__validate_string_continuation_validation.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__validate_string_continuation_validation.snap new file mode 100644 index 00000000..9c90d36d --- /dev/null +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__validate_string_continuation_validation.snap @@ -0,0 +1,68 @@ +--- +source: crates/squawk_syntax/src/test.rs +input_file: crates/squawk_syntax/test_data/validation/validate_string_continuation.sql +--- +SOURCE_FILE@0..157 + SELECT@0..18 + SELECT_CLAUSE@0..18 + SELECT_KW@0..6 "select" + WHITESPACE@6..7 " " + TARGET_LIST@7..18 + TARGET@7..18 + LITERAL@7..18 + STRING@7..12 "'foo'" + WHITESPACE@12..13 " " + STRING@13..18 "'bar'" + SEMICOLON@18..19 ";" + WHITESPACE@19..20 "\n" + SELECT@20..52 + SELECT_CLAUSE@20..52 + SELECT_KW@20..26 "select" + WHITESPACE@26..27 " " + TARGET_LIST@27..52 + TARGET@27..52 + LITERAL@27..52 + STRING@27..32 "'foo'" + WHITESPACE@32..33 " " + COMMENT@33..46 "/* comment */" + WHITESPACE@46..47 " " + STRING@47..52 "'bar'" + SEMICOLON@52..53 ";" + WHITESPACE@53..54 "\n" + SELECT@54..119 + SELECT_CLAUSE@54..119 + SELECT_KW@54..60 "select" + WHITESPACE@60..61 " " + TARGET_LIST@61..119 + TARGET@61..119 + LITERAL@61..119 + STRING@61..68 "'hello'" + WHITESPACE@68..69 " " + COMMENT@69..82 "/* comment */" + WHITESPACE@82..83 " " + STRING@83..88 "'bar'" + WHITESPACE@88..89 " " + COMMENT@89..110 "/* another comment */" + WHITESPACE@110..111 " " + STRING@111..119 "' world'" + SEMICOLON@119..120 ";" + WHITESPACE@120..122 "\n\n" + SELECT@122..155 + SELECT_CLAUSE@122..155 + SELECT_KW@122..128 "select" + WHITESPACE@128..129 " " + TARGET_LIST@129..155 + TARGET@129..155 + LITERAL@129..155 + STRING@129..136 "'hello'" + WHITESPACE@136..137 " " + COMMENT@137..147 "-- comment" + WHITESPACE@147..148 "\n" + STRING@148..155 "'world'" + SEMICOLON@155..156 ";" + WHITESPACE@156..157 "\n" + +ERROR@33:46 "Comments between string literals are not allowed." +ERROR@69:82 "Comments between string literals are not allowed." +ERROR@89:110 "Comments between string literals are not allowed." +ERROR@137:147 "Comments between string literals are not allowed." diff --git a/crates/squawk_syntax/src/validation.rs b/crates/squawk_syntax/src/validation.rs index e4b43e93..027e6f23 100644 --- a/crates/squawk_syntax/src/validation.rs +++ b/crates/squawk_syntax/src/validation.rs @@ -8,7 +8,6 @@ use crate::ast::AstNode; use crate::{ast, match_ast, syntax_error::SyntaxError, SyntaxNode}; use rowan::TextRange; use squawk_parser::SyntaxKind::*; - pub(crate) fn validate(root: &SyntaxNode, errors: &mut Vec) { for node in root.descendants() { match_ast! { @@ -18,12 +17,60 @@ pub(crate) fn validate(root: &SyntaxNode, errors: &mut Vec) { ast::PrefixExpr(it) => validate_prefix_expr(it, errors), ast::ArrayExpr(it) => validate_array_expr(it, errors), ast::DropAggregate(it) => validate_drop_aggregate(it, errors), + ast::Literal(it) => validate_literal(it, errors), _ => (), } } } } +enum LookingFor { + OpeningString, + Comment, + ClosingString, +} +fn validate_literal(lit: ast::Literal, acc: &mut Vec) { + let mut state = LookingFor::OpeningString; + let mut maybe_errors = vec![]; + let message = "Comments between string literals are not allowed."; + for e in lit.syntax().children_with_tokens() { + match e { + rowan::NodeOrToken::Node(_) => { + // not sure when this would occur + state = LookingFor::OpeningString; + } + rowan::NodeOrToken::Token(token) => { + if token.kind() == WHITESPACE { + continue; + } + match state { + LookingFor::OpeningString => { + if token.kind() == STRING { + state = LookingFor::Comment; + } + } + LookingFor::Comment => { + if token.kind() == COMMENT { + state = LookingFor::ClosingString; + maybe_errors.push(SyntaxError::new(message, token.text_range())); + } + } + LookingFor::ClosingString => { + if token.kind() == STRING { + acc.append(&mut maybe_errors); + state = LookingFor::Comment; + } else if token.kind() == COMMENT { + maybe_errors.push(SyntaxError::new(message, token.text_range())); + } else { + state = LookingFor::OpeningString; + } + } + } + } + } + } +} + fn validate_drop_aggregate(drop_agg: ast::DropAggregate, acc: &mut Vec) { for agg in drop_agg.aggregates() { validate_aggregate_params(agg.param_list(), acc); diff --git a/crates/squawk_syntax/test_data/validation/validate_string_continuation.sql b/crates/squawk_syntax/test_data/validation/validate_string_continuation.sql new file mode 100644 index 00000000..53c0ecd5 --- /dev/null +++ b/crates/squawk_syntax/test_data/validation/validate_string_continuation.sql @@ -0,0 +1,6 @@ +select 'foo' 'bar'; +select 'foo' /* comment */ 'bar'; +select 'hello' /* comment */ 'bar' /* another comment */ ' world'; + +select 'hello' -- comment +'world';