diff --git a/crates/squawk_parser/src/generated/syntax_kind.rs b/crates/squawk_parser/src/generated/syntax_kind.rs index d4253176..d5da5ed3 100644 --- a/crates/squawk_parser/src/generated/syntax_kind.rs +++ b/crates/squawk_parser/src/generated/syntax_kind.rs @@ -564,6 +564,9 @@ pub enum SyntaxKind { ERROR, IDENT, WHITESPACE, + ABSOLUTE, + ACCESS_EXCLUSIVE, + ACCESS_SHARE, ADD_ATTRIBUTE, ADD_COLUMN, ADD_CONSTRAINT, @@ -576,6 +579,7 @@ pub enum SyntaxKind { AFTER_VALUE, AGGREGATE, ALIAS, + ALL, ALL_FN, ALL_PROPERTIES, ALTER_AGGREGATE, @@ -642,6 +646,7 @@ pub enum SyntaxKind { ATTRIBUTE_OPTION, ATTRIBUTE_VALUE, AT_TIME_ZONE, + BACKWARD, BEFORE_VALUE, BEGIN, BEGIN_FUNC_OPTION_LIST, @@ -732,6 +737,7 @@ pub enum SyntaxKind { CREATE_USER, CREATE_USER_MAPPING, CREATE_VIEW, + CURRENT_ROW, CUSTOM_OP, DATABASE_OPTION, DATABASE_OPTION_LIST, @@ -831,11 +837,14 @@ pub enum SyntaxKind { EXCEPT_TABLES, EXCEPT_TABLE_CLAUSE, EXCLUDE_CONSTRAINT, + EXCLUSIVE, EXECUTE, EXISTS_FN, EXPLAIN, EXPR_AS_NAME, EXPR_AS_NAME_LIST, + EXPR_FOLLOWING, + EXPR_PRECEDING, EXPR_TYPE, EXTRACT_FN, FAT_ARROW, @@ -845,11 +854,19 @@ pub enum SyntaxKind { FETCH_CLAUSE, FIELD_EXPR, FILTER_CLAUSE, + FIRST, FORCE_RLS, FOREIGN_KEY_CONSTRAINT, + FORWARD, + FOR_KEY_SHARE, + FOR_NO_KEY_UPDATE, FOR_PORTION_OF, FOR_PROVIDER, + FOR_SHARE, + FOR_UPDATE, + FRAME_BETWEEN, FRAME_CLAUSE, + FRAME_EXCLUDE, FROM_CLAUSE, FROM_ITEM, FROM_TABLE, @@ -861,6 +878,7 @@ pub enum SyntaxKind { GRANT_DEFAULT_PRIVILEGES, GRAPH_PATTERN_QUALIFIER, GRAPH_TABLE_FN, + GROUP, GROUPING_CUBE, GROUPING_EXPR, GROUPING_ROLLUP, @@ -948,6 +966,7 @@ pub enum SyntaxKind { LABEL_AND_PROPERTIES, LABEL_AND_PROPERTIES_LIST, LANGUAGE_FUNC_OPTION, + LAST, LEAKPROOF_FUNC_OPTION, LIKE_CLAUSE, LIKE_OPTION, @@ -978,6 +997,7 @@ pub enum SyntaxKind { NAME_REF, NEQ, NEQB, + NEXT, NON_STANDARD_PARAM, NOTHING, NOTIFY, @@ -997,6 +1017,7 @@ pub enum SyntaxKind { NO_FORCE_RLS, NO_INHERIT, NO_INHERIT_TABLE, + NO_OTHERS, NO_PROPERTIES, NULLS_DISTINCT, NULLS_FIRST, @@ -1063,6 +1084,7 @@ pub enum SyntaxKind { PREPARE_TRANSACTION, PRESERVE_ROWS, PRIMARY_KEY_CONSTRAINT, + PRIOR, PRIVILEGES, PRIVILEGE_TARGET, PROPERTIES, @@ -1081,6 +1103,7 @@ pub enum SyntaxKind { REFRESH_VERSION, REINDEX, RELATION_NAME, + RELATIVE, RELEASE_SAVEPOINT, RENAME_ATTRIBUTE, RENAME_COLUMN, @@ -1115,7 +1138,9 @@ pub enum SyntaxKind { ROLLBACK, ROW, ROWS_FUNC_OPTION, + ROW_EXCLUSIVE, ROW_LIST, + ROW_SHARE, RULE_DO, RULE_ON, RULE_STMT_LIST, @@ -1129,6 +1154,7 @@ pub enum SyntaxKind { SEQUENCE_OPTION_LIST, SERIALIZABLE, SERVER_NAME, + SESSION_AUTHORIZATION, SET, SET_ACCESS_METHOD, SET_CLAUSE, @@ -1163,6 +1189,9 @@ pub enum SyntaxKind { SET_UNLOGGED, SET_WITHOUT_CLUSTER, SET_WITHOUT_OIDS, + SHARE, + SHARE_ROW_EXCLUSIVE, + SHARE_UPDATE_EXCLUSIVE, SHOW, SIMILAR_TO, SLICE_EXPR, @@ -1189,8 +1218,11 @@ pub enum SyntaxKind { TARGET, TARGET_LIST, TEMP, + TIES, TIME_TYPE, + TIME_ZONE, TIMING, + TRANSACTION_ISOLATION_LEVEL, TRANSACTION_MODE_LIST, TRANSFORM_FROM_FUNC, TRANSFORM_FUNC_OPTION, @@ -1201,6 +1233,8 @@ pub enum SyntaxKind { TRIM_FN, TRUNCATE, TUPLE_EXPR, + UNBOUNDED_FOLLOWING, + UNBOUNDED_PRECEDING, UNICODE_NORMAL_FORM, UNIQUE_CONSTRAINT, UNLISTEN, diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 5fb15ec6..495f8383 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -2832,17 +2832,32 @@ fn opt_into_clause(p: &mut Parser<'_>) -> Option { } } -fn lock_strength(p: &mut Parser<'_>) -> bool { - // NO KEY UPDATE - if p.eat(NO_KW) { - p.expect(KEY_KW); - p.expect(UPDATE_KW) - } else if p.eat(KEY_KW) { - p.expect(SHARE_KW) - } else if !p.eat(SHARE_KW) { - p.expect(UPDATE_KW) - } else { - false +fn lock_strength(p: &mut Parser<'_>) { + let m = p.start(); + match p.current() { + NO_KW => { + p.bump(NO_KW); + p.expect(KEY_KW); + p.expect(UPDATE_KW); + m.complete(p, FOR_NO_KEY_UPDATE); + } + KEY_KW => { + p.bump(KEY_KW); + p.expect(SHARE_KW); + m.complete(p, FOR_KEY_SHARE); + } + SHARE_KW => { + p.bump(SHARE_KW); + m.complete(p, FOR_SHARE); + } + UPDATE_KW => { + p.bump(UPDATE_KW); + m.complete(p, FOR_UPDATE); + } + _ => { + p.error("expected lock strength"); + m.abandon(p); + } } } @@ -4691,16 +4706,36 @@ fn opt_having_clause(p: &mut Parser<'_>) -> Option { // offset FOLLOWING fn frame_start_end(p: &mut Parser<'_>) { match (p.current(), p.nth(1)) { - (CURRENT_KW, ROW_KW) | (UNBOUNDED_KW, PRECEDING_KW | FOLLOWING_KW) => { - p.bump_any(); - p.bump_any(); + (CURRENT_KW, ROW_KW) => { + let m = p.start(); + p.bump(CURRENT_KW); + p.bump(ROW_KW); + m.complete(p, CURRENT_ROW); + } + (UNBOUNDED_KW, PRECEDING_KW) => { + let m = p.start(); + p.bump(UNBOUNDED_KW); + p.bump(PRECEDING_KW); + m.complete(p, UNBOUNDED_PRECEDING); + } + (UNBOUNDED_KW, FOLLOWING_KW) => { + let m = p.start(); + p.bump(UNBOUNDED_KW); + p.bump(FOLLOWING_KW); + m.complete(p, UNBOUNDED_FOLLOWING); } _ => { + let m = p.start(); expr(p); - if p.at(PRECEDING_KW) || p.at(FOLLOWING_KW) { - p.bump_any(); + if p.at(PRECEDING_KW) { + p.bump(PRECEDING_KW); + m.complete(p, EXPR_PRECEDING); + } else if p.at(FOLLOWING_KW) { + p.bump(FOLLOWING_KW); + m.complete(p, EXPR_FOLLOWING); } else { p.err_and_bump("expected preceding or following"); + m.abandon(p); } } } @@ -4711,21 +4746,40 @@ fn frame_start_end(p: &mut Parser<'_>) { // EXCLUDE GROUP // EXCLUDE TIES // EXCLUDE NO OTHERS -fn opt_frame_exclusion(p: &mut Parser<'_>) -> bool { - if !p.eat(EXCLUDE_KW) { - return false; +fn opt_frame_exclusion(p: &mut Parser<'_>) { + if !p.at(EXCLUDE_KW) { + return; } - if p.eat(CURRENT_KW) { - p.expect(ROW_KW) - } else if p.eat(NO_KW) { - p.expect(OTHERS_KW) - } else if p.at(GROUP_KW) || p.at(TIES_KW) { - p.bump_any(); - true - } else { - p.err_and_bump("expected `group`, `current row`, `ties`, or `no others`"); - false + let m = p.start(); + p.bump(EXCLUDE_KW); + match p.current() { + CURRENT_KW => { + let inner = p.start(); + p.bump(CURRENT_KW); + p.expect(ROW_KW); + inner.complete(p, CURRENT_ROW); + } + NO_KW => { + let inner = p.start(); + p.bump(NO_KW); + p.expect(OTHERS_KW); + inner.complete(p, NO_OTHERS); + } + GROUP_KW => { + let inner = p.start(); + p.bump(GROUP_KW); + inner.complete(p, GROUP); + } + TIES_KW => { + let inner = p.start(); + p.bump(TIES_KW); + inner.complete(p, TIES); + } + _ => { + p.err_and_bump("expected `group`, `current row`, `ties`, or `no others`"); + } } + m.complete(p, FRAME_EXCLUDE); } const WINDOW_DEF_START: TokenSet = @@ -4761,10 +4815,13 @@ fn opt_frame_clause(p: &mut Parser<'_>) { if p.at(RANGE_KW) || p.at(ROWS_KW) || p.at(GROUPS_KW) { let m = p.start(); p.bump_any(); - if p.eat(BETWEEN_KW) { + if p.at(BETWEEN_KW) { + let m = p.start(); + p.bump(BETWEEN_KW); frame_start_end(p); p.expect(AND_KW); frame_start_end(p); + m.complete(p, FRAME_BETWEEN); opt_frame_exclusion(p); } else { frame_start_end(p); @@ -11262,38 +11319,52 @@ fn lock(p: &mut Parser<'_>) -> CompletedMarker { table_list(p); // [ IN lockmode MODE ] if p.eat(IN_KW) { + let m = p.start(); match (p.current(), p.nth(1)) { - // ACCESS SHARE | ROW SHARE - (ACCESS_KW | ROW_KW, SHARE_KW) => { - p.bump_any(); + (ACCESS_KW, SHARE_KW) => { + p.bump(ACCESS_KW); p.bump(SHARE_KW); + m.complete(p, ACCESS_SHARE); } - // ACCESS EXCLUSIVE | ROW EXCLUSIVE - (ACCESS_KW | ROW_KW, EXCLUSIVE_KW) => { - p.bump_any(); + (ROW_KW, SHARE_KW) => { + p.bump(ROW_KW); + p.bump(SHARE_KW); + m.complete(p, ROW_SHARE); + } + (ACCESS_KW, EXCLUSIVE_KW) => { + p.bump(ACCESS_KW); + p.bump(EXCLUSIVE_KW); + m.complete(p, ACCESS_EXCLUSIVE); + } + (ROW_KW, EXCLUSIVE_KW) => { + p.bump(ROW_KW); p.bump(EXCLUSIVE_KW); + m.complete(p, ROW_EXCLUSIVE); } - // SHARE ROW EXCLUSIVE (SHARE_KW, ROW_KW) => { p.bump(SHARE_KW); p.bump(ROW_KW); p.expect(EXCLUSIVE_KW); + m.complete(p, SHARE_ROW_EXCLUSIVE); } - // SHARE UPDATE EXCLUSIVE (SHARE_KW, UPDATE_KW) => { p.bump(SHARE_KW); p.bump(UPDATE_KW); p.expect(EXCLUSIVE_KW); + m.complete(p, SHARE_UPDATE_EXCLUSIVE); } - // SHARE (SHARE_KW, _) => { p.bump(SHARE_KW); + m.complete(p, SHARE); } - // EXCLUSIVE (EXCLUSIVE_KW, _) => { p.bump(EXCLUSIVE_KW); + m.complete(p, EXCLUSIVE); + } + _ => { + p.error("expected lockmode"); + m.abandon(p); } - _ => p.error("expected lockmode"), } p.expect(MODE_KW); } @@ -12465,20 +12536,62 @@ fn declare(p: &mut Parser<'_>) -> CompletedMarker { fn opt_direction(p: &mut Parser<'_>) -> bool { match p.current() { - NEXT_KW | PRIOR_KW | FIRST_KW | LAST_KW | ALL_KW => { - p.bump_any(); + NEXT_KW => { + let m = p.start(); + p.bump(NEXT_KW); + m.complete(p, NEXT); } - RELATIVE_KW | ABSOLUTE_KW => { - p.bump_any(); + PRIOR_KW => { + let m = p.start(); + p.bump(PRIOR_KW); + m.complete(p, PRIOR); + } + FIRST_KW => { + let m = p.start(); + p.bump(FIRST_KW); + m.complete(p, FIRST); + } + LAST_KW => { + let m = p.start(); + p.bump(LAST_KW); + m.complete(p, LAST); + } + ALL_KW => { + let m = p.start(); + p.bump(ALL_KW); + m.complete(p, ALL); + } + RELATIVE_KW => { + let m = p.start(); + p.bump(RELATIVE_KW); if opt_numeric_literal(p).is_none() { p.error("expected count") } + m.complete(p, RELATIVE); } - FORWARD_KW | BACKWARD_KW => { - p.bump_any(); + ABSOLUTE_KW => { + let m = p.start(); + p.bump(ABSOLUTE_KW); + if opt_numeric_literal(p).is_none() { + p.error("expected count") + } + m.complete(p, ABSOLUTE); + } + FORWARD_KW => { + let m = p.start(); + p.bump(FORWARD_KW); + if !p.eat(ALL_KW) { + let _ = opt_numeric_literal(p); + } + m.complete(p, FORWARD); + } + BACKWARD_KW => { + let m = p.start(); + p.bump(BACKWARD_KW); if !p.eat(ALL_KW) { let _ = opt_numeric_literal(p); } + m.complete(p, BACKWARD); } // count _ if p.at_ts(NUMERIC_FIRST) => { @@ -14632,20 +14745,28 @@ fn show(p: &mut Parser<'_>) -> CompletedMarker { p.bump(SHOW_KW); match p.current() { ALL_KW => { + let m = p.start(); p.bump(ALL_KW); + m.complete(p, ALL); } SESSION_KW => { + let m = p.start(); p.bump(SESSION_KW); p.expect(AUTHORIZATION_KW); + m.complete(p, SESSION_AUTHORIZATION); } TRANSACTION_KW => { + let m = p.start(); p.bump(TRANSACTION_KW); p.expect(ISOLATION_KW); p.expect(LEVEL_KW); + m.complete(p, TRANSACTION_ISOLATION_LEVEL); } TIME_KW => { + let m = p.start(); p.bump(TIME_KW); p.expect(ZONE_KW); + m.complete(p, TIME_ZONE); } _ => { path_name_ref(p); @@ -15406,12 +15527,14 @@ fn alter_column_option(p: &mut Parser<'_>) { } } // RESTART [ [ WITH ] restart ] - RESTART => { + RESTART_KW => { p.bump(RESTART_KW); if p.eat(WITH_KW) { - p.expect(RESTART_KW); + if opt_numeric_literal(p).is_none() { + p.error("expected numeric literal"); + } } else { - p.eat(RESTART_KW); + let _ = opt_numeric_literal(p); } RESTART } @@ -15456,11 +15579,6 @@ fn alter_column_option(p: &mut Parser<'_>) { generated_options(p); SET_GENERATED_OPTIONS } - // RESTART [ [ WITH ] restart ] } [...] - RESTART_KW => { - generated_options(p); - SET_GENERATED_OPTIONS - } // OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ]) OPTIONS_KW => { if !opt_alter_option_list(p) { @@ -15511,11 +15629,7 @@ fn alter_column_option(p: &mut Parser<'_>) { p.bump(SET_KW); p.bump(STORAGE_KW); if !p.eat(DEFAULT_KW) { - if p.at_ts(COLUMN_FIRST) { - p.bump_any(); - } else { - p.error("expected name"); - } + name_ref(p); } SET_STORAGE } @@ -15524,11 +15638,7 @@ fn alter_column_option(p: &mut Parser<'_>) { p.bump(SET_KW); p.bump(COMPRESSION_KW); if !p.eat(DEFAULT_KW) { - if p.at_ts(COLUMN_FIRST) { - p.bump_any(); - } else { - p.error("expected name"); - } + name_ref(p); } SET_COMPRESSION } diff --git a/crates/squawk_parser/tests/data/ok/alter_table.sql b/crates/squawk_parser/tests/data/ok/alter_table.sql index c01b7985..fcde6c75 100644 --- a/crates/squawk_parser/tests/data/ok/alter_table.sql +++ b/crates/squawk_parser/tests/data/ok/alter_table.sql @@ -63,6 +63,8 @@ alter table t alter c set compression default; alter table t alter c set compression foo; alter table t alter c restart; +alter table t alter c restart 5; +alter table t alter c restart with 5; -- inherit alter table t inherit t1; diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_foreign_table_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_foreign_table_ok.snap index 6b0c4f0c..27f561da 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_foreign_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_foreign_table_ok.snap @@ -828,7 +828,8 @@ SOURCE_FILE WHITESPACE " " STORAGE_KW "storage" WHITESPACE " " - IDENT "plain" + NAME_REF + IDENT "plain" SEMICOLON ";" WHITESPACE "\n\n" ALTER_FOREIGN_TABLE @@ -855,7 +856,8 @@ SOURCE_FILE WHITESPACE " " STORAGE_KW "storage" WHITESPACE " " - EXTERNAL_KW "external" + NAME_REF + EXTERNAL_KW "external" SEMICOLON ";" WHITESPACE "\n\n" ALTER_FOREIGN_TABLE @@ -882,7 +884,8 @@ SOURCE_FILE WHITESPACE " " STORAGE_KW "storage" WHITESPACE " " - IDENT "extended" + NAME_REF + IDENT "extended" SEMICOLON ";" WHITESPACE "\n\n" ALTER_FOREIGN_TABLE @@ -909,7 +912,8 @@ SOURCE_FILE WHITESPACE " " STORAGE_KW "storage" WHITESPACE " " - IDENT "main" + NAME_REF + IDENT "main" SEMICOLON ";" WHITESPACE "\n\n" ALTER_FOREIGN_TABLE diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_materialized_view_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_materialized_view_ok.snap index 2af1f243..85a1c2b4 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_materialized_view_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_materialized_view_ok.snap @@ -549,7 +549,8 @@ SOURCE_FILE WHITESPACE " " STORAGE_KW "storage" WHITESPACE " " - IDENT "plain" + NAME_REF + IDENT "plain" SEMICOLON ";" WHITESPACE "\n\n" ALTER_MATERIALIZED_VIEW @@ -575,7 +576,8 @@ SOURCE_FILE WHITESPACE " " STORAGE_KW "storage" WHITESPACE " " - EXTERNAL_KW "external" + NAME_REF + EXTERNAL_KW "external" SEMICOLON ";" WHITESPACE "\n\n" ALTER_MATERIALIZED_VIEW @@ -601,7 +603,8 @@ SOURCE_FILE WHITESPACE " " STORAGE_KW "storage" WHITESPACE " " - IDENT "extended" + NAME_REF + IDENT "extended" SEMICOLON ";" WHITESPACE "\n\n" ALTER_MATERIALIZED_VIEW @@ -627,7 +630,8 @@ SOURCE_FILE WHITESPACE " " STORAGE_KW "storage" WHITESPACE " " - IDENT "main" + NAME_REF + IDENT "main" SEMICOLON ";" WHITESPACE "\n\n" ALTER_MATERIALIZED_VIEW @@ -686,7 +690,8 @@ SOURCE_FILE WHITESPACE " " COMPRESSION_KW "compression" WHITESPACE " " - IDENT "pglz" + NAME_REF + IDENT "pglz" SEMICOLON ";" WHITESPACE "\n\n" ALTER_MATERIALIZED_VIEW @@ -714,7 +719,8 @@ SOURCE_FILE WHITESPACE " " COMPRESSION_KW "compression" WHITESPACE " " - IDENT "pglz" + NAME_REF + IDENT "pglz" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- action_cluster" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap index 4186110c..4f420e63 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap @@ -991,7 +991,8 @@ SOURCE_FILE WHITESPACE " " STORAGE_KW "storage" WHITESPACE " " - IDENT "plain" + NAME_REF + IDENT "plain" SEMICOLON ";" WHITESPACE "\n" ALTER_TABLE @@ -1016,7 +1017,8 @@ SOURCE_FILE WHITESPACE " " STORAGE_KW "storage" WHITESPACE " " - EXTERNAL_KW "external" + NAME_REF + EXTERNAL_KW "external" SEMICOLON ";" WHITESPACE "\n" ALTER_TABLE @@ -1041,7 +1043,8 @@ SOURCE_FILE WHITESPACE " " STORAGE_KW "storage" WHITESPACE " " - IDENT "extended" + NAME_REF + IDENT "extended" SEMICOLON ";" WHITESPACE "\n" ALTER_TABLE @@ -1066,7 +1069,8 @@ SOURCE_FILE WHITESPACE " " STORAGE_KW "storage" WHITESPACE " " - IDENT "main" + NAME_REF + IDENT "main" SEMICOLON ";" WHITESPACE "\n" ALTER_TABLE @@ -1141,7 +1145,8 @@ SOURCE_FILE WHITESPACE " " COMPRESSION_KW "compression" WHITESPACE " " - IDENT "foo" + NAME_REF + IDENT "foo" SEMICOLON ";" WHITESPACE "\n\n" ALTER_TABLE @@ -1161,9 +1166,58 @@ SOURCE_FILE NAME_REF IDENT "c" WHITESPACE " " - SET_GENERATED_OPTIONS - RESTART - RESTART_KW "restart" + RESTART + RESTART_KW "restart" + SEMICOLON ";" + WHITESPACE "\n" + ALTER_TABLE + ALTER_KW "alter" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE " " + ALTER_COLUMN + ALTER_KW "alter" + WHITESPACE " " + NAME_REF + IDENT "c" + WHITESPACE " " + RESTART + RESTART_KW "restart" + WHITESPACE " " + LITERAL + INT_NUMBER "5" + SEMICOLON ";" + WHITESPACE "\n" + ALTER_TABLE + ALTER_KW "alter" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE " " + ALTER_COLUMN + ALTER_KW "alter" + WHITESPACE " " + NAME_REF + IDENT "c" + WHITESPACE " " + RESTART + RESTART_KW "restart" + WHITESPACE " " + WITH_KW "with" + WHITESPACE " " + LITERAL + INT_NUMBER "5" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- inherit" diff --git a/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap b/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap index 891d3ba3..2fb28dfd 100644 --- a/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap @@ -1046,7 +1046,8 @@ SOURCE_FILE LOCKING_CLAUSE FOR_KW "FOR" WHITESPACE " " - UPDATE_KW "UPDATE" + FOR_UPDATE + UPDATE_KW "UPDATE" WHITESPACE "\n " LIMIT_CLAUSE LIMIT_KW "LIMIT" diff --git a/crates/squawk_parser/tests/snapshots/tests__fetch_ok.snap b/crates/squawk_parser/tests/snapshots/tests__fetch_ok.snap index 86c0ddf5..ed3cb5de 100644 --- a/crates/squawk_parser/tests/snapshots/tests__fetch_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__fetch_ok.snap @@ -8,7 +8,8 @@ SOURCE_FILE FETCH FETCH_KW "fetch" WHITESPACE " " - NEXT_KW "next" + NEXT + NEXT_KW "next" WHITESPACE " " FROM_KW "from" WHITESPACE " " @@ -19,7 +20,8 @@ SOURCE_FILE FETCH FETCH_KW "fetch" WHITESPACE " " - PRIOR_KW "prior" + PRIOR + PRIOR_KW "prior" WHITESPACE " " FROM_KW "from" WHITESPACE " " @@ -30,7 +32,8 @@ SOURCE_FILE FETCH FETCH_KW "fetch" WHITESPACE " " - PRIOR_KW "prior" + PRIOR + PRIOR_KW "prior" WHITESPACE " " IN_KW "in" WHITESPACE " " @@ -41,7 +44,8 @@ SOURCE_FILE FETCH FETCH_KW "fetch" WHITESPACE " " - PRIOR_KW "prior" + PRIOR + PRIOR_KW "prior" WHITESPACE " " NAME_REF IDENT "cursor_name" @@ -50,7 +54,8 @@ SOURCE_FILE FETCH FETCH_KW "FETCH" WHITESPACE " " - NEXT_KW "NEXT" + NEXT + NEXT_KW "NEXT" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -61,7 +66,8 @@ SOURCE_FILE FETCH FETCH_KW "FETCH" WHITESPACE " " - PRIOR_KW "PRIOR" + PRIOR + PRIOR_KW "PRIOR" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -72,7 +78,8 @@ SOURCE_FILE FETCH FETCH_KW "FETCH" WHITESPACE " " - FIRST_KW "FIRST" + FIRST + FIRST_KW "FIRST" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -83,7 +90,8 @@ SOURCE_FILE FETCH FETCH_KW "FETCH" WHITESPACE " " - LAST_KW "LAST" + LAST + LAST_KW "LAST" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -94,10 +102,11 @@ SOURCE_FILE FETCH FETCH_KW "FETCH" WHITESPACE " " - ABSOLUTE_KW "ABSOLUTE" - WHITESPACE " " - LITERAL - INT_NUMBER "10" + ABSOLUTE + ABSOLUTE_KW "ABSOLUTE" + WHITESPACE " " + LITERAL + INT_NUMBER "10" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -108,10 +117,11 @@ SOURCE_FILE FETCH FETCH_KW "FETCH" WHITESPACE " " - RELATIVE_KW "RELATIVE" - WHITESPACE " " - LITERAL - INT_NUMBER "10" + RELATIVE + RELATIVE_KW "RELATIVE" + WHITESPACE " " + LITERAL + INT_NUMBER "10" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -134,7 +144,8 @@ SOURCE_FILE FETCH FETCH_KW "FETCH" WHITESPACE " " - ALL_KW "ALL" + ALL + ALL_KW "ALL" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -145,7 +156,8 @@ SOURCE_FILE FETCH FETCH_KW "FETCH" WHITESPACE " " - FORWARD_KW "FORWARD" + FORWARD + FORWARD_KW "FORWARD" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -156,10 +168,11 @@ SOURCE_FILE FETCH FETCH_KW "FETCH" WHITESPACE " " - FORWARD_KW "FORWARD" - WHITESPACE " " - LITERAL - INT_NUMBER "10" + FORWARD + FORWARD_KW "FORWARD" + WHITESPACE " " + LITERAL + INT_NUMBER "10" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -170,9 +183,10 @@ SOURCE_FILE FETCH FETCH_KW "FETCH" WHITESPACE " " - FORWARD_KW "FORWARD" - WHITESPACE " " - ALL_KW "ALL" + FORWARD + FORWARD_KW "FORWARD" + WHITESPACE " " + ALL_KW "ALL" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -183,7 +197,8 @@ SOURCE_FILE FETCH FETCH_KW "FETCH" WHITESPACE " " - BACKWARD_KW "BACKWARD" + BACKWARD + BACKWARD_KW "BACKWARD" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -194,10 +209,11 @@ SOURCE_FILE FETCH FETCH_KW "FETCH" WHITESPACE " " - BACKWARD_KW "BACKWARD" - WHITESPACE " " - LITERAL - INT_NUMBER "10" + BACKWARD + BACKWARD_KW "BACKWARD" + WHITESPACE " " + LITERAL + INT_NUMBER "10" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -208,9 +224,10 @@ SOURCE_FILE FETCH FETCH_KW "FETCH" WHITESPACE " " - BACKWARD_KW "BACKWARD" - WHITESPACE " " - ALL_KW "ALL" + BACKWARD + BACKWARD_KW "BACKWARD" + WHITESPACE " " + ALL_KW "ALL" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " diff --git a/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap b/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap index de5d214b..40cb7ed7 100644 --- a/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap @@ -1859,7 +1859,8 @@ SOURCE_FILE LOCKING_CLAUSE FOR_KW "FOR" WHITESPACE " " - UPDATE_KW "UPDATE" + FOR_UPDATE + UPDATE_KW "UPDATE" WHITESPACE " " WHERE_CLAUSE WHERE_KW "WHERE" diff --git a/crates/squawk_parser/tests/snapshots/tests__lock_ok.snap b/crates/squawk_parser/tests/snapshots/tests__lock_ok.snap index ac5e8c9c..153f2488 100644 --- a/crates/squawk_parser/tests/snapshots/tests__lock_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__lock_ok.snap @@ -63,9 +63,10 @@ SOURCE_FILE WHITESPACE " " IN_KW "in" WHITESPACE " " - ACCESS_KW "access" - WHITESPACE " " - SHARE_KW "share" + ACCESS_SHARE + ACCESS_KW "access" + WHITESPACE " " + SHARE_KW "share" WHITESPACE " " MODE_KW "mode" SEMICOLON ";" @@ -82,9 +83,10 @@ SOURCE_FILE WHITESPACE " " IN_KW "in" WHITESPACE " " - ROW_KW "row" - WHITESPACE " " - SHARE_KW "share" + ROW_SHARE + ROW_KW "row" + WHITESPACE " " + SHARE_KW "share" WHITESPACE " " MODE_KW "mode" SEMICOLON ";" @@ -101,9 +103,10 @@ SOURCE_FILE WHITESPACE " " IN_KW "in" WHITESPACE " " - ROW_KW "row" - WHITESPACE " " - EXCLUSIVE_KW "exclusive" + ROW_EXCLUSIVE + ROW_KW "row" + WHITESPACE " " + EXCLUSIVE_KW "exclusive" WHITESPACE " " MODE_KW "mode" SEMICOLON ";" @@ -120,11 +123,12 @@ SOURCE_FILE WHITESPACE " " IN_KW "in" WHITESPACE " " - SHARE_KW "share" - WHITESPACE " " - UPDATE_KW "update" - WHITESPACE " " - EXCLUSIVE_KW "exclusive" + SHARE_UPDATE_EXCLUSIVE + SHARE_KW "share" + WHITESPACE " " + UPDATE_KW "update" + WHITESPACE " " + EXCLUSIVE_KW "exclusive" WHITESPACE " " MODE_KW "mode" SEMICOLON ";" @@ -141,7 +145,8 @@ SOURCE_FILE WHITESPACE " " IN_KW "in" WHITESPACE " " - SHARE_KW "share" + SHARE + SHARE_KW "share" WHITESPACE " " MODE_KW "mode" SEMICOLON ";" @@ -158,11 +163,12 @@ SOURCE_FILE WHITESPACE " " IN_KW "in" WHITESPACE " " - SHARE_KW "share" - WHITESPACE " " - ROW_KW "row" - WHITESPACE " " - EXCLUSIVE_KW "exclusive" + SHARE_ROW_EXCLUSIVE + SHARE_KW "share" + WHITESPACE " " + ROW_KW "row" + WHITESPACE " " + EXCLUSIVE_KW "exclusive" WHITESPACE " " MODE_KW "mode" SEMICOLON ";" @@ -179,7 +185,8 @@ SOURCE_FILE WHITESPACE " " IN_KW "in" WHITESPACE " " - EXCLUSIVE_KW "exclusive" + EXCLUSIVE + EXCLUSIVE_KW "exclusive" WHITESPACE " " MODE_KW "mode" SEMICOLON ";" @@ -196,9 +203,10 @@ SOURCE_FILE WHITESPACE " " IN_KW "in" WHITESPACE " " - ACCESS_KW "access" - WHITESPACE " " - EXCLUSIVE_KW "exclusive" + ACCESS_EXCLUSIVE + ACCESS_KW "access" + WHITESPACE " " + EXCLUSIVE_KW "exclusive" WHITESPACE " " MODE_KW "mode" SEMICOLON ";" @@ -237,9 +245,10 @@ SOURCE_FILE WHITESPACE " " IN_KW "in" WHITESPACE " " - ROW_KW "row" - WHITESPACE " " - EXCLUSIVE_KW "exclusive" + ROW_EXCLUSIVE + ROW_KW "row" + WHITESPACE " " + EXCLUSIVE_KW "exclusive" WHITESPACE " " MODE_KW "mode" WHITESPACE " " diff --git a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap index 311fc7c4..602f712e 100644 --- a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap @@ -4828,18 +4828,21 @@ SOURCE_FILE FRAME_CLAUSE ROWS_KW "ROWS" WHITESPACE " " - BETWEEN_KW "BETWEEN" - WHITESPACE " " - LITERAL - INT_NUMBER "2" - WHITESPACE " " - PRECEDING_KW "PRECEDING" - WHITESPACE " " - AND_KW "AND" - WHITESPACE " " - CURRENT_KW "CURRENT" - WHITESPACE " " - ROW_KW "ROW" + FRAME_BETWEEN + BETWEEN_KW "BETWEEN" + WHITESPACE " " + EXPR_PRECEDING + LITERAL + INT_NUMBER "2" + WHITESPACE " " + PRECEDING_KW "PRECEDING" + WHITESPACE " " + AND_KW "AND" + WHITESPACE " " + CURRENT_ROW + CURRENT_KW "CURRENT" + WHITESPACE " " + ROW_KW "ROW" WHITESPACE "\n " R_PAREN ")" WHITESPACE " " diff --git a/crates/squawk_parser/tests/snapshots/tests__move_ok.snap b/crates/squawk_parser/tests/snapshots/tests__move_ok.snap index 5581e465..c7c815fb 100644 --- a/crates/squawk_parser/tests/snapshots/tests__move_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__move_ok.snap @@ -8,7 +8,8 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - NEXT_KW "next" + NEXT + NEXT_KW "next" WHITESPACE " " FROM_KW "from" WHITESPACE " " @@ -19,7 +20,8 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - PRIOR_KW "prior" + PRIOR + PRIOR_KW "prior" WHITESPACE " " FROM_KW "from" WHITESPACE " " @@ -30,7 +32,8 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - PRIOR_KW "prior" + PRIOR + PRIOR_KW "prior" WHITESPACE " " IN_KW "in" WHITESPACE " " @@ -41,7 +44,8 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - PRIOR_KW "prior" + PRIOR + PRIOR_KW "prior" WHITESPACE " " NAME_REF IDENT "cursor_name" @@ -50,7 +54,8 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - NEXT_KW "NEXT" + NEXT + NEXT_KW "NEXT" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -61,7 +66,8 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - PRIOR_KW "PRIOR" + PRIOR + PRIOR_KW "PRIOR" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -72,7 +78,8 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - FIRST_KW "FIRST" + FIRST + FIRST_KW "FIRST" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -83,7 +90,8 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - LAST_KW "LAST" + LAST + LAST_KW "LAST" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -94,10 +102,11 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - ABSOLUTE_KW "ABSOLUTE" - WHITESPACE " " - LITERAL - INT_NUMBER "10" + ABSOLUTE + ABSOLUTE_KW "ABSOLUTE" + WHITESPACE " " + LITERAL + INT_NUMBER "10" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -108,10 +117,11 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - RELATIVE_KW "RELATIVE" - WHITESPACE " " - LITERAL - INT_NUMBER "10" + RELATIVE + RELATIVE_KW "RELATIVE" + WHITESPACE " " + LITERAL + INT_NUMBER "10" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -134,7 +144,8 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - ALL_KW "ALL" + ALL + ALL_KW "ALL" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -145,7 +156,8 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - FORWARD_KW "FORWARD" + FORWARD + FORWARD_KW "FORWARD" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -156,10 +168,11 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - FORWARD_KW "FORWARD" - WHITESPACE " " - LITERAL - INT_NUMBER "10" + FORWARD + FORWARD_KW "FORWARD" + WHITESPACE " " + LITERAL + INT_NUMBER "10" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -170,9 +183,10 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - FORWARD_KW "FORWARD" - WHITESPACE " " - ALL_KW "ALL" + FORWARD + FORWARD_KW "FORWARD" + WHITESPACE " " + ALL_KW "ALL" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -183,7 +197,8 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - BACKWARD_KW "BACKWARD" + BACKWARD + BACKWARD_KW "BACKWARD" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -194,10 +209,11 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - BACKWARD_KW "BACKWARD" - WHITESPACE " " - LITERAL - INT_NUMBER "10" + BACKWARD + BACKWARD_KW "BACKWARD" + WHITESPACE " " + LITERAL + INT_NUMBER "10" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " @@ -208,9 +224,10 @@ SOURCE_FILE MOVE MOVE_KW "move" WHITESPACE " " - BACKWARD_KW "BACKWARD" - WHITESPACE " " - ALL_KW "ALL" + BACKWARD + BACKWARD_KW "BACKWARD" + WHITESPACE " " + ALL_KW "ALL" WHITESPACE " " FROM_KW "FROM" WHITESPACE " " diff --git a/crates/squawk_parser/tests/snapshots/tests__select_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_ok.snap index f783cef5..23c3be4c 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_ok.snap @@ -3689,10 +3689,11 @@ SOURCE_FILE FRAME_CLAUSE RANGE_KW "range" WHITESPACE " " - LITERAL - INT_NUMBER "1" - WHITESPACE " " - PRECEDING_KW "preceding" + EXPR_PRECEDING + LITERAL + INT_NUMBER "1" + WHITESPACE " " + PRECEDING_KW "preceding" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -3719,10 +3720,11 @@ SOURCE_FILE FRAME_CLAUSE ROWS_KW "rows" WHITESPACE " " - LITERAL - INT_NUMBER "1" - WHITESPACE " " - PRECEDING_KW "preceding" + EXPR_PRECEDING + LITERAL + INT_NUMBER "1" + WHITESPACE " " + PRECEDING_KW "preceding" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -3749,10 +3751,11 @@ SOURCE_FILE FRAME_CLAUSE GROUPS_KW "groups" WHITESPACE " " - LITERAL - INT_NUMBER "1" - WHITESPACE " " - PRECEDING_KW "preceding" + EXPR_PRECEDING + LITERAL + INT_NUMBER "1" + WHITESPACE " " + PRECEDING_KW "preceding" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -3781,16 +3784,19 @@ SOURCE_FILE FRAME_CLAUSE ROWS_KW "rows" WHITESPACE " " - LITERAL - INT_NUMBER "1" - WHITESPACE " " - PRECEDING_KW "preceding" - WHITESPACE " " - EXCLUDE_KW "exclude" - WHITESPACE " " - CURRENT_KW "current" + EXPR_PRECEDING + LITERAL + INT_NUMBER "1" + WHITESPACE " " + PRECEDING_KW "preceding" WHITESPACE " " - ROW_KW "row" + FRAME_EXCLUDE + EXCLUDE_KW "exclude" + WHITESPACE " " + CURRENT_ROW + CURRENT_KW "current" + WHITESPACE " " + ROW_KW "row" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -3817,14 +3823,17 @@ SOURCE_FILE FRAME_CLAUSE ROWS_KW "rows" WHITESPACE " " - LITERAL - INT_NUMBER "1" - WHITESPACE " " - PRECEDING_KW "preceding" - WHITESPACE " " - EXCLUDE_KW "exclude" + EXPR_PRECEDING + LITERAL + INT_NUMBER "1" + WHITESPACE " " + PRECEDING_KW "preceding" WHITESPACE " " - GROUP_KW "group" + FRAME_EXCLUDE + EXCLUDE_KW "exclude" + WHITESPACE " " + GROUP + GROUP_KW "group" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -3851,14 +3860,17 @@ SOURCE_FILE FRAME_CLAUSE ROWS_KW "rows" WHITESPACE " " - LITERAL - INT_NUMBER "1" - WHITESPACE " " - PRECEDING_KW "preceding" - WHITESPACE " " - EXCLUDE_KW "exclude" + EXPR_PRECEDING + LITERAL + INT_NUMBER "1" + WHITESPACE " " + PRECEDING_KW "preceding" WHITESPACE " " - TIES_KW "ties" + FRAME_EXCLUDE + EXCLUDE_KW "exclude" + WHITESPACE " " + TIES + TIES_KW "ties" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -3885,16 +3897,19 @@ SOURCE_FILE FRAME_CLAUSE ROWS_KW "rows" WHITESPACE " " - LITERAL - INT_NUMBER "1" - WHITESPACE " " - PRECEDING_KW "preceding" - WHITESPACE " " - EXCLUDE_KW "exclude" - WHITESPACE " " - NO_KW "no" + EXPR_PRECEDING + LITERAL + INT_NUMBER "1" + WHITESPACE " " + PRECEDING_KW "preceding" WHITESPACE " " - OTHERS_KW "others" + FRAME_EXCLUDE + EXCLUDE_KW "exclude" + WHITESPACE " " + NO_OTHERS + NO_KW "no" + WHITESPACE " " + OTHERS_KW "others" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n\n" @@ -4413,7 +4428,8 @@ SOURCE_FILE LOCKING_CLAUSE FOR_KW "for" WHITESPACE " " - SHARE_KW "share" + FOR_SHARE + SHARE_KW "share" WHITESPACE " " OF_KW "of" WHITESPACE " " @@ -4443,14 +4459,16 @@ SOURCE_FILE LOCKING_CLAUSE FOR_KW "for" WHITESPACE " " - UPDATE_KW "update" + FOR_UPDATE + UPDATE_KW "update" WHITESPACE " " NOWAIT_KW "nowait" WHITESPACE " " LOCKING_CLAUSE FOR_KW "for" WHITESPACE " " - UPDATE_KW "update" + FOR_UPDATE + UPDATE_KW "update" WHITESPACE " " SKIP_KW "skip" WHITESPACE " " diff --git a/crates/squawk_parser/tests/snapshots/tests__show_ok.snap b/crates/squawk_parser/tests/snapshots/tests__show_ok.snap index a04a32b1..f139e85e 100644 --- a/crates/squawk_parser/tests/snapshots/tests__show_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__show_ok.snap @@ -6,33 +6,37 @@ SOURCE_FILE SHOW SHOW_KW "show" WHITESPACE " " - TIME_KW "time" - WHITESPACE " " - ZONE_KW "zone" + TIME_ZONE + TIME_KW "time" + WHITESPACE " " + ZONE_KW "zone" SEMICOLON ";" WHITESPACE "\n" SHOW SHOW_KW "show" WHITESPACE " " - TRANSACTION_KW "transaction" - WHITESPACE " " - ISOLATION_KW "isolation" - WHITESPACE " " - LEVEL_KW "level" + TRANSACTION_ISOLATION_LEVEL + TRANSACTION_KW "transaction" + WHITESPACE " " + ISOLATION_KW "isolation" + WHITESPACE " " + LEVEL_KW "level" SEMICOLON ";" WHITESPACE "\n" SHOW SHOW_KW "show" WHITESPACE " " - SESSION_KW "session" - WHITESPACE " " - AUTHORIZATION_KW "authorization" + SESSION_AUTHORIZATION + SESSION_KW "session" + WHITESPACE " " + AUTHORIZATION_KW "authorization" SEMICOLON ";" WHITESPACE "\n" SHOW SHOW_KW "show" WHITESPACE " " - ALL_KW "all" + ALL + ALL_KW "all" SEMICOLON ";" WHITESPACE "\n\n" SHOW diff --git a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap index aab68a89..6cf93dcd 100644 --- a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap @@ -1351,7 +1351,8 @@ SOURCE_FILE LOCKING_CLAUSE FOR_KW "FOR" WHITESPACE " " - UPDATE_KW "UPDATE" + FOR_UPDATE + UPDATE_KW "UPDATE" WHITESPACE "\n " LIMIT_CLAUSE LIMIT_KW "LIMIT" diff --git a/crates/squawk_syntax/src/ast/generated/nodes.rs b/crates/squawk_syntax/src/ast/generated/nodes.rs index 36513fe2..c24c268f 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -7,6 +7,51 @@ use crate::ast::{AstChildren, support}; use crate::syntax_node::SyntaxNode; use crate::syntax_node::SyntaxToken; +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Absolute { + pub(crate) syntax: SyntaxNode, +} +impl Absolute { + #[inline] + pub fn literal(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn absolute_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ABSOLUTE_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct AccessExclusive { + pub(crate) syntax: SyntaxNode, +} +impl AccessExclusive { + #[inline] + pub fn access_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ACCESS_KW) + } + #[inline] + pub fn exclusive_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::EXCLUSIVE_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct AccessShare { + pub(crate) syntax: SyntaxNode, +} +impl AccessShare { + #[inline] + pub fn access_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ACCESS_KW) + } + #[inline] + pub fn share_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SHARE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct AddAttribute { pub(crate) syntax: SyntaxNode, @@ -133,10 +178,38 @@ pub struct AddGenerated { pub(crate) syntax: SyntaxNode, } impl AddGenerated { + #[inline] + pub fn sequence_option_list(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn add_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::ADD_KW) } + #[inline] + pub fn always_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ALWAYS_KW) + } + #[inline] + pub fn as_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::AS_KW) + } + #[inline] + pub fn by_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::BY_KW) + } + #[inline] + pub fn default_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DEFAULT_KW) + } + #[inline] + pub fn generated_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::GENERATED_KW) + } + #[inline] + pub fn identity_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::IDENTITY_KW) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -331,6 +404,17 @@ impl Alias { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct All { + pub(crate) syntax: SyntaxNode, +} +impl All { + #[inline] + pub fn all_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ALL_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct AllFn { pub(crate) syntax: SyntaxNode, @@ -3209,6 +3293,25 @@ impl AttributeValue { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Backward { + pub(crate) syntax: SyntaxNode, +} +impl Backward { + #[inline] + pub fn literal(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn all_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ALL_KW) + } + #[inline] + pub fn backward_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::BACKWARD_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct BeforeValue { pub(crate) syntax: SyntaxNode, @@ -3736,6 +3839,10 @@ pub struct ClusterOn { pub(crate) syntax: SyntaxNode, } impl ClusterOn { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn cluster_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::CLUSTER_KW) @@ -4743,6 +4850,10 @@ pub struct CostFuncOption { pub(crate) syntax: SyntaxNode, } impl CostFuncOption { + #[inline] + pub fn literal(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn cost_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::COST_KW) @@ -6790,6 +6901,21 @@ impl CreateView { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct CurrentRow { + pub(crate) syntax: SyntaxNode, +} +impl CurrentRow { + #[inline] + pub fn current_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::CURRENT_KW) + } + #[inline] + pub fn row_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ROW_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct CustomOp { pub(crate) syntax: SyntaxNode, @@ -7241,6 +7367,10 @@ pub struct DisableRule { pub(crate) syntax: SyntaxNode, } impl DisableRule { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn disable_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::DISABLE_KW) @@ -7256,6 +7386,14 @@ pub struct DisableTrigger { pub(crate) syntax: SyntaxNode, } impl DisableTrigger { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn all_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ALL_KW) + } #[inline] pub fn disable_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::DISABLE_KW) @@ -7264,6 +7402,10 @@ impl DisableTrigger { pub fn trigger_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::TRIGGER_KW) } + #[inline] + pub fn user_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::USER_KW) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -9633,6 +9775,10 @@ pub struct EnableAlwaysRule { pub(crate) syntax: SyntaxNode, } impl EnableAlwaysRule { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn always_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::ALWAYS_KW) @@ -9652,6 +9798,10 @@ pub struct EnableAlwaysTrigger { pub(crate) syntax: SyntaxNode, } impl EnableAlwaysTrigger { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn always_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::ALWAYS_KW) @@ -9671,6 +9821,10 @@ pub struct EnableReplicaRule { pub(crate) syntax: SyntaxNode, } impl EnableReplicaRule { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn enable_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::ENABLE_KW) @@ -9690,6 +9844,10 @@ pub struct EnableReplicaTrigger { pub(crate) syntax: SyntaxNode, } impl EnableReplicaTrigger { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn enable_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::ENABLE_KW) @@ -9732,6 +9890,10 @@ pub struct EnableRule { pub(crate) syntax: SyntaxNode, } impl EnableRule { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn enable_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::ENABLE_KW) @@ -9747,6 +9909,14 @@ pub struct EnableTrigger { pub(crate) syntax: SyntaxNode, } impl EnableTrigger { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn all_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ALL_KW) + } #[inline] pub fn enable_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::ENABLE_KW) @@ -9755,6 +9925,10 @@ impl EnableTrigger { pub fn trigger_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::TRIGGER_KW) } + #[inline] + pub fn user_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::USER_KW) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -9879,6 +10053,17 @@ impl ExcludeConstraint { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Exclusive { + pub(crate) syntax: SyntaxNode, +} +impl Exclusive { + #[inline] + pub fn exclusive_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::EXCLUSIVE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Execute { pub(crate) syntax: SyntaxNode, @@ -9982,6 +10167,36 @@ impl ExprAsNameList { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ExprFollowing { + pub(crate) syntax: SyntaxNode, +} +impl ExprFollowing { + #[inline] + pub fn expr(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn following_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::FOLLOWING_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ExprPreceding { + pub(crate) syntax: SyntaxNode, +} +impl ExprPreceding { + #[inline] + pub fn expr(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn preceding_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::PRECEDING_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ExprType { pub(crate) syntax: SyntaxNode, @@ -10115,64 +10330,64 @@ pub struct Fetch { } impl Fetch { #[inline] - pub fn literal(&self) -> Option { + pub fn absolute(&self) -> Option { support::child(&self.syntax) } #[inline] - pub fn name_ref(&self) -> Option { + pub fn all(&self) -> Option { support::child(&self.syntax) } #[inline] - pub fn semicolon_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::SEMICOLON) + pub fn backward(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn absolute_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::ABSOLUTE_KW) + pub fn first(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn all_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::ALL_KW) + pub fn forward(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn backward_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::BACKWARD_KW) + pub fn last(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn fetch_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::FETCH_KW) + pub fn literal(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn first_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::FIRST_KW) + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn forward_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::FORWARD_KW) + pub fn next(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn from_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::FROM_KW) + pub fn prior(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn in_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::IN_KW) + pub fn relative(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn last_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::LAST_KW) + pub fn semicolon_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SEMICOLON) } #[inline] - pub fn next_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::NEXT_KW) + pub fn fetch_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::FETCH_KW) } #[inline] - pub fn prior_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::PRIOR_KW) + pub fn from_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::FROM_KW) } #[inline] - pub fn relative_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::RELATIVE_KW) + pub fn in_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::IN_KW) } } @@ -10261,6 +10476,51 @@ impl FilterClause { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct First { + pub(crate) syntax: SyntaxNode, +} +impl First { + #[inline] + pub fn first_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::FIRST_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ForKeyShare { + pub(crate) syntax: SyntaxNode, +} +impl ForKeyShare { + #[inline] + pub fn key_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::KEY_KW) + } + #[inline] + pub fn share_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SHARE_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ForNoKeyUpdate { + pub(crate) syntax: SyntaxNode, +} +impl ForNoKeyUpdate { + #[inline] + pub fn key_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::KEY_KW) + } + #[inline] + pub fn no_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::NO_KW) + } + #[inline] + pub fn update_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::UPDATE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ForPortionOf { pub(crate) syntax: SyntaxNode, @@ -10323,6 +10583,28 @@ impl ForProvider { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ForShare { + pub(crate) syntax: SyntaxNode, +} +impl ForShare { + #[inline] + pub fn share_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SHARE_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ForUpdate { + pub(crate) syntax: SyntaxNode, +} +impl ForUpdate { + #[inline] + pub fn update_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::UPDATE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ForceRls { pub(crate) syntax: SyntaxNode, @@ -10386,14 +10668,29 @@ impl ForeignKeyConstraint { } #[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct FrameClause { +pub struct Forward { pub(crate) syntax: SyntaxNode, } -impl FrameClause { +impl Forward { #[inline] - pub fn expr(&self) -> Option { + pub fn literal(&self) -> Option { support::child(&self.syntax) } + #[inline] + pub fn all_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ALL_KW) + } + #[inline] + pub fn forward_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::FORWARD_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct FrameBetween { + pub(crate) syntax: SyntaxNode, +} +impl FrameBetween { #[inline] pub fn and_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::AND_KW) @@ -10402,57 +10699,63 @@ impl FrameClause { pub fn between_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::BETWEEN_KW) } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct FrameClause { + pub(crate) syntax: SyntaxNode, +} +impl FrameClause { #[inline] - pub fn current_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::CURRENT_KW) - } - #[inline] - pub fn exclude_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::EXCLUDE_KW) + pub fn frame_between(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn following_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::FOLLOWING_KW) + pub fn frame_bound(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn group_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::GROUP_KW) + pub fn frame_exclude(&self) -> Option { + support::child(&self.syntax) } #[inline] pub fn groups_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::GROUPS_KW) } #[inline] - pub fn no_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::NO_KW) - } - #[inline] - pub fn others_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::OTHERS_KW) + pub fn range_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::RANGE_KW) } #[inline] - pub fn preceding_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::PRECEDING_KW) + pub fn rows_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ROWS_KW) } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct FrameExclude { + pub(crate) syntax: SyntaxNode, +} +impl FrameExclude { #[inline] - pub fn range_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::RANGE_KW) + pub fn current_row(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn row_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::ROW_KW) + pub fn group(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn rows_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::ROWS_KW) + pub fn no_others(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn ties_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::TIES_KW) + pub fn ties(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn unbounded_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::UNBOUNDED_KW) + pub fn exclude_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::EXCLUDE_KW) } } @@ -10857,6 +11160,17 @@ impl GraphTableFn { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Group { + pub(crate) syntax: SyntaxNode, +} +impl Group { + #[inline] + pub fn group_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::GROUP_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct GroupByClause { pub(crate) syntax: SyntaxNode, @@ -12830,6 +13144,17 @@ impl LanguageFuncOption { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Last { + pub(crate) syntax: SyntaxNode, +} +impl Last { + #[inline] + pub fn last_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::LAST_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct LeakproofFuncOption { pub(crate) syntax: SyntaxNode, @@ -13006,6 +13331,10 @@ pub struct Lock { pub(crate) syntax: SyntaxNode, } impl Lock { + #[inline] + pub fn lock_mode(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn table_list(&self) -> Option { support::child(&self.syntax) @@ -13015,14 +13344,6 @@ impl Lock { support::token(&self.syntax, SyntaxKind::SEMICOLON) } #[inline] - pub fn access_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::ACCESS_KW) - } - #[inline] - pub fn exclusive_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::EXCLUSIVE_KW) - } - #[inline] pub fn in_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::IN_KW) } @@ -13039,21 +13360,9 @@ impl Lock { support::token(&self.syntax, SyntaxKind::NOWAIT_KW) } #[inline] - pub fn row_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::ROW_KW) - } - #[inline] - pub fn share_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::SHARE_KW) - } - #[inline] pub fn table_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::TABLE_KW) } - #[inline] - pub fn update_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::UPDATE_KW) - } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -13066,20 +13375,28 @@ impl LockingClause { support::children(&self.syntax) } #[inline] - pub fn for_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::FOR_KW) + pub fn for_key_share(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn key_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::KEY_KW) + pub fn for_no_key_update(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn locked_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::LOCKED_KW) + pub fn for_share(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn no_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::NO_KW) + pub fn for_update(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn for_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::FOR_KW) + } + #[inline] + pub fn locked_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::LOCKED_KW) } #[inline] pub fn nowait_token(&self) -> Option { @@ -13090,17 +13407,9 @@ impl LockingClause { support::token(&self.syntax, SyntaxKind::OF_KW) } #[inline] - pub fn share_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::SHARE_KW) - } - #[inline] pub fn skip_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::SKIP_KW) } - #[inline] - pub fn update_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::UPDATE_KW) - } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -13451,64 +13760,64 @@ pub struct Move { } impl Move { #[inline] - pub fn literal(&self) -> Option { + pub fn absolute(&self) -> Option { support::child(&self.syntax) } #[inline] - pub fn name_ref(&self) -> Option { + pub fn all(&self) -> Option { support::child(&self.syntax) } #[inline] - pub fn semicolon_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::SEMICOLON) + pub fn backward(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn absolute_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::ABSOLUTE_KW) + pub fn first(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn all_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::ALL_KW) + pub fn forward(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn backward_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::BACKWARD_KW) + pub fn last(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn first_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::FIRST_KW) + pub fn literal(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn forward_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::FORWARD_KW) + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn from_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::FROM_KW) + pub fn next(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn in_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::IN_KW) + pub fn prior(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn last_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::LAST_KW) + pub fn relative(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn move_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::MOVE_KW) + pub fn semicolon_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SEMICOLON) } #[inline] - pub fn next_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::NEXT_KW) + pub fn from_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::FROM_KW) } #[inline] - pub fn prior_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::PRIOR_KW) + pub fn in_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::IN_KW) } #[inline] - pub fn relative_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::RELATIVE_KW) + pub fn move_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::MOVE_KW) } } @@ -13583,6 +13892,17 @@ impl Neqb { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Next { + pub(crate) syntax: SyntaxNode, +} +impl Next { + #[inline] + pub fn next_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::NEXT_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct NoAction { pub(crate) syntax: SyntaxNode, @@ -13690,6 +14010,21 @@ impl NoInheritTable { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct NoOthers { + pub(crate) syntax: SyntaxNode, +} +impl NoOthers { + #[inline] + pub fn no_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::NO_KW) + } + #[inline] + pub fn others_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::OTHERS_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct NoProperties { pub(crate) syntax: SyntaxNode, @@ -15474,6 +15809,17 @@ impl PrimaryKeyConstraint { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Prior { + pub(crate) syntax: SyntaxNode, +} +impl Prior { + #[inline] + pub fn prior_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::PRIOR_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct PrivilegeTarget { pub(crate) syntax: SyntaxNode, @@ -15984,6 +16330,21 @@ impl RelationName { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Relative { + pub(crate) syntax: SyntaxNode, +} +impl Relative { + #[inline] + pub fn literal(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn relative_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::RELATIVE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ReleaseSavepoint { pub(crate) syntax: SyntaxNode, @@ -16216,14 +16577,38 @@ pub struct ReplicaIdentity { pub(crate) syntax: SyntaxNode, } impl ReplicaIdentity { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn default_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DEFAULT_KW) + } + #[inline] + pub fn full_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::FULL_KW) + } #[inline] pub fn identity_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::IDENTITY_KW) } #[inline] + pub fn index_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::INDEX_KW) + } + #[inline] + pub fn nothing_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::NOTHING_KW) + } + #[inline] pub fn replica_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::REPLICA_KW) } + #[inline] + pub fn using_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::USING_KW) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -16354,6 +16739,10 @@ pub struct Restart { pub(crate) syntax: SyntaxNode, } impl Restart { + #[inline] + pub fn literal(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn restart_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::RESTART_KW) @@ -16935,6 +17324,21 @@ impl Row { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct RowExclusive { + pub(crate) syntax: SyntaxNode, +} +impl RowExclusive { + #[inline] + pub fn exclusive_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::EXCLUSIVE_KW) + } + #[inline] + pub fn row_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ROW_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct RowList { pub(crate) syntax: SyntaxNode, @@ -16946,11 +17350,30 @@ impl RowList { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct RowShare { + pub(crate) syntax: SyntaxNode, +} +impl RowShare { + #[inline] + pub fn row_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ROW_KW) + } + #[inline] + pub fn share_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SHARE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct RowsFuncOption { pub(crate) syntax: SyntaxNode, } impl RowsFuncOption { + #[inline] + pub fn literal(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn rows_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::ROWS_KW) @@ -17520,6 +17943,21 @@ impl ServerName { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct SessionAuthorization { + pub(crate) syntax: SyntaxNode, +} +impl SessionAuthorization { + #[inline] + pub fn authorization_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::AUTHORIZATION_KW) + } + #[inline] + pub fn session_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SESSION_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Set { pub(crate) syntax: SyntaxNode, @@ -17665,11 +18103,19 @@ pub struct SetCompression { pub(crate) syntax: SyntaxNode, } impl SetCompression { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn compression_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::COMPRESSION_KW) } #[inline] + pub fn default_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DEFAULT_KW) + } + #[inline] pub fn set_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::SET_KW) } @@ -17858,8 +18304,8 @@ pub struct SetFuncOption { } impl SetFuncOption { #[inline] - pub fn set_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::SET_KW) + pub fn set_config_param(&self) -> Option { + support::child(&self.syntax) } } @@ -17868,6 +18314,22 @@ pub struct SetGenerated { pub(crate) syntax: SyntaxNode, } impl SetGenerated { + #[inline] + pub fn always_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ALWAYS_KW) + } + #[inline] + pub fn by_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::BY_KW) + } + #[inline] + pub fn default_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DEFAULT_KW) + } + #[inline] + pub fn generated_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::GENERATED_KW) + } #[inline] pub fn set_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::SET_KW) @@ -18062,6 +18524,10 @@ pub struct SetSequenceOption { pub(crate) syntax: SyntaxNode, } impl SetSequenceOption { + #[inline] + pub fn sequence_option(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn set_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::SET_KW) @@ -18131,6 +18597,14 @@ pub struct SetStatistics { pub(crate) syntax: SyntaxNode, } impl SetStatistics { + #[inline] + pub fn literal(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn default_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DEFAULT_KW) + } #[inline] pub fn set_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::SET_KW) @@ -18146,6 +18620,14 @@ pub struct SetStorage { pub(crate) syntax: SyntaxNode, } impl SetStorage { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn default_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DEFAULT_KW) + } #[inline] pub fn set_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::SET_KW) @@ -18295,53 +18777,86 @@ impl SetWithoutOids { } #[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct Show { +pub struct Share { pub(crate) syntax: SyntaxNode, } -impl Show { +impl Share { #[inline] - pub fn path(&self) -> Option { - support::child(&self.syntax) + pub fn share_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SHARE_KW) } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ShareRowExclusive { + pub(crate) syntax: SyntaxNode, +} +impl ShareRowExclusive { #[inline] - pub fn semicolon_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::SEMICOLON) + pub fn exclusive_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::EXCLUSIVE_KW) } #[inline] - pub fn all_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::ALL_KW) + pub fn row_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ROW_KW) } #[inline] - pub fn authorization_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::AUTHORIZATION_KW) + pub fn share_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SHARE_KW) } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ShareUpdateExclusive { + pub(crate) syntax: SyntaxNode, +} +impl ShareUpdateExclusive { #[inline] - pub fn isolation_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::ISOLATION_KW) + pub fn exclusive_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::EXCLUSIVE_KW) } #[inline] - pub fn level_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::LEVEL_KW) + pub fn share_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SHARE_KW) } #[inline] - pub fn session_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::SESSION_KW) + pub fn update_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::UPDATE_KW) } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Show { + pub(crate) syntax: SyntaxNode, +} +impl Show { #[inline] - pub fn show_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::SHOW_KW) + pub fn all(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn time_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::TIME_KW) + pub fn path(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn transaction_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::TRANSACTION_KW) + pub fn session_authorization(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn zone_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::ZONE_KW) + pub fn time_zone(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn transaction_isolation_level(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn semicolon_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SEMICOLON) + } + #[inline] + pub fn show_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SHOW_KW) } } @@ -18656,6 +19171,10 @@ pub struct SupportFuncOption { pub(crate) syntax: SyntaxNode, } impl SupportFuncOption { + #[inline] + pub fn path(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn support_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::SUPPORT_KW) @@ -18828,6 +19347,17 @@ impl Temp { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Ties { + pub(crate) syntax: SyntaxNode, +} +impl Ties { + #[inline] + pub fn ties_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::TIES_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct TimeType { pub(crate) syntax: SyntaxNode, @@ -18863,6 +19393,21 @@ impl TimeType { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct TimeZone { + pub(crate) syntax: SyntaxNode, +} +impl TimeZone { + #[inline] + pub fn time_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::TIME_KW) + } + #[inline] + pub fn zone_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ZONE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Timing { pub(crate) syntax: SyntaxNode, @@ -18886,6 +19431,25 @@ impl Timing { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct TransactionIsolationLevel { + pub(crate) syntax: SyntaxNode, +} +impl TransactionIsolationLevel { + #[inline] + pub fn isolation_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ISOLATION_KW) + } + #[inline] + pub fn level_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::LEVEL_KW) + } + #[inline] + pub fn transaction_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::TRANSACTION_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct TransactionModeList { pub(crate) syntax: SyntaxNode, @@ -18929,6 +19493,10 @@ pub struct TransformFuncOption { pub(crate) syntax: SyntaxNode, } impl TransformFuncOption { + #[inline] + pub fn types(&self) -> AstChildren { + support::children(&self.syntax) + } #[inline] pub fn transform_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::TRANSFORM_KW) @@ -19120,6 +19688,36 @@ impl TupleExpr { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct UnboundedFollowing { + pub(crate) syntax: SyntaxNode, +} +impl UnboundedFollowing { + #[inline] + pub fn following_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::FOLLOWING_KW) + } + #[inline] + pub fn unbounded_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::UNBOUNDED_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct UnboundedPreceding { + pub(crate) syntax: SyntaxNode, +} +impl UnboundedPreceding { + #[inline] + pub fn preceding_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::PRECEDING_KW) + } + #[inline] + pub fn unbounded_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::UNBOUNDED_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct UnicodeNormalForm { pub(crate) syntax: SyntaxNode, @@ -20739,6 +21337,15 @@ pub enum Expr { TupleExpr(TupleExpr), } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub enum FrameBound { + CurrentRow(CurrentRow), + ExprFollowing(ExprFollowing), + ExprPreceding(ExprPreceding), + UnboundedFollowing(UnboundedFollowing), + UnboundedPreceding(UnboundedPreceding), +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum FuncOption { AsFuncOption(AsFuncOption), @@ -20788,6 +21395,18 @@ pub enum JsonBehavior { JsonBehaviorUnknown(JsonBehaviorUnknown), } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub enum LockMode { + AccessExclusive(AccessExclusive), + AccessShare(AccessShare), + Exclusive(Exclusive), + RowExclusive(RowExclusive), + RowShare(RowShare), + Share(Share), + ShareRowExclusive(ShareRowExclusive), + ShareUpdateExclusive(ShareUpdateExclusive), +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum MatchType { MatchFull(MatchFull), @@ -21166,6 +21785,60 @@ pub enum WithQuery { Update(Update), Values(Values), } +impl AstNode for Absolute { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ABSOLUTE + } + #[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 AccessExclusive { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ACCESS_EXCLUSIVE + } + #[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 AccessShare { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ACCESS_SHARE + } + #[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 AddAttribute { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -21382,6 +22055,24 @@ impl AstNode for Alias { &self.syntax } } +impl AstNode for All { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ALL + } + #[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 AllFn { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -22570,6 +23261,24 @@ impl AstNode for AttributeValue { &self.syntax } } +impl AstNode for Backward { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::BACKWARD + } + #[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 BeforeValue { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -24190,6 +24899,24 @@ impl AstNode for CreateView { &self.syntax } } +impl AstNode for CurrentRow { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::CURRENT_ROW + } + #[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 CustomOp { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -25972,6 +26699,24 @@ impl AstNode for ExcludeConstraint { &self.syntax } } +impl AstNode for Exclusive { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::EXCLUSIVE + } + #[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 Execute { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -26062,6 +26807,42 @@ impl AstNode for ExprAsNameList { &self.syntax } } +impl AstNode for ExprFollowing { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::EXPR_FOLLOWING + } + #[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 ExprPreceding { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::EXPR_PRECEDING + } + #[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 ExprType { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -26224,6 +27005,60 @@ impl AstNode for FilterClause { &self.syntax } } +impl AstNode for First { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::FIRST + } + #[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 ForKeyShare { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::FOR_KEY_SHARE + } + #[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 ForNoKeyUpdate { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::FOR_NO_KEY_UPDATE + } + #[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 ForPortionOf { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -26260,6 +27095,42 @@ impl AstNode for ForProvider { &self.syntax } } +impl AstNode for ForShare { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::FOR_SHARE + } + #[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 ForUpdate { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::FOR_UPDATE + } + #[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 ForceRls { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -26296,6 +27167,42 @@ impl AstNode for ForeignKeyConstraint { &self.syntax } } +impl AstNode for Forward { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::FORWARD + } + #[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 FrameBetween { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::FRAME_BETWEEN + } + #[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 FrameClause { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -26314,6 +27221,24 @@ impl AstNode for FrameClause { &self.syntax } } +impl AstNode for FrameExclude { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::FRAME_EXCLUDE + } + #[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 FromClause { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -26512,6 +27437,24 @@ impl AstNode for GraphTableFn { &self.syntax } } +impl AstNode for Group { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::GROUP + } + #[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 GroupByClause { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -28078,6 +29021,24 @@ impl AstNode for LanguageFuncOption { &self.syntax } } +impl AstNode for Last { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::LAST + } + #[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 LeakproofFuncOption { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -28618,6 +29579,24 @@ impl AstNode for Neqb { &self.syntax } } +impl AstNode for Next { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::NEXT + } + #[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 NoAction { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -28708,6 +29687,24 @@ impl AstNode for NoInheritTable { &self.syntax } } +impl AstNode for NoOthers { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::NO_OTHERS + } + #[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 NoProperties { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -30148,6 +31145,24 @@ impl AstNode for PrimaryKeyConstraint { &self.syntax } } +impl AstNode for Prior { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::PRIOR + } + #[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 PrivilegeTarget { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -30472,6 +31487,24 @@ impl AstNode for RelationName { &self.syntax } } +impl AstNode for Relative { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::RELATIVE + } + #[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 ReleaseSavepoint { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -31066,6 +32099,24 @@ impl AstNode for Row { &self.syntax } } +impl AstNode for RowExclusive { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ROW_EXCLUSIVE + } + #[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 RowList { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -31084,6 +32135,24 @@ impl AstNode for RowList { &self.syntax } } +impl AstNode for RowShare { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ROW_SHARE + } + #[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 RowsFuncOption { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -31336,6 +32405,24 @@ impl AstNode for ServerName { &self.syntax } } +impl AstNode for SessionAuthorization { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::SESSION_AUTHORIZATION + } + #[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 Set { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -31948,6 +33035,60 @@ impl AstNode for SetWithoutOids { &self.syntax } } +impl AstNode for Share { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::SHARE + } + #[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 ShareRowExclusive { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::SHARE_ROW_EXCLUSIVE + } + #[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 ShareUpdateExclusive { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::SHARE_UPDATE_EXCLUSIVE + } + #[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 Show { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -32416,6 +33557,24 @@ impl AstNode for Temp { &self.syntax } } +impl AstNode for Ties { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::TIES + } + #[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 TimeType { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -32434,6 +33593,24 @@ impl AstNode for TimeType { &self.syntax } } +impl AstNode for TimeZone { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::TIME_ZONE + } + #[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 Timing { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -32452,6 +33629,24 @@ impl AstNode for Timing { &self.syntax } } +impl AstNode for TransactionIsolationLevel { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::TRANSACTION_ISOLATION_LEVEL + } + #[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 TransactionModeList { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -32632,6 +33827,42 @@ impl AstNode for TupleExpr { &self.syntax } } +impl AstNode for UnboundedFollowing { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::UNBOUNDED_FOLLOWING + } + #[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 UnboundedPreceding { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::UNBOUNDED_PRECEDING + } + #[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 UnicodeNormalForm { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -35615,6 +36846,77 @@ impl From for Expr { Expr::TupleExpr(node) } } +impl AstNode for FrameBound { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + matches!( + kind, + SyntaxKind::CURRENT_ROW + | SyntaxKind::EXPR_FOLLOWING + | SyntaxKind::EXPR_PRECEDING + | SyntaxKind::UNBOUNDED_FOLLOWING + | SyntaxKind::UNBOUNDED_PRECEDING + ) + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + let res = match syntax.kind() { + SyntaxKind::CURRENT_ROW => FrameBound::CurrentRow(CurrentRow { syntax }), + SyntaxKind::EXPR_FOLLOWING => FrameBound::ExprFollowing(ExprFollowing { syntax }), + SyntaxKind::EXPR_PRECEDING => FrameBound::ExprPreceding(ExprPreceding { syntax }), + SyntaxKind::UNBOUNDED_FOLLOWING => { + FrameBound::UnboundedFollowing(UnboundedFollowing { syntax }) + } + SyntaxKind::UNBOUNDED_PRECEDING => { + FrameBound::UnboundedPreceding(UnboundedPreceding { syntax }) + } + _ => { + return None; + } + }; + Some(res) + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + match self { + FrameBound::CurrentRow(it) => &it.syntax, + FrameBound::ExprFollowing(it) => &it.syntax, + FrameBound::ExprPreceding(it) => &it.syntax, + FrameBound::UnboundedFollowing(it) => &it.syntax, + FrameBound::UnboundedPreceding(it) => &it.syntax, + } + } +} +impl From for FrameBound { + #[inline] + fn from(node: CurrentRow) -> FrameBound { + FrameBound::CurrentRow(node) + } +} +impl From for FrameBound { + #[inline] + fn from(node: ExprFollowing) -> FrameBound { + FrameBound::ExprFollowing(node) + } +} +impl From for FrameBound { + #[inline] + fn from(node: ExprPreceding) -> FrameBound { + FrameBound::ExprPreceding(node) + } +} +impl From for FrameBound { + #[inline] + fn from(node: UnboundedFollowing) -> FrameBound { + FrameBound::UnboundedFollowing(node) + } +} +impl From for FrameBound { + #[inline] + fn from(node: UnboundedPreceding) -> FrameBound { + FrameBound::UnboundedPreceding(node) + } +} impl AstNode for FuncOption { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -36040,6 +37342,104 @@ impl From for JsonBehavior { JsonBehavior::JsonBehaviorUnknown(node) } } +impl AstNode for LockMode { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + matches!( + kind, + SyntaxKind::ACCESS_EXCLUSIVE + | SyntaxKind::ACCESS_SHARE + | SyntaxKind::EXCLUSIVE + | SyntaxKind::ROW_EXCLUSIVE + | SyntaxKind::ROW_SHARE + | SyntaxKind::SHARE + | SyntaxKind::SHARE_ROW_EXCLUSIVE + | SyntaxKind::SHARE_UPDATE_EXCLUSIVE + ) + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + let res = match syntax.kind() { + SyntaxKind::ACCESS_EXCLUSIVE => LockMode::AccessExclusive(AccessExclusive { syntax }), + SyntaxKind::ACCESS_SHARE => LockMode::AccessShare(AccessShare { syntax }), + SyntaxKind::EXCLUSIVE => LockMode::Exclusive(Exclusive { syntax }), + SyntaxKind::ROW_EXCLUSIVE => LockMode::RowExclusive(RowExclusive { syntax }), + SyntaxKind::ROW_SHARE => LockMode::RowShare(RowShare { syntax }), + SyntaxKind::SHARE => LockMode::Share(Share { syntax }), + SyntaxKind::SHARE_ROW_EXCLUSIVE => { + LockMode::ShareRowExclusive(ShareRowExclusive { syntax }) + } + SyntaxKind::SHARE_UPDATE_EXCLUSIVE => { + LockMode::ShareUpdateExclusive(ShareUpdateExclusive { syntax }) + } + _ => { + return None; + } + }; + Some(res) + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + match self { + LockMode::AccessExclusive(it) => &it.syntax, + LockMode::AccessShare(it) => &it.syntax, + LockMode::Exclusive(it) => &it.syntax, + LockMode::RowExclusive(it) => &it.syntax, + LockMode::RowShare(it) => &it.syntax, + LockMode::Share(it) => &it.syntax, + LockMode::ShareRowExclusive(it) => &it.syntax, + LockMode::ShareUpdateExclusive(it) => &it.syntax, + } + } +} +impl From for LockMode { + #[inline] + fn from(node: AccessExclusive) -> LockMode { + LockMode::AccessExclusive(node) + } +} +impl From for LockMode { + #[inline] + fn from(node: AccessShare) -> LockMode { + LockMode::AccessShare(node) + } +} +impl From for LockMode { + #[inline] + fn from(node: Exclusive) -> LockMode { + LockMode::Exclusive(node) + } +} +impl From for LockMode { + #[inline] + fn from(node: RowExclusive) -> LockMode { + LockMode::RowExclusive(node) + } +} +impl From for LockMode { + #[inline] + fn from(node: RowShare) -> LockMode { + LockMode::RowShare(node) + } +} +impl From for LockMode { + #[inline] + fn from(node: Share) -> LockMode { + LockMode::Share(node) + } +} +impl From for LockMode { + #[inline] + fn from(node: ShareRowExclusive) -> LockMode { + LockMode::ShareRowExclusive(node) + } +} +impl From for LockMode { + #[inline] + fn from(node: ShareUpdateExclusive) -> LockMode { + LockMode::ShareUpdateExclusive(node) + } +} impl AstNode for MatchType { #[inline] fn can_cast(kind: SyntaxKind) -> bool { diff --git a/crates/squawk_syntax/src/ast/node_ext.rs b/crates/squawk_syntax/src/ast/node_ext.rs index f2e3e8bb..849b9b0e 100644 --- a/crates/squawk_syntax/src/ast/node_ext.rs +++ b/crates/squawk_syntax/src/ast/node_ext.rs @@ -379,6 +379,17 @@ impl ast::BetweenExpr { } } +impl ast::FrameBetween { + #[inline] + pub fn start(&self) -> Option { + support::children(&self.syntax).nth(0) + } + #[inline] + pub fn end(&self) -> Option { + support::children(&self.syntax).nth(1) + } +} + impl ast::WhenClause { #[inline] pub fn condition(&self) -> Option { diff --git a/crates/squawk_syntax/src/postgresql.ungram b/crates/squawk_syntax/src/postgresql.ungram index 7a34eb30..2e5db267 100644 --- a/crates/squawk_syntax/src/postgresql.ungram +++ b/crates/squawk_syntax/src/postgresql.ungram @@ -1757,14 +1757,26 @@ IntoClause = LockingClause = 'for' ( - 'no' 'key' 'update' - | 'key' 'share' - | 'share' - | 'update' + ForNoKeyUpdate + | ForKeyShare + | ForShare + | ForUpdate ) ('of' (Expr (',' Expr)*))? ('skip' 'locked' | 'nowait')? +ForNoKeyUpdate = + 'no' 'key' 'update' + +ForKeyShare = + 'key' 'share' + +ForShare = + 'share' + +ForUpdate = + 'update' + NullsFirst = 'nulls' 'first' @@ -1845,26 +1857,51 @@ ExcludeConstraint = FrameClause = ('range' | 'rows' | 'groups') + (FrameBetween | FrameBound) + FrameExclude? + +FrameBetween = + 'between' start:FrameBound 'and' end:FrameBound + +FrameBound = + CurrentRow +| UnboundedPreceding +| UnboundedFollowing +| ExprPreceding +| ExprFollowing + +UnboundedPreceding = + 'unbounded' 'preceding' + +UnboundedFollowing = + 'unbounded' 'following' + +ExprPreceding = + Expr 'preceding' + +ExprFollowing = + Expr 'following' + +FrameExclude = + 'exclude' ( - 'between' - ( - 'current' 'row' - | 'unbounded' ('preceding' | 'following') - | Expr ('preceding' | 'following') - ) - 'and' - ( - 'current' 'row' - | 'unbounded' ('preceding' | 'following') - | Expr ('preceding' | 'following') - ) - | ( - 'current' 'row' - | 'unbounded' ('preceding' | 'following') - | Expr ('preceding' | 'following') - ) + CurrentRow + | Group + | Ties + | NoOthers ) - ('exclude' ('current' 'row' | 'group' | 'ties' | 'no' 'others'))? + +CurrentRow = + 'current' 'row' + +Group = + 'group' + +Ties = + 'ties' + +NoOthers = + 'no' 'others' WindowSpec = '#ident'? ('partition' 'by' (Expr (',' Expr)*))? OrderByClause? FrameClause? @@ -3067,21 +3104,43 @@ IntoSchema = Lock = 'lock' 'table'? TableList - ('in' - ( - 'access' 'share' - | 'row' 'share' - | 'access' 'exclusive' - | 'row' 'exclusive' - | 'share' 'row' 'exclusive' - | 'share' 'update' 'exclusive' - | 'share' - | 'exclusive' - ) - 'mode' - )? + ('in' LockMode 'mode')? 'nowait'? ';'? +LockMode = + AccessShare +| RowShare +| AccessExclusive +| RowExclusive +| ShareRowExclusive +| ShareUpdateExclusive +| Share +| Exclusive + +AccessShare = + 'access' 'share' + +RowShare = + 'row' 'share' + +AccessExclusive = + 'access' 'exclusive' + +RowExclusive = + 'row' 'exclusive' + +ShareRowExclusive = + 'share' 'row' 'exclusive' + +ShareUpdateExclusive = + 'share' 'update' 'exclusive' + +Share = + 'share' + +Exclusive = + 'exclusive' + Reassign = 'reassign' 'owned' 'by' old_roles:RoleRefList 'to' new_roles:RoleRefList ';'? @@ -3219,13 +3278,15 @@ Do = Move = 'move' ( - 'next' - | 'prior' - | 'first' - | 'last' - | 'all' - | ('relative' | 'absolute') Literal - | ('forward' | 'backward') ('all' | Literal)? + Next + | Prior + | First + | Last + | All + | Relative + | Absolute + | Forward + | Backward | Literal )? ('from' | 'in')? NameRef ';'? @@ -3233,17 +3294,43 @@ Move = Fetch = 'fetch' ( - 'next' - | 'prior' - | 'first' - | 'last' - | 'all' - | ('relative' | 'absolute') Literal - | ('forward' | 'backward') ('all' | Literal)? + Next + | Prior + | First + | Last + | All + | Relative + | Absolute + | Forward + | Backward | Literal )? ('from' | 'in')? NameRef ';'? +Next = + 'next' + +Prior = + 'prior' + +First = + 'first' + +Last = + 'last' + +Relative = + 'relative' Literal + +Absolute = + 'absolute' Literal + +Forward = + 'forward' ('all' | Literal)? + +Backward = + 'backward' ('all' | Literal)? + Close = 'close' ('all' | NameRef) ';'? @@ -3421,18 +3508,30 @@ ConfigValue = Show = 'show' ( - 'all' - | 'session' 'authorization' - | 'transaction' 'isolation' 'level' - | 'time' 'zone' + All + | SessionAuthorization + | TransactionIsolationLevel + | TimeZone | Path ) ';'? +All = + 'all' + +SessionAuthorization = + 'session' 'authorization' + +TransactionIsolationLevel = + 'transaction' 'isolation' 'level' + +TimeZone = + 'time' 'zone' + LanguageFuncOption = 'language' NameRef TransformFuncOption = - 'transform' + 'transform' Type* WindowFuncOption = 'window' @@ -3456,22 +3555,22 @@ ParallelFuncOption = 'parallel' '#ident' CostFuncOption = - 'cost' + 'cost' Literal RowsFuncOption = - 'rows' + 'rows' Literal SupportFuncOption = - 'support' + 'support' Path SetFuncOption = - 'set' + SetConfigParam AsFuncOption = 'as' (definition:Literal | obj_file:Literal ',' link_symbol:Literal) ReplicaIdentity = - 'replica' 'identity' + 'replica' 'identity' ('default' | 'full' | 'nothing' | 'using' 'index' NameRef) OfType = 'of' Type @@ -3499,37 +3598,37 @@ NoInherit = 'no' 'inherit' Path EnableTrigger = - 'enable' 'trigger' + 'enable' 'trigger' (NameRef | 'all' | 'user')? EnableReplicaTrigger = - 'enable' 'replica' 'trigger' + 'enable' 'replica' 'trigger' NameRef EnableReplicaRule = - 'enable' 'replica' 'rule' + 'enable' 'replica' 'rule' NameRef EnableAlwaysTrigger = - 'enable' 'always' 'trigger' + 'enable' 'always' 'trigger' NameRef EnableAlwaysRule = - 'enable' 'always' 'rule' + 'enable' 'always' 'rule' NameRef EnableRule = - 'enable' 'rule' + 'enable' 'rule' NameRef EnableRls = 'enable' 'row' 'level' 'security' DisableTrigger = - 'disable' 'trigger' + 'disable' 'trigger' (NameRef | 'all' | 'user')? DisableRls = 'disable' 'row' 'level' 'security' DisableRule = - 'disable' 'rule' + 'disable' 'rule' NameRef ClusterOn = - 'cluster' 'on' + 'cluster' 'on' NameRef DetachPartition = 'detach' 'partition' @@ -3633,13 +3732,13 @@ AlterColumn = 'alter' 'column'? NameRef option:AlterColumnOption Restart = - 'restart' 'with'? + 'restart' ('with'? Literal)? SetSequenceOption = - 'set' + 'set' SequenceOption SetGenerated = - 'set' + 'set' 'generated' ('always' | 'by' 'default') DropExpression = 'drop' 'expression' IfExists? @@ -3648,7 +3747,7 @@ DropIdentity = 'drop' 'identity' IfExists? AddGenerated = - 'add' + 'add' 'generated' ('always' | 'by' 'default') 'as' 'identity' SequenceOptionList? ResetOptions = 'reset' AttributeList @@ -3670,16 +3769,16 @@ SetExpression = 'set' 'expression' Expr SetStatistics = - 'set' 'statistics' + 'set' 'statistics' ('default' | Literal) SetOptions = 'set' AttributeList SetStorage = - 'set' 'storage' + 'set' 'storage' ('default' | NameRef) SetCompression = - 'set' 'compression' + 'set' 'compression' ('default' | NameRef) Collate = 'collate' Path