From 0eaab3d34415efa7a6f8432f3eda23cf9cb8f1eb Mon Sep 17 00:00:00 2001 From: Kevin Longe <273747162+kvlonge@users.noreply.github.com> Date: Sat, 7 Nov 2026 12:32:19 +0000 Subject: [PATCH] fix(syntax): keep the span of a keyword alias on an ASOF JOIN table A keyword such as OFFSET or LIMIT used as the alias of an ASOF JOIN table, before MATCH_CONDITION, became an identifier with no span, so a located parse could not point at it. It now carries the alias token's span. --- crates/sqlquack-syntax/src/parser/_helpers/queries/joins.rs | 3 ++- crates/sqlquack-syntax/tests/parser/test_located.rs | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/sqlquack-syntax/src/parser/_helpers/queries/joins.rs b/crates/sqlquack-syntax/src/parser/_helpers/queries/joins.rs index bad2e866b..ef91c614b 100644 --- a/crates/sqlquack-syntax/src/parser/_helpers/queries/joins.rs +++ b/crates/sqlquack-syntax/src/parser/_helpers/queries/joins.rs @@ -217,10 +217,11 @@ impl Parser { .map(|t| t.text.eq_ignore_ascii_case("MATCH_CONDITION")) == Some(true) { + let alias_span = self.peek().span; let alias_name = self.advance_text()?; Expression::Alias(Box::new(Alias { this: table, - alias: Identifier::new(alias_name), + alias: Identifier::new(alias_name).with_span(alias_span), column_aliases: Vec::new(), alias_explicit_as: false, alias_keyword: None, diff --git a/crates/sqlquack-syntax/tests/parser/test_located.rs b/crates/sqlquack-syntax/tests/parser/test_located.rs index 5cda763f8..89d939531 100644 --- a/crates/sqlquack-syntax/tests/parser/test_located.rs +++ b/crates/sqlquack-syntax/tests/parser/test_located.rs @@ -66,6 +66,12 @@ fn given_a_located_parse_when_reading_a_node_then_its_span_covers_its_source() { pointer: "/0/select/from/expressions/0", expected_text: Ok("(SELECT id FROM recent) AS r"), }, + LocatedTestCase { + description: "a keyword alias of an ASOF JOIN table covers its name", + sql: "SELECT * FROM x ASOF JOIN y OFFSET MATCH_CONDITION (x.t >= OFFSET.t)", + pointer: "/0/select/joins/0/this/alias/alias", + expected_text: Ok("OFFSET"), + }, ]; for test_case in test_cases {