Skip to content

Commit bc14733

Browse files
yoichibarrywhart
andauthored
BigQuery: Fix parsing parameterized data types (#3735)
* BigQuery: Fix parsing parameterized data types * Replace the type in a comment with a supported one * Make the param[, ...] part more specific * Extend DatatypeSegment to support parameterized data types Co-authored-by: Barry Hart <[email protected]>
1 parent 39dc2d8 commit bc14733

3 files changed

Lines changed: 74 additions & 3 deletions

File tree

src/sqlfluff/dialects/dialect_bigquery.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -960,7 +960,11 @@ class DatatypeSegment(ansi.DatatypeSegment):
960960
"""
961961

962962
match_grammar = OneOf( # Parameter type
963-
Ref("DatatypeIdentifierSegment"), # Simple type
963+
Sequence(
964+
Ref("DatatypeIdentifierSegment"), # Simple type
965+
# https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#parameterized_data_types
966+
Bracketed(Delimited(Ref("NumericLiteralSegment")), optional=True),
967+
),
964968
Sequence("ANY", "TYPE"), # SQL UDFs can specify this "type"
965969
Ref("SimpleArrayTypeGrammar"),
966970
Ref("StructTypeSegment"),
@@ -1372,7 +1376,6 @@ class ColumnDefinitionSegment(ansi.ColumnDefinitionSegment):
13721376
match_grammar: Matchable = Sequence(
13731377
Ref("SingleIdentifierGrammar"), # Column name
13741378
Ref("DatatypeSegment"), # Column type
1375-
Bracketed(Anything(), optional=True), # For types like VARCHAR(100)
13761379
AnyNumberOf(
13771380
Ref("ColumnConstraintSegment", optional=True),
13781381
),

test/fixtures/dialects/bigquery/declare_variable.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@ declare var1 int64;
22
declare var2, var3 string;
33
declare var4 default 'value';
44
declare var5 int64 default 1 + 2;
5+
declare var6 string(10);
6+
declare var7 numeric(5, 2);
57
declare arr1 array<string>;
68
declare arr2 default ['one', 'two'];
79
declare arr3 default [];
810
declare arr4 array<string> default ['one', 'two'];
11+
declare arr5 array<string(10)>;
912
declare str1 struct<f1 string, f2 string>;
1013
declare str2 struct<f1 string, f2 string> default struct('one', 'two');
1114
declare str3 default struct('one', 'two');
1215
declare str4 struct<f1 string, f2 string> default ('one', 'two');
16+
declare str5 struct<f1 string(10), f2 string(10)>;
1317
-- Defining variables in quoted names
1418
declare `var1` string;
1519
declare `var1` string default 'value';

test/fixtures/dialects/bigquery/declare_variable.yml

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# computed by SQLFluff when running the tests. Please run
44
# `python test/generate_parse_fixture_yml.py` to generate them after adding or
55
# altering SQL files.
6-
_hash: e7c3d1f233e5041e5097f81128665af7895b563ccfcf6e247911f714db0b0c04
6+
_hash: a7344a57c0e59ce697ccfabc4e78ada5ea7a5f53123ec3a8839bca556863d42d
77
file:
88
- statement:
99
declare_segment:
@@ -40,6 +40,30 @@ file:
4040
- binary_operator: +
4141
- numeric_literal: '2'
4242
- statement_terminator: ;
43+
- statement:
44+
declare_segment:
45+
keyword: declare
46+
naked_identifier: var6
47+
data_type:
48+
data_type_identifier: string
49+
bracketed:
50+
start_bracket: (
51+
numeric_literal: '10'
52+
end_bracket: )
53+
- statement_terminator: ;
54+
- statement:
55+
declare_segment:
56+
keyword: declare
57+
naked_identifier: var7
58+
data_type:
59+
data_type_identifier: numeric
60+
bracketed:
61+
- start_bracket: (
62+
- numeric_literal: '5'
63+
- comma: ','
64+
- numeric_literal: '2'
65+
- end_bracket: )
66+
- statement_terminator: ;
4367
- statement:
4468
declare_segment:
4569
keyword: declare
@@ -90,6 +114,21 @@ file:
90114
- quoted_literal: "'two'"
91115
- end_square_bracket: ']'
92116
- statement_terminator: ;
117+
- statement:
118+
declare_segment:
119+
keyword: declare
120+
naked_identifier: arr5
121+
data_type:
122+
keyword: array
123+
start_angle_bracket: <
124+
data_type:
125+
data_type_identifier: string
126+
bracketed:
127+
start_bracket: (
128+
numeric_literal: '10'
129+
end_bracket: )
130+
end_angle_bracket: '>'
131+
- statement_terminator: ;
93132
- statement:
94133
declare_segment:
95134
keyword: declare
@@ -174,6 +213,31 @@ file:
174213
- quoted_literal: "'two'"
175214
- end_bracket: )
176215
- statement_terminator: ;
216+
- statement:
217+
declare_segment:
218+
keyword: declare
219+
naked_identifier: str5
220+
data_type:
221+
struct_type:
222+
- keyword: struct
223+
- start_angle_bracket: <
224+
- parameter: f1
225+
- data_type:
226+
data_type_identifier: string
227+
bracketed:
228+
start_bracket: (
229+
numeric_literal: '10'
230+
end_bracket: )
231+
- comma: ','
232+
- parameter: f2
233+
- data_type:
234+
data_type_identifier: string
235+
bracketed:
236+
start_bracket: (
237+
numeric_literal: '10'
238+
end_bracket: )
239+
- end_angle_bracket: '>'
240+
- statement_terminator: ;
177241
- statement:
178242
declare_segment:
179243
keyword: declare

0 commit comments

Comments
 (0)