Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

T-SQL: Allow aliases with = #2727

Merged
merged 3 commits into from Feb 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 18 additions & 0 deletions src/sqlfluff/dialects/dialect_tsql.py
Expand Up @@ -495,6 +495,10 @@ class SelectClauseElementSegment(BaseSegment):
match_grammar = OneOf(
# *, blah.*, blah.blah.*, etc.
Ref("WildcardExpressionSegment"),
Sequence(
Ref("AltAliasExpressionSegment"),
Ref("BaseExpressionElementGrammar"),
),
Sequence(
Ref("BaseExpressionElementGrammar"),
Ref("AliasExpressionSegment", optional=True),
Expand All @@ -504,6 +508,20 @@ class SelectClauseElementSegment(BaseSegment):
get_alias = ansi_dialect.get_segment("SelectClauseElementSegment").get_alias


@tsql_dialect.segment()
class AltAliasExpressionSegment(BaseSegment):
"""An alternative alias clause as used by tsql using `=`."""

type = "alias_expression"
match_grammar = Sequence(
OneOf(
Ref("SingleIdentifierGrammar"),
Ref("SingleQuotedIdentifierSegment"),
),
Ref("RawEqualsSegment"),
)


@tsql_dialect.segment(replace=True)
class SelectClauseModifierSegment(BaseSegment):
"""Things that come after SELECT but before the columns."""
Expand Down
7 changes: 5 additions & 2 deletions test/fixtures/dialects/tsql/select.sql
Expand Up @@ -94,8 +94,11 @@ SELECT

[preceding] = count(*) over(order by object_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ),
[central] = count(*) over(order by object_id ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING ),
[following] = count(*) over(order by object_id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
[following] = count(*) over(order by object_id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING),

EqualsAlias = ColumnName,
OtherColumnName AS AsAlias

FROM dbo . all_pop

FROM dbo . all_pop

178 changes: 93 additions & 85 deletions test/fixtures/dialects/tsql/select.yml
Expand Up @@ -3,7 +3,7 @@
# computed by SQLFluff when running the tests. Please run
# `python test/generate_parse_fixture_yml.py` to generate them after adding or
# altering SQL files.
_hash: 5c19270d1b32a5b73f5e2a11b3473bd84f93c3372be0659ae9376db37c4a8e17
_hash: 67c7d072ec1b8d46101b5506ae2887a234167f679c0e241c76eb32101016d921
file:
batch:
statement:
Expand Down Expand Up @@ -695,103 +695,111 @@ file:
end_bracket: )
- comma: ','
- select_clause_element:
expression:
column_reference:
identifier: '[preceding]'
comparison_operator:
raw_comparison_operator: '='
function:
function_name:
function_name_identifier: count
alias_expression:
identifier: '[preceding]'
raw_comparison_operator: '='
function:
function_name:
function_name_identifier: count
bracketed:
start_bracket: (
star: '*'
end_bracket: )
over_clause:
keyword: over
bracketed:
start_bracket: (
star: '*'
window_specification:
orderby_clause:
- keyword: order
- keyword: by
- column_reference:
identifier: object_id
frame_clause:
- keyword: ROWS
- keyword: BETWEEN
- keyword: UNBOUNDED
- keyword: PRECEDING
- binary_operator: AND
- keyword: CURRENT
- keyword: ROW
end_bracket: )
over_clause:
keyword: over
bracketed:
start_bracket: (
window_specification:
orderby_clause:
- keyword: order
- keyword: by
- column_reference:
identifier: object_id
frame_clause:
- keyword: ROWS
- keyword: BETWEEN
- keyword: UNBOUNDED
- keyword: PRECEDING
- binary_operator: AND
- keyword: CURRENT
- keyword: ROW
end_bracket: )
- comma: ','
- select_clause_element:
expression:
column_reference:
identifier: '[central]'
comparison_operator:
raw_comparison_operator: '='
function:
function_name:
function_name_identifier: count
alias_expression:
identifier: '[central]'
raw_comparison_operator: '='
function:
function_name:
function_name_identifier: count
bracketed:
start_bracket: (
star: '*'
end_bracket: )
over_clause:
keyword: over
bracketed:
start_bracket: (
star: '*'
window_specification:
orderby_clause:
- keyword: order
- keyword: by
- column_reference:
identifier: object_id
frame_clause:
- keyword: ROWS
- keyword: BETWEEN
- literal: '2'
- keyword: PRECEDING
- binary_operator: AND
- literal: '2'
- keyword: FOLLOWING
end_bracket: )
over_clause:
keyword: over
bracketed:
start_bracket: (
window_specification:
orderby_clause:
- keyword: order
- keyword: by
- column_reference:
identifier: object_id
frame_clause:
- keyword: ROWS
- keyword: BETWEEN
- literal: '2'
- keyword: PRECEDING
- binary_operator: AND
- literal: '2'
- keyword: FOLLOWING
end_bracket: )
- comma: ','
- select_clause_element:
expression:
column_reference:
identifier: '[following]'
comparison_operator:
raw_comparison_operator: '='
function:
function_name:
function_name_identifier: count
alias_expression:
identifier: '[following]'
raw_comparison_operator: '='
function:
function_name:
function_name_identifier: count
bracketed:
start_bracket: (
star: '*'
end_bracket: )
over_clause:
keyword: over
bracketed:
start_bracket: (
star: '*'
window_specification:
orderby_clause:
- keyword: order
- keyword: by
- column_reference:
identifier: object_id
frame_clause:
- keyword: ROWS
- keyword: BETWEEN
- keyword: CURRENT
- keyword: ROW
- binary_operator: AND
- keyword: UNBOUNDED
- keyword: FOLLOWING
end_bracket: )
over_clause:
keyword: over
bracketed:
start_bracket: (
window_specification:
orderby_clause:
- keyword: order
- keyword: by
- column_reference:
identifier: object_id
frame_clause:
- keyword: ROWS
- keyword: BETWEEN
- keyword: CURRENT
- keyword: ROW
- binary_operator: AND
- keyword: UNBOUNDED
- keyword: FOLLOWING
end_bracket: )
- comma: ','
- select_clause_element:
alias_expression:
identifier: EqualsAlias
raw_comparison_operator: '='
column_reference:
identifier: ColumnName
- comma: ','
- select_clause_element:
column_reference:
identifier: OtherColumnName
alias_expression:
keyword: AS
identifier: AsAlias
from_clause:
keyword: FROM
from_expression:
Expand Down