crprashant opened a new issue, #2416:
URL: https://github.com/apache/age/issues/2416

   # Followup: keyword-named aliases cannot be referenced back
   
   After #2415 lands, `safe_keywords` (e.g. `count`, `exists`, `coalesce`,
   `match`, `where`, `order`, `limit`, `distinct`, ...) are accepted as
   **aliases** in `RETURN`/`WITH`/`YIELD`/`UNWIND ... AS <name>`. However,
   once such an alias is bound, it still cannot be **referenced** as a
   variable later in the same query.
   
   ## Reproducer (against the branch from #2415)
   
   ```sql
   SELECT * FROM cypher('g', $$ WITH 1 AS count RETURN count $$) AS (a agtype);
   -- ERROR:  syntax error at end of input
   
   SELECT * FROM cypher('g', $$ UNWIND [1,2,3] AS count RETURN count $$) AS (a 
agtype);
   -- ERROR:  syntax error at end of input
   
   SELECT * FROM cypher('g', $$ WITH 5 AS limit RETURN limit + 1 AS x $$) AS (a 
agtype);
   -- ERROR:  syntax error at or near "+"
   ```
   
   The alias *binds* successfully (so projecting any literal under
   `AS count` works), but the parser cannot reduce a bare `COUNT` token to
   an `expr_var`, so the second mention of `count` fails.
   
   ## Root cause
   
   `expr_var: var_name` reads the variable through `var_name`, which still
   accepts only `symbolic_name` (i.e. `IDENTIFIER`). #2415 deliberately
   broadens only the alias-binding path (`var_name_alias`) because
   broadening `var_name` itself reintroduces ~156 shift/reduce conflicts
   in bison (keyword tokens collide with their syntactic roles inside
   expressions and patterns).
   
   A complete fix likely requires either:
   
   1. A scoped grammar refactor that resolves the conflicts (probably with
      precedence directives or a hand-written lookahead helper), or
   2. Lexer-level handling that re-tags an already-bound alias name as
      `IDENTIFIER` for the rest of the query (rejected by Apache AGE
      before — context-sensitive lexing), or
   3. A semantic-analysis pass that rewrites `expr_var` references to
      safe_keywords before parsing reaches the conflict (intrusive).
   
   ## Workaround today
   
   Use a plain identifier when the alias needs to be referenced:
   
   ```sql
   SELECT * FROM cypher('g',
       $$ WITH 1 AS cnt RETURN cnt $$
   ) AS (a agtype);
   ```
   
   or backtick-quote the alias if the keyword form is desired downstream:
   
   ```sql
   SELECT * FROM cypher('g',
       $$ WITH 1 AS `count` RETURN `count` $$
   ) AS (a agtype);
   ```
   
   ## Related
   
   - #2355 — original report (alias binding, fixed in #2415).
   - #2415 — alias-binding fix; this issue tracks the remaining
     read-back asymmetry.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to