Skip to content

Commit

Permalink
BigQuery: Support Materialized Views (#3759)
Browse files Browse the repository at this point in the history
  • Loading branch information
yoichi committed Aug 18, 2022
1 parent f67509b commit eade007
Show file tree
Hide file tree
Showing 7 changed files with 331 additions and 0 deletions.
62 changes: 62 additions & 0 deletions src/sqlfluff/dialects/dialect_bigquery.py
Expand Up @@ -424,6 +424,9 @@ class StatementSegment(ansi.StatementSegment):
Ref("LeaveStatementSegment"),
Ref("ContinueStatementSegment"),
Ref("RaiseStatementSegment"),
Ref("CreateMaterializedViewStatementSegment"),
Ref("AlterMaterializedViewStatementSegment"),
Ref("DropMaterializedViewStatementSegment"),
],
)

Expand Down Expand Up @@ -1490,6 +1493,65 @@ class CreateViewStatementSegment(ansi.CreateViewStatementSegment):
)


class CreateMaterializedViewStatementSegment(BaseSegment):
"""A `CREATE MATERIALIZED VIEW` statement.
https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_materialized_view_statement
"""

type = "create_materialized_view_statement"

match_grammar = Sequence(
"CREATE",
Ref("OrReplaceGrammar", optional=True),
"MATERIALIZED",
"VIEW",
Ref("IfNotExistsGrammar", optional=True),
Ref("TableReferenceSegment"),
Ref("PartitionBySegment", optional=True),
Ref("ClusterBySegment", optional=True),
Ref("OptionsSegment", optional=True),
"AS",
OptionallyBracketed(Ref("SelectableGrammar")),
)


class AlterMaterializedViewStatementSegment(BaseSegment):
"""A `ALTER MATERIALIZED VIEW SET OPTIONS` statement.
https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#alter_materialized_view_set_options_statement
"""

type = "alter_materialized_view_set_options_statement"

match_grammar = Sequence(
"ALTER",
"MATERIALIZED",
"VIEW",
Ref("IfExistsGrammar", optional=True),
Ref("TableReferenceSegment"),
"SET",
Ref("OptionsSegment"),
)


class DropMaterializedViewStatementSegment(BaseSegment):
"""A `DROP MATERIALIZED VIEW` statement.
https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#drop_materialized_view_statement
"""

type = "drop_materialized_view_statement"

match_grammar = Sequence(
"DROP",
"MATERIALIZED",
"VIEW",
Ref("IfExistsGrammar", optional=True),
Ref("TableReferenceSegment"),
)


