Skip to content

Commit cd1aee8

Browse files
authored
SparkSQL: added support for : (colon sign) operator (Databricks SQL) (sqlfluff#3956)
1 parent 159b47a commit cd1aee8

File tree

4 files changed

+128
-17
lines changed

4 files changed

+128
-17
lines changed

src/sqlfluff/dialects/dialect_ansi.py

+20-17
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,24 @@ class CompositeComparisonOperatorSegment(BaseSegment):
656656
),
657657
TrimParametersGrammar=OneOf("BOTH", "LEADING", "TRAILING"),
658658
DefaultValuesGrammar=Sequence("DEFAULT", "VALUES"),
659+
ObjectReferenceDelimiterGrammar=OneOf(
660+
Ref("DotSegment"),
661+
Sequence(Ref("DotSegment"), Ref("DotSegment")),
662+
),
663+
ObjectReferenceTerminatorGrammar=OneOf(
664+
"ON",
665+
"AS",
666+
"USING",
667+
Ref("CommaSegment"),
668+
Ref("CastOperatorSegment"),
669+
Ref("StartSquareBracketSegment"),
670+
Ref("StartBracketSegment"),
671+
Ref("BinaryOperatorGrammar"),
672+
Ref("ColonSegment"),
673+
Ref("DelimiterGrammar"),
674+
Ref("JoinLikeClauseGrammar"),
675+
BracketedSegment,
676+
),
659677
)
660678

661679

@@ -806,23 +824,8 @@ class ObjectReferenceSegment(BaseSegment):
806824
# match grammar (don't allow whitespace)
807825
match_grammar: Matchable = Delimited(
808826
Ref("SingleIdentifierGrammar"),
809-
delimiter=OneOf(
810-
Ref("DotSegment"), Sequence(Ref("DotSegment"), Ref("DotSegment"))
811-
),
812-
terminator=OneOf(
813-
"ON",
814-
"AS",
815-
"USING",
816-
Ref("CommaSegment"),
817-
Ref("CastOperatorSegment"),
818-
Ref("StartSquareBracketSegment"),
819-
Ref("StartBracketSegment"),
820-
Ref("BinaryOperatorGrammar"),
821-
Ref("ColonSegment"),
822-
Ref("DelimiterGrammar"),
823-
Ref("JoinLikeClauseGrammar"),
824-
BracketedSegment,
825-
),
827+
delimiter=Ref("ObjectReferenceDelimiterGrammar"),
828+
terminator=Ref("ObjectReferenceTerminatorGrammar"),
826829
allow_gaps=False,
827830
)
828831

src/sqlfluff/dialects/dialect_sparksql.py

+20
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,26 @@
346346
# Add arrow operators for lambdas (e.g. aggregate)
347347
Ref("RightArrowOperator"),
348348
),
349+
# Support for colon sign operator (Databricks SQL)
350+
ObjectReferenceDelimiterGrammar=OneOf(
351+
Ref("DotSegment"),
352+
Sequence(Ref("DotSegment"), Ref("DotSegment")),
353+
Ref("ColonSegment"),
354+
),
355+
# Support for colon sign operator (Databricks SQL)
356+
ObjectReferenceTerminatorGrammar=OneOf(
357+
"ON",
358+
"AS",
359+
"USING",
360+
Ref("CommaSegment"),
361+
Ref("CastOperatorSegment"),
362+
Ref("StartSquareBracketSegment"),
363+
Ref("StartBracketSegment"),
364+
Ref("BinaryOperatorGrammar"),
365+
Ref("DelimiterGrammar"),
366+
Ref("JoinLikeClauseGrammar"),
367+
ansi.BracketedSegment,
368+
),
349369
)
350370

351371
sparksql_dialect.add(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
SELECT c1:price
2+
FROM VALUES('{ "price": 5 }') AS T(c1);
3+
4+
SELECT c1:['price']::DECIMAL(5, 2)
5+
FROM VALUES('{ "price": 5 }') AS T(c1);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# YML test files are auto-generated from SQL files and should not be edited by
2+
# hand. To help enforce this, the "hash" field in the file must match a hash
3+
# computed by SQLFluff when running the tests. Please run
4+
# `python test/generate_parse_fixture_yml.py` to generate them after adding or
5+
# altering SQL files.
6+
_hash: 55cdb3f3a236b72c83d31e4f9dc44c8edd428bd66484847b6fde17cfd6b809cb
7+
file:
8+
- statement:
9+
select_statement:
10+
select_clause:
11+
keyword: SELECT
12+
select_clause_element:
13+
column_reference:
14+
- naked_identifier: c1
15+
- colon: ':'
16+
- naked_identifier: price
17+
from_clause:
18+
keyword: FROM
19+
from_expression:
20+
from_expression_element:
21+
table_expression:
22+
values_clause:
23+
keyword: VALUES
24+
bracketed:
25+
start_bracket: (
26+
expression:
27+
quoted_literal: "'{ \"price\": 5 }'"
28+
end_bracket: )
29+
alias_expression:
30+
keyword: AS
31+
naked_identifier: T
32+
bracketed:
33+
start_bracket: (
34+
identifier_list:
35+
naked_identifier: c1
36+
end_bracket: )
37+
- statement_terminator: ;
38+
- statement:
39+
select_statement:
40+
select_clause:
41+
keyword: SELECT
42+
select_clause_element:
43+
expression:
44+
column_reference:
45+
naked_identifier: c1
46+
colon: ':'
47+
array_accessor:
48+
start_square_bracket: '['
49+
expression:
50+
quoted_literal: "'price'"
51+
end_square_bracket: ']'
52+
cast_expression:
53+
casting_operator: '::'
54+
data_type:
55+
primitive_type:
56+
keyword: DECIMAL
57+
bracketed:
58+
- start_bracket: (
59+
- numeric_literal: '5'
60+
- comma: ','
61+
- numeric_literal: '2'
62+
- end_bracket: )
63+
from_clause:
64+
keyword: FROM
65+
from_expression:
66+
from_expression_element:
67+
table_expression:
68+
values_clause:
69+
keyword: VALUES
70+
bracketed:
71+
start_bracket: (
72+
expression:
73+
quoted_literal: "'{ \"price\": 5 }'"
74+
end_bracket: )
75+
alias_expression:
76+
keyword: AS
77+
naked_identifier: T
78+
bracketed:
79+
start_bracket: (
80+
identifier_list:
81+
naked_identifier: c1
82+
end_bracket: )
83+
- statement_terminator: ;

0 commit comments

Comments
 (0)