From 57368c5aa768548988dbd564bf99db1acfe21656 Mon Sep 17 00:00:00 2001 From: erezrokah Date: Thu, 18 Sep 2025 17:45:53 +0100 Subject: [PATCH] fix: Allow using keywords as alias for columns --- parser/parser_column.go | 10 ++- parser/parser_query.go | 28 --------- .../format/select_keyword_alias_no_as.sql | 5 ++ ...select_keyword_alias_no_as.sql.golden.json | 63 +++++++++++++++++++ .../query/select_keyword_alias_no_as.sql | 1 + 5 files changed, 77 insertions(+), 30 deletions(-) create mode 100644 parser/testdata/query/format/select_keyword_alias_no_as.sql create mode 100644 parser/testdata/query/output/select_keyword_alias_no_as.sql.golden.json create mode 100644 parser/testdata/query/select_keyword_alias_no_as.sql diff --git a/parser/parser_column.go b/parser/parser_column.go index 8cd1999..119658b 100644 --- a/parser/parser_column.go +++ b/parser/parser_column.go @@ -744,12 +744,18 @@ func (p *Parser) parseSelectItem() (*SelectItem, error) { } var alias *Ident - if p.tryConsumeKeywords(KeywordAs) { + switch { + case p.tryConsumeKeywords(KeywordAs): alias, err = p.parseIdent() if err != nil { return nil, err } - } else { + case p.lastTokenKind() == TokenKindKeyword && !p.matchKeyword(KeywordFrom): + alias, err = p.parseIdent() + if err != nil { + return nil, err + } + default: alias = p.tryParseIdent() } diff --git a/parser/parser_query.go b/parser/parser_query.go index 61b50d1..8da4b61 100644 --- a/parser/parser_query.go +++ b/parser/parser_query.go @@ -1009,34 +1009,6 @@ func (p *Parser) parseCTEStmt(pos Pos) (*CTEStmt, error) { }, nil } -func (p *Parser) tryParseColumnAliases() ([]*Ident, error) { - if !p.matchTokenKind(TokenKindLParen) { - return nil, nil - } - if err := p.expectTokenKind(TokenKindLParen); err != nil { - return nil, err - } - - aliasList := make([]*Ident, 0) - for { - ident, err := p.parseIdent() - if err != nil { - return nil, err - } - aliasList = append(aliasList, ident) - if p.matchTokenKind(TokenKindRParen) { - break - } - if err := p.expectTokenKind(TokenKindComma); err != nil { - return nil, err - } - } - if err := p.expectTokenKind(TokenKindRParen); err != nil { - return nil, err - } - return aliasList, nil -} - func (p *Parser) tryParseSampleClause(pos Pos) (*SampleClause, error) { if !p.matchKeyword(KeywordSample) { return nil, nil diff --git a/parser/testdata/query/format/select_keyword_alias_no_as.sql b/parser/testdata/query/format/select_keyword_alias_no_as.sql new file mode 100644 index 0000000..c4bddf6 --- /dev/null +++ b/parser/testdata/query/format/select_keyword_alias_no_as.sql @@ -0,0 +1,5 @@ +-- Origin SQL: +SELECT 'Joe' name FROM users + +-- Format SQL: +SELECT 'Joe' AS name FROM users; diff --git a/parser/testdata/query/output/select_keyword_alias_no_as.sql.golden.json b/parser/testdata/query/output/select_keyword_alias_no_as.sql.golden.json new file mode 100644 index 0000000..7c1bdfb --- /dev/null +++ b/parser/testdata/query/output/select_keyword_alias_no_as.sql.golden.json @@ -0,0 +1,63 @@ +[ + { + "SelectPos": 0, + "StatementEnd": 28, + "With": null, + "Top": null, + "HasDistinct": false, + "SelectItems": [ + { + "Expr": { + "LiteralPos": 8, + "LiteralEnd": 11, + "Literal": "Joe" + }, + "Modifiers": [], + "Alias": { + "Name": "name", + "QuoteType": 1, + "NamePos": 13, + "NameEnd": 17 + } + } + ], + "From": { + "FromPos": 18, + "Expr": { + "Table": { + "TablePos": 23, + "TableEnd": 28, + "Alias": null, + "Expr": { + "Database": null, + "Table": { + "Name": "users", + "QuoteType": 1, + "NamePos": 23, + "NameEnd": 28 + } + }, + "HasFinal": false + }, + "StatementEnd": 28, + "SampleRatio": null, + "HasFinal": false + } + }, + "ArrayJoin": null, + "Window": null, + "Prewhere": null, + "Where": null, + "GroupBy": null, + "WithTotal": false, + "Having": null, + "OrderBy": null, + "LimitBy": null, + "Limit": null, + "Settings": null, + "Format": null, + "UnionAll": null, + "UnionDistinct": null, + "Except": null + } +] \ No newline at end of file diff --git a/parser/testdata/query/select_keyword_alias_no_as.sql b/parser/testdata/query/select_keyword_alias_no_as.sql new file mode 100644 index 0000000..f9cbc76 --- /dev/null +++ b/parser/testdata/query/select_keyword_alias_no_as.sql @@ -0,0 +1 @@ +SELECT 'Joe' name FROM users \ No newline at end of file