class ParameterizedSegment(BaseSegment):
"""BigQuery allows named and argument based parameters to help preven SQL Injection.
Expand Down
@@ -0,0 +1,10 @@
ALTER MATERIALIZED VIEW mydataset.my_mv
SET OPTIONS (
enable_refresh=false
);

ALTER MATERIALIZED VIEW mydataset.my_mv
SET OPTIONS (
friendly_name="my_mv",
labels=[("org_unit", "development")]
);
@@ -0,0 +1,61 @@
# YML test files are auto-generated from SQL files and should not be edited by
# hand. To help enforce this, the "hash" field in the file must match a hash
# 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: f920358a40ae793dac230cb79235d4b77daac481e600270d82c487e513493ed0
file:
- statement:
alter_materialized_view_set_options_statement:
- keyword: ALTER
- keyword: MATERIALIZED
- keyword: VIEW
- table_reference:
- naked_identifier: mydataset
- dot: .
- naked_identifier: my_mv
- keyword: SET
- options_segment:
keyword: OPTIONS
bracketed:
start_bracket: (
parameter: enable_refresh
comparison_operator:
raw_comparison_operator: '='
boolean_literal: 'false'
end_bracket: )
- statement_terminator: ;
- statement:
alter_materialized_view_set_options_statement:
- keyword: ALTER
- keyword: MATERIALIZED
- keyword: VIEW
- table_reference:
- naked_identifier: mydataset
- dot: .
- naked_identifier: my_mv
- keyword: SET
- options_segment:
keyword: OPTIONS
bracketed:
- start_bracket: (
- parameter: friendly_name
- comparison_operator:
raw_comparison_operator: '='
- quoted_literal: '"my_mv"'
- comma: ','
- parameter: labels
- comparison_operator:
raw_comparison_operator: '='
- array_literal:
start_square_bracket: '['
expression:
bracketed:
- start_bracket: (
- quoted_literal: '"org_unit"'
- comma: ','
- quoted_literal: '"development"'
- end_bracket: )
end_square_bracket: ']'
- end_bracket: )
- statement_terminator: ;
17 changes: 17 additions & 0 deletions test/fixtures/dialects/bigquery/create_materialized_view.sql
@@ -0,0 +1,17 @@
CREATE MATERIALIZED VIEW mydataset.my_mv
AS SELECT * FROM anotherdataset.mv_base_table;

CREATE MATERIALIZED VIEW IF NOT EXISTS mydataset.my_mv
AS SELECT * FROM anotherdataset.mv_base_table;

CREATE MATERIALIZED VIEW mydataset.my_mv
OPTIONS(
friendly_name="my_mv"
)
AS SELECT * FROM anotherdataset.mv_base_table;

CREATE MATERIALIZED VIEW mydataset.my_mv
PARTITION BY DATE(x)
CLUSTER BY y
AS SELECT x, y
FROM anotherdataset.mv_base_table;
149 changes: 149 additions & 0 deletions test/fixtures/dialects/bigquery/create_materialized_view.yml
@@ -0,0 +1,149 @@
# YML test files are auto-generated from SQL files and should not be edited by
# hand. To help enforce this, the "hash" field in the file must match a hash
# 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: fa0c77fc692915b62e59448c86e6a13dd1a72bec82c6e436dff5b7130f2a0076
file:
- statement:
create_materialized_view_statement:
- keyword: CREATE
- keyword: MATERIALIZED
- keyword: VIEW
- table_reference:
- naked_identifier: mydataset
- dot: .
- naked_identifier: my_mv
- keyword: AS
- select_statement:
select_clause:
keyword: SELECT
select_clause_element:
wildcard_expression:
wildcard_identifier:
star: '*'
from_clause:
keyword: FROM
from_expression:
from_expression_element:
table_expression:
table_reference:
- naked_identifier: anotherdataset
- dot: .
- naked_identifier: mv_base_table
- statement_terminator: ;
- statement:
create_materialized_view_statement:
- keyword: CREATE
- keyword: MATERIALIZED
- keyword: VIEW
- keyword: IF
- keyword: NOT
- keyword: EXISTS
- table_reference:
- naked_identifier: mydataset
- dot: .
- naked_identifier: my_mv
- keyword: AS
- select_statement:
select_clause:
keyword: SELECT
select_clause_element:
wildcard_expression:
wildcard_identifier:
star: '*'
from_clause:
keyword: FROM
from_expression:
from_expression_element:
table_expression:
table_reference:
- naked_identifier: anotherdataset
- dot: .
- naked_identifier: mv_base_table
- statement_terminator: ;
- statement:
create_materialized_view_statement:
- keyword: CREATE
- keyword: MATERIALIZED
- keyword: VIEW
- table_reference:
- naked_identifier: mydataset
- dot: .
- naked_identifier: my_mv
- options_segment:
keyword: OPTIONS
bracketed:
start_bracket: (
parameter: friendly_name
comparison_operator:
raw_comparison_operator: '='
quoted_literal: '"my_mv"'
end_bracket: )
- keyword: AS
- select_statement:
select_clause:
keyword: SELECT
select_clause_element:
wildcard_expression:
wildcard_identifier:
star: '*'
from_clause:
keyword: FROM
from_expression:
from_expression_element:
table_expression:
table_reference:
- naked_identifier: anotherdataset
- dot: .
- naked_identifier: mv_base_table
- statement_terminator: ;
- statement:
create_materialized_view_statement:
- keyword: CREATE
- keyword: MATERIALIZED
- keyword: VIEW
- table_reference:
- naked_identifier: mydataset
- dot: .
- naked_identifier: my_mv
- partition_by_segment:
- keyword: PARTITION
- keyword: BY
- expression:
function:
function_name:
function_name_identifier: DATE
bracketed:
start_bracket: (
expression:
column_reference:
naked_identifier: x
end_bracket: )
- cluster_by_segment:
- keyword: CLUSTER
- keyword: BY
- expression:
column_reference:
naked_identifier: y
- keyword: AS
- select_statement:
select_clause:
- keyword: SELECT
- select_clause_element:
column_reference:
naked_identifier: x
- comma: ','
- select_clause_element:
column_reference:
naked_identifier: y
from_clause:
keyword: FROM
from_expression:
from_expression_element:
table_expression:
table_reference:
- naked_identifier: anotherdataset
- dot: .
- naked_identifier: mv_base_table
- statement_terminator: ;
3 changes: 3 additions & 0 deletions test/fixtures/dialects/bigquery/drop_materialized_view.sql
@@ -0,0 +1,3 @@
DROP MATERIALIZED VIEW mydataset.my_mv;

DROP MATERIALIZED VIEW IF EXISTS mydataset.my_mv;
29 changes: 29 additions & 0 deletions test/fixtures/dialects/bigquery/drop_materialized_view.yml
@@ -0,0 +1,29 @@
# YML test files are auto-generated from SQL files and should not be edited by
# hand. To help enforce this, the "hash" field in the file must match a hash
# 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: 023f2a8fc6cf7288d13cc3d91ec757da95570d47cfc90e3dca3f5abf0d2fff63
file:
- statement:
drop_materialized_view_statement:
- keyword: DROP
- keyword: MATERIALIZED
- keyword: VIEW
- table_reference:
- naked_identifier: mydataset
- dot: .
- naked_identifier: my_mv
- statement_terminator: ;
- statement:
drop_materialized_view_statement:
- keyword: DROP
- keyword: MATERIALIZED
- keyword: VIEW
- keyword: IF
- keyword: EXISTS
- table_reference:
- naked_identifier: mydataset
- dot: .
- naked_identifier: my_mv
- statement_terminator: ;

0 comments on commit eade007

Please sign in to comment.