diff --git a/src/sqlfluff/dialects/dialect_redshift.py b/src/sqlfluff/dialects/dialect_redshift.py index 26fa62d077e..f9a4a0cd87b 100644 --- a/src/sqlfluff/dialects/dialect_redshift.py +++ b/src/sqlfluff/dialects/dialect_redshift.py @@ -391,6 +391,51 @@ class InsertStatementSegment(BaseSegment): ) +@redshift_dialect.segment(replace=True) +class CreateSchemaStatementSegment(BaseSegment): + """A `CREATE SCHEMA` statement. + + https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_SCHEMA.html + TODO: support optional SCHEMA_ELEMENT + """ + + type = "create_schema_statement" + match_grammar = Sequence( + "CREATE", + "SCHEMA", + OneOf( + Sequence( + Ref("IfNotExistsGrammar", optional=True), + Ref("SchemaReferenceSegment"), + Sequence( + "AUTHORIZATION", + Ref("ObjectReferenceSegment"), + optional=True, + ), + ), + Sequence( + "AUTHORIZATION", + Ref("ObjectReferenceSegment"), + ), + ), + Sequence( + "QUOTA", + OneOf( + Sequence( + Ref("NumericLiteralSegment"), + OneOf( + "MB", + "GB", + "TB", + ), + ), + "UNLIMITED", + ), + optional=True, + ), + ) + + # Adding Redshift specific statements @redshift_dialect.segment(replace=True) class StatementSegment(BaseSegment): diff --git a/src/sqlfluff/dialects/dialect_redshift_keywords.py b/src/sqlfluff/dialects/dialect_redshift_keywords.py index df4d8bb4df0..797dd187ba6 100644 --- a/src/sqlfluff/dialects/dialect_redshift_keywords.py +++ b/src/sqlfluff/dialects/dialect_redshift_keywords.py @@ -432,6 +432,7 @@ FUSION FUTURE G +GB GENERAL GENERATED GET @@ -545,6 +546,7 @@ MATERIALIZED MAX MAXVALUE +MB MEASURES MEMBER MERGE @@ -686,6 +688,7 @@ PUBLICATION QUALIFY QUARTER +QUOTA QUOTE QUOTES RANGE @@ -845,6 +848,7 @@ TANH TASK TASKS +TB TEMP TEMPLATE TEMPORARY diff --git a/test/fixtures/dialects/redshift/redshift_create_schema.sql b/test/fixtures/dialects/redshift/redshift_create_schema.sql new file mode 100644 index 00000000000..959c90c8fd4 --- /dev/null +++ b/test/fixtures/dialects/redshift/redshift_create_schema.sql @@ -0,0 +1,27 @@ +CREATE SCHEMA s1; +CREATE SCHEMA IF NOT EXISTS s1; + +CREATE SCHEMA s1 AUTHORIZATION dwuser; +CREATE SCHEMA IF NOT EXISTS s1 AUTHORIZATION dwuser; + +CREATE SCHEMA s1 AUTHORIZATION dwuser QUOTA 100 MB; +CREATE SCHEMA IF NOT EXISTS s1 AUTHORIZATION dwuser QUOTA 100 MB; + +CREATE SCHEMA s1 AUTHORIZATION dwuser QUOTA 5 GB; +CREATE SCHEMA IF NOT EXISTS s1 AUTHORIZATION dwuser QUOTA 5 GB; + +CREATE SCHEMA s1 AUTHORIZATION dwuser QUOTA 0.1 TB; +CREATE SCHEMA IF NOT EXISTS s1 AUTHORIZATION dwuser QUOTA 0.1 TB; + +CREATE SCHEMA s1 AUTHORIZATION dwuser QUOTA UNLIMITED; +CREATE SCHEMA IF NOT EXISTS s1 AUTHORIZATION dwuser QUOTA UNLIMITED; + +CREATE SCHEMA AUTHORIZATION dwuser; + +CREATE SCHEMA AUTHORIZATION dwuser QUOTA 100 MB; + +CREATE SCHEMA AUTHORIZATION dwuser QUOTA 5 GB; + +CREATE SCHEMA AUTHORIZATION dwuser QUOTA 0.1 TB; + +CREATE SCHEMA AUTHORIZATION dwuser QUOTA UNLIMITED; diff --git a/test/fixtures/dialects/redshift/redshift_create_schema.yml b/test/fixtures/dialects/redshift/redshift_create_schema.yml new file mode 100644 index 00000000000..b53068d551f --- /dev/null +++ b/test/fixtures/dialects/redshift/redshift_create_schema.yml @@ -0,0 +1,212 @@ +# 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: 9c60d7f03836f977999a5ad56c70f44448fef6e0cadd94dfe772a82624f91e41 +file: +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - schema_reference: + identifier: s1 +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - keyword: IF + - keyword: NOT + - keyword: EXISTS + - schema_reference: + identifier: s1 +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - schema_reference: + identifier: s1 + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - keyword: IF + - keyword: NOT + - keyword: EXISTS + - schema_reference: + identifier: s1 + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - schema_reference: + identifier: s1 + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser + - keyword: QUOTA + - literal: '100' + - keyword: MB +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - keyword: IF + - keyword: NOT + - keyword: EXISTS + - schema_reference: + identifier: s1 + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser + - keyword: QUOTA + - literal: '100' + - keyword: MB +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - schema_reference: + identifier: s1 + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser + - keyword: QUOTA + - literal: '5' + - keyword: GB +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - keyword: IF + - keyword: NOT + - keyword: EXISTS + - schema_reference: + identifier: s1 + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser + - keyword: QUOTA + - literal: '5' + - keyword: GB +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - schema_reference: + identifier: s1 + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser + - keyword: QUOTA + - literal: '0.1' + - keyword: TB +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - keyword: IF + - keyword: NOT + - keyword: EXISTS + - schema_reference: + identifier: s1 + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser + - keyword: QUOTA + - literal: '0.1' + - keyword: TB +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - schema_reference: + identifier: s1 + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser + - keyword: QUOTA + - keyword: UNLIMITED +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - keyword: IF + - keyword: NOT + - keyword: EXISTS + - schema_reference: + identifier: s1 + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser + - keyword: QUOTA + - keyword: UNLIMITED +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser + - keyword: QUOTA + - literal: '100' + - keyword: MB +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser + - keyword: QUOTA + - literal: '5' + - keyword: GB +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser + - keyword: QUOTA + - literal: '0.1' + - keyword: TB +- statement_terminator: ; +- statement: + create_schema_statement: + - keyword: CREATE + - keyword: SCHEMA + - keyword: AUTHORIZATION + - object_reference: + identifier: dwuser + - keyword: QUOTA + - keyword: UNLIMITED +- statement_terminator: ;