From 827d18ad4c3afe089e7b6572194f4c2068d834c4 Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Mon, 25 May 2026 11:14:15 -0400 Subject: [PATCH] parser: fix parsing period column rel: https://github.com/sbdchd/squawk/issues/1171 --- crates/squawk_parser/src/grammar.rs | 4 +- .../tests/data/ok/create_table.sql | 10 ++ .../snapshots/tests__create_table_ok.snap | 91 +++++++++++++++++++ 3 files changed, 104 insertions(+), 1 deletion(-) diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 91426b42..5cdc3d8c 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -3714,7 +3714,9 @@ fn column(p: &mut Parser<'_>, kind: ColumnDefKind) -> CompletedMarker { ColumnDefKind::NameRef => { // https://www.depesz.com/2024/10/03/waiting-for-postgresql-18-add-temporal-foreign-key-contraints/ // TODO: add validation to ensure this is in the right position - p.eat(PERIOD_KW); + if p.at(PERIOD_KW) && p.nth_at_ts(1, NAME_REF_FIRST) { + p.bump(PERIOD_KW); + } // supports parsing things like: // INSERT INTO tictactoe (game, board[1:3][1:3]) name_ref(p).map(|lhs| postfix_expr(p, lhs, true)); diff --git a/crates/squawk_parser/tests/data/ok/create_table.sql b/crates/squawk_parser/tests/data/ok/create_table.sql index c2749e92..85b39a48 100644 --- a/crates/squawk_parser/tests/data/ok/create_table.sql +++ b/crates/squawk_parser/tests/data/ok/create_table.sql @@ -398,3 +398,13 @@ CREATE TABLE addresses ( recipient text NOT NULL, PRIMARY KEY (id, valid_range WITHOUT OVERLAPS) ); + +-- regression test gh issue #1171 +-- allow period as a column name +CREATE TABLE t ( + symbol text, + period text, + year int, + quarter int, + PRIMARY KEY (symbol, period, year, quarter) +); diff --git a/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap index 66ed9109..0bfb82fe 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap @@ -3929,4 +3929,95 @@ SOURCE_FILE WHITESPACE "\n" R_PAREN ")" SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + COMMENT "-- regression test gh issue #1171" + WHITESPACE "\n" + COMMENT "-- allow period as a column name" + WHITESPACE "\n" + CREATE_KW "CREATE" + WHITESPACE " " + TABLE_KW "TABLE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "t" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "symbol" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + PERIOD_KW "period" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + YEAR_KW "year" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "quarter" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + COMMA "," + WHITESPACE "\n " + PRIMARY_KEY_CONSTRAINT + PRIMARY_KW "PRIMARY" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "symbol" + COMMA "," + WHITESPACE " " + COLUMN + NAME_REF + PERIOD_KW "period" + COMMA "," + WHITESPACE " " + COLUMN + NAME_REF + YEAR_KW "year" + COMMA "," + WHITESPACE " " + COLUMN + NAME_REF + IDENT "quarter" + R_PAREN ")" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" WHITESPACE "\n"