From 8da829e588118f05360d7c3a3d5aecc9b091daac Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Mon, 13 Oct 2025 00:32:04 -0400 Subject: [PATCH] parser: add AsName node for column aliases / column labels --- .../src/generated/syntax_kind.rs | 1 + crates/squawk_parser/src/grammar.rs | 20 +- .../tests__create_materialized_view_ok.snap | 9 +- .../snapshots/tests__create_view_ok.snap | 27 +- .../tests/snapshots/tests__delete_ok.snap | 9 +- .../tests/snapshots/tests__merge_pg17_ok.snap | 14 +- .../tests/snapshots/tests__misc_ok.snap | 396 ++++++++++-------- .../tests/snapshots/tests__select_err.snap | 32 +- .../snapshots/tests__select_funcs_ok.snap | 27 +- .../tests/snapshots/tests__select_ok.snap | 112 ++--- .../snapshots/tests__select_operators_ok.snap | 5 +- .../tests/snapshots/tests__update_ok.snap | 9 +- .../tests/snapshots/tests__values_ok.snap | 18 +- .../squawk_syntax/src/ast/generated/nodes.rs | 41 +- crates/squawk_syntax/src/postgresql.ungram | 5 +- 15 files changed, 418 insertions(+), 307 deletions(-) diff --git a/crates/squawk_parser/src/generated/syntax_kind.rs b/crates/squawk_parser/src/generated/syntax_kind.rs index 006e0d6e..176a60f6 100644 --- a/crates/squawk_parser/src/generated/syntax_kind.rs +++ b/crates/squawk_parser/src/generated/syntax_kind.rs @@ -596,6 +596,7 @@ pub enum SyntaxKind { ARRAY_EXPR, ARRAY_TYPE, AS_FUNC_OPTION, + AS_NAME, ATTACH_PARTITION, ATTRIBUTE_LIST, ATTRIBUTE_OPTION, diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 2d851bec..35b95e69 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -4714,23 +4714,23 @@ fn opt_target_el(p: &mut Parser) -> Option { Some(m.complete(p, TARGET)) } -fn opt_as_col_label(p: &mut Parser<'_>) -> bool { +fn opt_as_col_label(p: &mut Parser<'_>) { + let m = p.start(); if p.eat(AS_KW) { if p.at_ts(COL_LABEL_FIRST) { col_label(p); - true + m.complete(p, AS_NAME); } else { p.err_and_bump(&format!("expected column label, got {:?}", p.current())); - false + m.abandon(p); } + } else if p.at(FORMAT_KW) && p.nth_at(1, JSON_KW) { + m.abandon(p); + } else if p.at_ts(BARE_COL_LABEL_FIRST) { + col_label(p); + m.complete(p, AS_NAME); } else { - if p.at(FORMAT_KW) && p.nth_at(1, JSON_KW) { - return true; - } - if p.at_ts(BARE_COL_LABEL_FIRST) { - col_label(p); - } - true + m.abandon(p); } } diff --git a/crates/squawk_parser/tests/snapshots/tests__create_materialized_view_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_materialized_view_ok.snap index 72ed2528..cadb1d0c 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_materialized_view_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_materialized_view_ok.snap @@ -253,10 +253,11 @@ SOURCE_FILE LITERAL STRING "'country'" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "\"country\"" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "\"country\"" WHITESPACE " \n " FROM_CLAUSE FROM_KW "from" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap index 88883252..6661e2ab 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap @@ -52,10 +52,11 @@ SOURCE_FILE LITERAL STRING "'Hello World'" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "hello" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "hello" SEMICOLON ";" WHITESPACE "\n\n" CREATE_VIEW @@ -233,10 +234,11 @@ SOURCE_FILE IDENT "country_code" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "country" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "country" COMMA "," WHITESPACE "\n " TARGET @@ -293,10 +295,11 @@ SOURCE_FILE IDENT "id" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "avg_rating" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "avg_rating" WHITESPACE "\n " FROM_CLAUSE FROM_KW "FROM" diff --git a/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap b/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap index dcf8473a..53327ed1 100644 --- a/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__delete_ok.snap @@ -308,10 +308,11 @@ SOURCE_FILE IDENT "login_time" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "last_login" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "last_login" WHITESPACE "\n " FROM_CLAUSE FROM_KW "from" diff --git a/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap b/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap index c176dade..a48d4027 100644 --- a/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap @@ -377,18 +377,20 @@ SOURCE_FILE NAME_REF IDENT "u" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "bar" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "bar" COMMA "," WHITESPACE " " TARGET NAME_REF IDENT "t" WHITESPACE " " - NAME - IDENT "b" + AS_NAME + NAME + IDENT "b" COMMA "," WHITESPACE " " TARGET diff --git a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap index 23622441..80dc7fcb 100644 --- a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap @@ -522,10 +522,11 @@ SOURCE_FILE WHITESPACE "\n " R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "embedding" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "embedding" WHITESPACE "\n" R_PAREN ")" WHITESPACE "\n" @@ -616,10 +617,11 @@ SOURCE_FILE LITERAL STRING "'text'" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "\"text\"" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "\"text\"" COMMA "," WHITESPACE "\n " TARGET @@ -975,10 +977,11 @@ SOURCE_FILE WHITESPACE " " R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "interaction_date" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "interaction_date" COMMA "," WHITESPACE "\n " TARGET @@ -1030,10 +1033,11 @@ SOURCE_FILE STRING "'a'" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "a_counts" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "a_counts" COMMA "," WHITESPACE "\n " TARGET @@ -1085,10 +1089,11 @@ SOURCE_FILE STRING "'b'" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "b_counts" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "b_counts" WHITESPACE "\n" FROM_CLAUSE FROM_KW "FROM" @@ -3352,10 +3357,11 @@ SOURCE_FILE LITERAL STRING "'name'" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "profile" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "profile" COMMA "," WHITESPACE "\n " TARGET @@ -3369,10 +3375,11 @@ SOURCE_FILE LITERAL STRING "'id'" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "id" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "id" COMMA "," WHITESPACE "\n " TARGET @@ -3386,10 +3393,11 @@ SOURCE_FILE LITERAL STRING "'title'" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "title" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "title" WHITESPACE "\n" FROM_CLAUSE FROM_KW "from" @@ -3497,10 +3505,11 @@ SOURCE_FILE LITERAL STRING "'id'" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "id" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "id" COMMA "," WHITESPACE "\n " TARGET @@ -3514,10 +3523,11 @@ SOURCE_FILE LITERAL STRING "'title'" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "title" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "title" COMMA "," WHITESPACE "\n " TARGET @@ -3537,10 +3547,11 @@ SOURCE_FILE LITERAL STRING "'name'" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - NAME_KW "name" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + NAME_KW "name" COMMA "," WHITESPACE "\n " TARGET @@ -3554,10 +3565,11 @@ SOURCE_FILE LITERAL STRING "'startTime'" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "start_time" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "start_time" WHITESPACE "\n" FROM_CLAUSE FROM_KW "from" @@ -3688,10 +3700,11 @@ SOURCE_FILE IDENT "event_time" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - HOUR_KW "hour" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + HOUR_KW "hour" COMMA "," WHITESPACE "\n " TARGET @@ -3703,10 +3716,11 @@ SOURCE_FILE STAR "*" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "events" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "events" COMMA "," WHITESPACE "\n " TARGET @@ -3721,10 +3735,11 @@ SOURCE_FILE IDENT "user_id" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "users" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "users" WHITESPACE "\n" FROM_CLAUSE FROM_KW "FROM" @@ -4639,10 +4654,11 @@ SOURCE_FILE WHITESPACE "\n " R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "rolling_avg" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "rolling_avg" WHITESPACE "\n" FROM_CLAUSE FROM_KW "FROM" @@ -4716,10 +4732,11 @@ SOURCE_FILE WHITESPACE "\n " R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "rolling_avg" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "rolling_avg" WHITESPACE "\n" FROM_CLAUSE FROM_KW "FROM" @@ -4748,10 +4765,11 @@ SOURCE_FILE TIMESTAMP_KW "timestamp" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - MONTH_KW "month" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + MONTH_KW "month" COMMA "," WHITESPACE "\n " TARGET @@ -4769,10 +4787,11 @@ SOURCE_FILE IDENT "revenue" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "revenue" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "revenue" COMMA "," WHITESPACE "\n " TARGET @@ -4825,10 +4844,11 @@ SOURCE_FILE WHITESPACE "\n " R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "running_total" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "running_total" WHITESPACE "\n" FROM_CLAUSE FROM_KW "FROM" @@ -4885,10 +4905,11 @@ SOURCE_FILE TIMESTAMP_KW "timestamp" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - MONTH_KW "month" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + MONTH_KW "month" COMMA "," WHITESPACE "\n " TARGET @@ -4903,10 +4924,11 @@ SOURCE_FILE IDENT "user_id" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "users" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "users" COMMA "," WHITESPACE "\n " TARGET @@ -4919,10 +4941,11 @@ SOURCE_FILE IDENT "revenue" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "revenue" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "revenue" WHITESPACE "\n " FROM_CLAUSE FROM_KW "FROM" @@ -5034,10 +5057,11 @@ SOURCE_FILE WHITESPACE "\n " END_KW "END" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "segment" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "segment" WHITESPACE "\n " FROM_CLAUSE FROM_KW "FROM" @@ -5078,10 +5102,11 @@ SOURCE_FILE IDENT "user_id" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "users" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "users" COMMA "," WHITESPACE "\n " TARGET @@ -5094,10 +5119,11 @@ SOURCE_FILE IDENT "revenue" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "revenue" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "revenue" WHITESPACE "\n" FROM_CLAUSE FROM_KW "FROM" @@ -5182,10 +5208,11 @@ SOURCE_FILE TIMESTAMP_KW "timestamp" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - MONTH_KW "month" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + MONTH_KW "month" COMMA "," WHITESPACE "\n " TARGET @@ -5197,10 +5224,11 @@ SOURCE_FILE STAR "*" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "events" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "events" COMMA "," WHITESPACE "\n " TARGET @@ -5215,10 +5243,11 @@ SOURCE_FILE IDENT "user_id" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "users" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "users" WHITESPACE "\n" FROM_CLAUSE FROM_KW "FROM" @@ -5773,10 +5802,11 @@ SOURCE_FILE IDENT "qty" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "total_quantity" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "total_quantity" WHITESPACE "\n" FROM_CLAUSE FROM_KW "FROM" @@ -6114,10 +6144,11 @@ SOURCE_FILE TIME_KW "time" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - DAY_KW "day" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + DAY_KW "day" COMMA "," WHITESPACE "\n " TARGET @@ -6141,10 +6172,11 @@ SOURCE_FILE CURRENT_KW "current" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "actual_power" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "actual_power" COMMA "," WHITESPACE "\n " TARGET @@ -6186,10 +6218,11 @@ SOURCE_FILE INT_NUMBER "100" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "performance_ratio" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "performance_ratio" WHITESPACE "\n" FROM_CLAUSE FROM_KW "FROM" @@ -6311,10 +6344,11 @@ SOURCE_FILE IDENT "vibration_level" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "avg_vibration" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "avg_vibration" COMMA "," WHITESPACE "\n " TARGET @@ -6327,10 +6361,11 @@ SOURCE_FILE IDENT "vibration_level" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "stddev_vibration" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "stddev_vibration" WHITESPACE "\n " FROM_CLAUSE FROM_KW "FROM" @@ -6394,10 +6429,11 @@ SOURCE_FILE TIME_KW "time" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "bucket" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "bucket" COMMA "," WHITESPACE "\n " TARGET @@ -6429,10 +6465,11 @@ SOURCE_FILE NAME_REF IDENT "stddev_vibration" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "z_score" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "z_score" WHITESPACE "\n" FROM_CLAUSE FROM_KW "FROM" @@ -6549,10 +6586,11 @@ SOURCE_FILE TIME_KW "time" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - INTERVAL_KW "interval" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + INTERVAL_KW "interval" COMMA "," WHITESPACE "\n " TARGET @@ -6570,10 +6608,11 @@ SOURCE_FILE IDENT "available_power" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "total_power" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "total_power" COMMA "," WHITESPACE "\n " TARGET @@ -6586,10 +6625,11 @@ SOURCE_FILE IDENT "storage_capacity" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "total_storage" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "total_storage" WHITESPACE "\n" FROM_CLAUSE FROM_KW "FROM" @@ -6684,10 +6724,11 @@ SOURCE_FILE TIME_KW "time" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - HOUR_KW "hour" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + HOUR_KW "hour" COMMA "," WHITESPACE "\n " TARGET @@ -6700,10 +6741,11 @@ SOURCE_FILE IDENT "price" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "avg_price" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "avg_price" COMMA "," WHITESPACE "\n " TARGET @@ -6732,10 +6774,11 @@ SOURCE_FILE IDENT "price" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "price_75th" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "price_75th" WHITESPACE "\n " FROM_CLAUSE FROM_KW "FROM" @@ -6847,10 +6890,11 @@ SOURCE_FILE WHITESPACE "\n " END_KW "END" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "trading_signal" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "trading_signal" WHITESPACE "\n" FROM_CLAUSE FROM_KW "FROM" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_err.snap b/crates/squawk_parser/tests/snapshots/tests__select_err.snap index 56ed2ebb..478bc1e7 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_err.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_err.snap @@ -14,10 +14,11 @@ SOURCE_FILE LITERAL INT_NUMBER "42" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "x" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "x" COMMA "," WHITESPACE "\n " TARGET @@ -38,20 +39,22 @@ SOURCE_FILE COMMA "," R_BRACK "]" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "y" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "y" COMMA "," WHITESPACE "\n " TARGET LITERAL STRING "'hello world'" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "z" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "z" ERROR COMMA "," WHITESPACE "\n" @@ -105,8 +108,9 @@ SOURCE_FILE NAME_REF IDENT "b" WHITESPACE " " - NAME - IDENT "c" + AS_NAME + NAME + IDENT "c" WHITESPACE " " TARGET NAME_REF diff --git a/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap index 2be2e401..4aa8bc64 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap @@ -3477,10 +3477,11 @@ SOURCE_FILE STAR "*" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "unfiltered" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "unfiltered" COMMA "," WHITESPACE "\n " TARGET @@ -3508,10 +3509,11 @@ SOURCE_FILE INT_NUMBER "5" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "filtered" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "filtered" WHITESPACE "\n" FROM_CLAUSE FROM_KW "from" @@ -3776,10 +3778,11 @@ SOURCE_FILE IDENT "b" R_PAREN ")" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "c" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "c" WHITESPACE " " FROM_CLAUSE FROM_KW "from" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_ok.snap index 8180cd9c..f6a48c24 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_ok.snap @@ -1386,10 +1386,11 @@ SOURCE_FILE NAME_REF IDENT "foo" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "bar" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "bar" WHITESPACE " " FROM_CLAUSE FROM_KW "from" @@ -1408,8 +1409,9 @@ SOURCE_FILE NAME_REF IDENT "foo" WHITESPACE " " - NAME - IDENT "bar" + AS_NAME + NAME + IDENT "bar" WHITESPACE " " FROM_CLAUSE FROM_KW "from" @@ -1428,8 +1430,9 @@ SOURCE_FILE NAME_REF IDENT "foo" WHITESPACE " " - NAME - IDENT "bar" + AS_NAME + NAME + IDENT "bar" COMMA "," WHITESPACE " " TARGET @@ -1441,8 +1444,9 @@ SOURCE_FILE NAME_REF IDENT "x" WHITESPACE " " - NAME - IDENT "y" + AS_NAME + NAME + IDENT "y" WHITESPACE " " FROM_CLAUSE FROM_KW "from" @@ -5189,10 +5193,11 @@ SOURCE_FILE NAME_REF NAME_KW "name" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "mname" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "mname" COMMA "," WHITESPACE " " TARGET @@ -5590,10 +5595,11 @@ SOURCE_FILE LITERAL INT_NUMBER "1" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - SELECT_KW "select" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + SELECT_KW "select" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -5605,10 +5611,11 @@ SOURCE_FILE LITERAL INT_NUMBER "1" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - FROM_KW "from" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + FROM_KW "from" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -5620,10 +5627,11 @@ SOURCE_FILE LITERAL INT_NUMBER "1" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - WHERE_KW "where" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + WHERE_KW "where" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -5635,8 +5643,9 @@ SOURCE_FILE LITERAL INT_NUMBER "1" WHITESPACE " " - NAME - ALL_KW "all" + AS_NAME + NAME + ALL_KW "all" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- column labels that are also operators" @@ -5706,8 +5715,9 @@ SOURCE_FILE NAME_REF IDENT "bar" WHITESPACE " " - NAME - NULL_KW "null" + AS_NAME + NAME + NULL_KW "null" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -5723,8 +5733,9 @@ SOURCE_FILE NAME_REF IDENT "bar" WHITESPACE " " - NAME - DEFAULT_KW "default" + AS_NAME + NAME + DEFAULT_KW "default" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -5746,8 +5757,9 @@ SOURCE_FILE NAME_REF IDENT "c" WHITESPACE " " - NAME - DEFAULT_KW "default" + AS_NAME + NAME + DEFAULT_KW "default" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -5769,8 +5781,9 @@ SOURCE_FILE NAME_REF IDENT "c" WHITESPACE " " - NAME - NULL_KW "null" + AS_NAME + NAME + NULL_KW "null" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- select_special_funcs" @@ -5949,10 +5962,11 @@ SOURCE_FILE IDENT "ts" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - DAY_KW "day" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + DAY_KW "day" COMMA "," WHITESPACE " " TARGET @@ -5965,10 +5979,11 @@ SOURCE_FILE VALUE_KW "value" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "max_value" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "max_value" COMMA "," WHITESPACE " " TARGET @@ -5981,10 +5996,11 @@ SOURCE_FILE VALUE_KW "value" R_PAREN ")" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "min_value" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "min_value" WHITESPACE "\n" FROM_CLAUSE FROM_KW "FROM" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_operators_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_operators_ok.snap index b23e5334..da396b95 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_operators_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_operators_ok.snap @@ -1632,8 +1632,9 @@ SOURCE_FILE NAME_REF NFD_KW "nfd" WHITESPACE " " - NAME - NORMALIZED_KW "normalized" + AS_NAME + NAME + NORMALIZED_KW "normalized" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- pattern_matching" diff --git a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap index cc237f31..3878f412 100644 --- a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap @@ -361,10 +361,11 @@ SOURCE_FILE LITERAL INT_NUMBER "2" WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "bar" + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "bar" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- pg_docs" diff --git a/crates/squawk_parser/tests/snapshots/tests__values_ok.snap b/crates/squawk_parser/tests/snapshots/tests__values_ok.snap index e7b805f7..09215ebb 100644 --- a/crates/squawk_parser/tests/snapshots/tests__values_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__values_ok.snap @@ -54,20 +54,22 @@ SOURCE_FILE LITERAL INT_NUMBER "1" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "column1" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "column1" COMMA "," WHITESPACE " " TARGET LITERAL STRING "'one'" WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "column2" + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "column2" WHITESPACE "\n" UNION_KW "UNION" WHITESPACE " " diff --git a/crates/squawk_syntax/src/ast/generated/nodes.rs b/crates/squawk_syntax/src/ast/generated/nodes.rs index e4688ef1..2a3ed469 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -1201,6 +1201,21 @@ impl AsFuncOption { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct AsName { + pub(crate) syntax: SyntaxNode, +} +impl AsName { + #[inline] + pub fn name(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn as_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::AS_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct AtTimeZone { pub(crate) syntax: SyntaxNode, @@ -9640,21 +9655,17 @@ pub struct Target { } impl Target { #[inline] - pub fn expr(&self) -> Option { + pub fn as_name(&self) -> Option { support::child(&self.syntax) } #[inline] - pub fn name(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] pub fn star_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::STAR) } - #[inline] - pub fn as_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::AS_KW) - } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -11905,6 +11916,24 @@ impl AstNode for AsFuncOption { &self.syntax } } +impl AstNode for AsName { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::AS_NAME + } + #[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 AtTimeZone { #[inline] fn can_cast(kind: SyntaxKind) -> bool { diff --git a/crates/squawk_syntax/src/postgresql.ungram b/crates/squawk_syntax/src/postgresql.ungram index 1eba38dc..076deb36 100644 --- a/crates/squawk_syntax/src/postgresql.ungram +++ b/crates/squawk_syntax/src/postgresql.ungram @@ -571,7 +571,10 @@ DistinctClause = Target = '*' -| (Expr ('as' Name)?) +| Expr AsName? + +AsName = + 'as'? Name TargetList = Target (',' Target)*