class IndexHintClauseSegment(BaseSegment): """This is the body of an index hint clause.""" type = "index_hint_clause" match_grammar = Sequence( OneOf("USE", "IGNORE", "FORCE"), OneOf("INDEX", "KEY"), Sequence( "FOR", OneOf("JOIN", Sequence("ORDER", "BY"), Sequence("GROUP", "BY"), optional=True), optional=True, ), Bracketed(Ref("ObjectReferenceSegment")), Ref("JoinOnConditionSegment", optional=True), )
class FunctionBodySegment(BaseSegment): """The definition of the function body.""" type = "function_body" match_grammar = OneOf( Ref("FunctionAssignmentSegment"), Ref("FunctionIfBranchSegment"), Ref("FunctionForLoopSegment"), Ref("FunctionWhileLoopSegment"), )
class ForClauseSegment(BaseSegment): """This is the body of a `FOR` clause.""" type = "for_clause" match_grammar = OneOf( Sequence( Sequence( "FOR", OneOf("UPDATE", "SHARE"), ), Sequence("OF", Delimited(Ref("NakedIdentifierSegment")), optional=True), OneOf("NOWAIT", Sequence("SKIP", "LOCKED"), optional=True), ), Sequence("LOCK", "IN", "SHARE", "MODE"), optional=True, )
class FunctionDefinitionGrammar(BaseSegment): """This is the body of a `CREATE FUNCTION AS` statement.""" type = "function_definition" match_grammar = Sequence( AnyNumberOf( Sequence( OneOf("DETERMINISTIC", Sequence("NOT", "DETERMINISTIC")), optional=True, ), Sequence( "LANGUAGE", # Not really a parameter, but best fit for now. Ref("ParameterNameSegment"), Sequence( "OPTIONS", Bracketed( Delimited( Sequence( Ref("ParameterNameSegment"), Ref("EqualsSegment"), Anything(), ), delimiter=Ref("CommaSegment"), ) ), optional=True, ), ), # There is some syntax not implemented here, Sequence( "AS", OneOf( Ref("DoubleQuotedUDFBody"), Ref("SingleQuotedUDFBody"), Bracketed( OneOf(Ref("ExpressionSegment"), Ref("SelectStatementSegment")) ), ), ), ) )
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, ), )
class SelectClauseSegment(ansi.SelectClauseSegment): """A group of elements in a select target statement. Remove OVERLAPS as a terminator as this can be part of SelectClauseModifierSegment """ match_grammar = StartsWith( Sequence( OneOf("SELECT", "SEL"), Ref("WildcardExpressionSegment", optional=True) ), terminator=OneOf( "FROM", "WHERE", Sequence("ORDER", "BY"), "LIMIT", Ref("SetOperatorSegment"), ), enforce_whitespace_preceding_terminator=True, ) parse_grammar = ansi.SelectClauseSegment.parse_grammar
class AlterDatabaseStatementSegment(BaseSegment): """An `ALTER DATABASE/SCHEMA` statement.""" type = "alter_database_statement" match_grammar = Sequence( "ALTER", OneOf("DATABASE", "SCHEMA"), Ref("DatabaseReferenceSegment"), "SET", OneOf( Sequence("DBPROPERTIES", Ref("BracketedPropertyListGrammar")), Sequence( "OWNER", OneOf("USER", "ROLE"), Ref("QuotedLiteralSegment"), ), Ref("LocationGrammar"), Sequence("MANAGEDLOCATION", Ref("QuotedLiteralSegment")), ), )
class UnpivotAliasExpressionSegment(BaseSegment): """In BigQuery UNPIVOT alias's can be single or double quoted.""" type = "alias_expression" match_grammar = Sequence( Ref.keyword("AS", optional=True), OneOf( Ref("SingleQuotedLiteralSegment"), Ref("DoubleQuotedLiteralSegment"), ), )
class TdCommentStatementSegment(BaseSegment): """A `COMMENT` statement. COMMENT [ON] (object_kind_1|object_kind_2) name [[AS|IS] comment] object_kind_1: (COLUMN|FUNCTION|GLOP SET|MACRO|MAP|METHOD|PROCEDURE|PROFILE|ROLE| TRIGGER|TYPE|VIEW) object_kind_2: (DATABASE|FILE|TABLE|USER) """ type = "comment_clause" is_ddl = True is_dml = False is_dql = False is_dcl = False match_grammar = Sequence( "COMMENT", OneOf("ON", optional=True), OneOf( Sequence("COLUMN", Ref("ColumnReferenceSegment")), Sequence("FUNCTION", Ref("ObjectReferenceSegment")), Sequence("MACRO", Ref("ObjectReferenceSegment")), Sequence("MAP", Ref("ObjectReferenceSegment")), Sequence("METHOD", Ref("ObjectReferenceSegment")), Sequence("PROCEDURE", Ref("ObjectReferenceSegment")), Sequence("PROFILE", Ref("ObjectReferenceSegment")), Sequence("ROLE", Ref("ObjectReferenceSegment")), Sequence("TRIGGER", Ref("ObjectReferenceSegment")), Sequence("TYPE", Ref("ObjectReferenceSegment")), Sequence("VIEW", Ref("TableReferenceSegment")), Sequence("DATABASE", Ref("DatabaseReferenceSegment")), Sequence("FILE", Ref("ObjectReferenceSegment")), Sequence("TABLE", Ref("TableReferenceSegment")), Sequence("USER", Ref("ObjectReferenceSegment")), ), Sequence( OneOf("AS", "IS", optional=True), Ref("QuotedLiteralSegment"), optional=True, ), )
class CommentStatementSegment(BaseSegment): """A `Comment` statement. COMMENT [text] https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_4009.htm """ type = "comment_statement" match_grammar = StartsWith(Sequence("COMMENT", "ON")) parse_grammar = Sequence( "COMMENT", "ON", Sequence( OneOf( Sequence( "TABLE", Ref("TableReferenceSegment"), ), Sequence( "COLUMN", Ref("ColumnReferenceSegment"), ), Sequence( "OPERATOR", Ref("ObjectReferenceSegment"), ), Sequence( "INDEXTYPE", Ref("IndexTypeReferenceSegment"), ), Sequence( "MATERIALIZED", "VIEW", Ref("TableReferenceSegment"), ), ), Sequence("IS", OneOf(Ref("QuotedLiteralSegment"), "NULL")), ), )
class DeallocateSegment(BaseSegment): """This is the body of a `DEALLOCATE/DROP` statement. https://dev.mysql.com/doc/refman/8.0/en/deallocate-prepare.html """ type = "deallocate_segment" match_grammar = Sequence( Sequence(OneOf("DEALLOCATE", "DROP"), "PREPARE"), Ref("NakedIdentifierSegment"), )
class IntervalExpressionSegment(BaseSegment): """An interval expression segment. Full Apache Hive `INTERVAL` reference here: https://cwiki.apache.org/confluence/display/hive/languagemanual+types#LanguageManualTypes-Intervals """ type = "interval_expression" match_grammar = Sequence( Ref.keyword("INTERVAL", optional=True), OneOf( Sequence( OneOf( Ref("QuotedLiteralSegment"), Ref("NumericLiteralSegment"), Bracketed(Ref("ExpressionSegment")), ), Ref("DatetimeUnitSegment"), Sequence("TO", Ref("DatetimeUnitSegment"), optional=True), ), ), )
class StatementSegment(BaseSegment): """A generic segment, to any of its child subsegments.""" type = "statement" match_grammar = GreedyUntil(Ref("FunctionScriptTerminatorSegment")) parse_grammar = OneOf( Ref("CreateFunctionStatementSegment"), Ref("CreateScriptingLuaScriptStatementSegment"), Ref("CreateUDFScriptStatementSegment"), Ref("CreateAdapterScriptStatementSegment"), )
class SelectClauseElementSegment( ansi_dialect.get_segment("SelectClauseElementSegment") # type: ignore ): """BigQuery also supports the special "Struct" construct.""" parse_grammar = OneOf( # *, blah.*, blah.blah.*, etc. Ref("WildcardExpressionSegment"), Sequence( OneOf( Ref("LiteralGrammar"), Ref("BareFunctionSegment"), Ref("FunctionSegment"), Ref("IntervalExpressionSegment"), Ref("TypelessStructSegment"), Ref("ColumnReferenceSegment"), Ref("ExpressionSegment"), ), Ref("AliasExpressionSegment", optional=True), ), )
class DatatypeSegment(BaseSegment): """Data types.""" type = "data_type" match_grammar = OneOf( Ref("PrimitiveTypeSegment"), Sequence( "ARRAY", Bracketed( Ref("DatatypeSegment"), bracket_pairs_set="angle_bracket_pairs", bracket_type="angle", ), ), Sequence( "MAP", Bracketed( Sequence( Ref("PrimitiveTypeSegment"), Ref("CommaSegment"), Ref("DatatypeSegment"), ), bracket_pairs_set="angle_bracket_pairs", bracket_type="angle", ), ), Sequence( "STRUCT", Bracketed( Delimited( Sequence( Ref("NakedIdentifierSegment"), Ref("ColonSegment"), Ref("DatatypeSegment"), Ref("CommentGrammar", optional=True), ), bracket_pairs_set="angle_bracket_pairs", ), bracket_pairs_set="angle_bracket_pairs", bracket_type="angle", ), ), Sequence( "UNIONTYPE", Bracketed( Delimited( Ref("DatatypeSegment"), bracket_pairs_set="angle_bracket_pairs" ), bracket_pairs_set="angle_bracket_pairs", bracket_type="angle", ), ), )
class CreateProcedureStatementSegment(BaseSegment): """A `CREATE OR ALTER PROCEDURE` statement. https://docs.microsoft.com/en-us/sql/t-sql/statements/create-procedure-transact-sql?view=sql-server-ver15 """ type = "create_procedure_statement" match_grammar = StartsWith( Sequence("CREATE", Sequence("OR", "ALTER", optional=True), OneOf("PROCEDURE", "PROC"))) parse_grammar = Sequence( "CREATE", Sequence("OR", "ALTER", optional=True), OneOf("PROCEDURE", "PROC"), Ref("ObjectReferenceSegment"), Ref("FunctionParameterListGrammar", optional=True), "AS", # Pending to add BEGIN END optional Ref("ProcedureDefinitionGrammar"), )
class PivotUnpivotStatementSegment(BaseSegment): """Declaration of a variable. https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-ver15 """ type = "pivotunpivot_segment" match_grammar = StartsWith( OneOf("PIVOT", "UNPIVOT"), terminator=Ref("FromClauseTerminatorGrammar"), enforce_whitespace_preceding_terminator=True, ) parse_grammar = Sequence( OneOf( Sequence( "PIVOT", OptionallyBracketed( Sequence( OptionallyBracketed(Ref("FunctionSegment")), "FOR", Ref("ColumnReferenceSegment"), "IN", Bracketed(Delimited(Ref("ColumnReferenceSegment"))), )), ), Sequence( "UNPIVOT", OptionallyBracketed( Sequence( OptionallyBracketed(Ref("ColumnReferenceSegment")), "FOR", Ref("ColumnReferenceSegment"), "IN", Bracketed(Delimited(Ref("ColumnReferenceSegment"))), )), ), ), "AS", Ref("TableReferenceSegment"), )
class CreateFunctionStatementSegment(BaseSegment): """A `CREATE FUNCTION` statement.""" type = "create_function_statement" is_ddl = True is_dml = False is_dql = False is_dcl = False match_grammar = StartsWith( Sequence( "CREATE", Ref("OrReplaceGrammar", optional=True), "FUNCTION", ) ) parse_grammar = Sequence( "CREATE", Ref("OrReplaceGrammar", optional=True), "FUNCTION", Ref("FunctionReferenceSegment"), Bracketed( Delimited( Sequence( Ref("SingleIdentifierGrammar"), # Column name Ref.keyword("IN", optional=True), Ref("DatatypeSegment"), # Column type ), optional=True, ), ), "RETURN", Ref("DatatypeSegment"), OneOf("IS", "AS", optional=True), AnyNumberOf( Sequence( Ref("VariableNameSegment"), Ref("DatatypeSegment"), Ref("SemicolonSegment"), ), optional=True, ), "BEGIN", AnyNumberOf(Ref("FunctionBodySegment")), "RETURN", Ref("FunctionContentsExpressionGrammar"), Ref("SemicolonSegment"), "END", Ref("FunctionReferenceSegment", optional=True), Ref("SemicolonSegment", optional=True), )
class CreateTableStatementSegment(BaseSegment): """A `CREATE TABLE` statement. As specified in https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html """ type = "create_table_statement" match_grammar = Sequence( "CREATE", Ref.keyword("LOCAL", optional=True), Ref("TemporaryGrammar", optional=True), "TABLE", Ref("IfNotExistsGrammar", optional=True), Ref("TableReferenceSegment"), Bracketed( OneOf( # Columns and comment syntax: Delimited( Sequence( Ref("ColumnReferenceSegment"), Ref("DatatypeSegment"), AnyNumberOf(Ref("ColumnAttributeSegment"), optional=True), AnyNumberOf(Ref("ColumnConstraintSegment"), optional=True), ), Ref("TableConstraintSegment", optional=True), ), Sequence( "LIKE", Ref("TableReferenceSegment"), AnyNumberOf(Ref("LikeOptionSegment"), optional=True), ), )), Sequence("BACKUP", OneOf("YES", "NO", optional=True), optional=True), AnyNumberOf(Ref("TableAttributeSegment"), optional=True), )
class SamplingExpressionSegment(BaseSegment): """A sampling expression.""" type = "sample_expression" match_grammar = Sequence( "TABLESAMPLE", Bracketed( OneOf( Sequence( "BUCKET", Ref("NumericLiteralSegment"), "OUT", "OF", Ref("NumericLiteralSegment"), Sequence( "ON", OneOf( Ref("SingleIdentifierGrammar"), Ref("FunctionSegment"), ), optional=True, ), ), Sequence( Ref("NumericLiteralSegment"), OneOf("PERCENT", "ROWS", optional=True), ), RegexParser( r"\d+[bBkKmMgG]", CodeSegment, type="byte_length_literal", ), ), ), Ref( "AliasExpressionSegment", optional=True, ), )
class SelectClauseModifierSegment(BaseSegment): """Things that come after SELECT but before the columns. In snowflake we go back to similar functionality as the ANSI version in the root dialect, without the things added in postgres. """ type = "select_clause_modifier" match_grammar = OneOf( "DISTINCT", "ALL", )
class StatementSegment(ansi.StatementSegment): """A generic segment, to any of its child subsegments. Override ANSI to allow exclusion of ExecuteFileSegment. """ type = "statement" match_grammar = OneOf(GreedyUntil(Ref("DelimiterGrammar")), exclude=Ref("ExecuteFileSegment")) parse_grammar = ansi.StatementSegment.parse_grammar.copy(insert=[ Ref("CommentStatementSegment"), ], )
class FunctionDefinitionGrammar(BaseSegment): """This is the body of a `CREATE FUNCTION AS` statement.""" match_grammar = Sequence( "AS", OneOf(Ref("QuotedLiteralSegment"), Ref("DollarQuotedLiteralSegment")), Sequence( "LANGUAGE", # Not really a parameter, but best fit for now. Ref("ParameterNameSegment"), optional=True, ), )
class SelectClauseModifierSegment(BaseSegment): """Things that come after SELECT but before the columns.""" type = "select_clause_modifier" match_grammar = OneOf( Sequence("DISTINCT", Sequence("ON", Bracketed(Anything()), optional=True)), "ALL", ) parse_grammar = OneOf( Sequence( "DISTINCT", Sequence( "ON", Bracketed( Delimited(Ref("ExpressionSegment"), delimiter=Ref("CommaSegment"))), optional=True, ), ), "ALL", )
class InsertStatementSegment(BaseSegment): """`INSERT INTO` statement. https://docs.aws.amazon.com/athena/latest/ug/insert-into.html """ type = "insert_statement" match_grammar = Sequence( "INSERT", "INTO", Ref("TableReferenceSegment"), OneOf( OptionallyBracketed(Ref("SelectableGrammar")), Sequence("DEFAULT", "VALUES"), Sequence( Ref("BracketedColumnReferenceListGrammar", optional=True), OneOf( Ref("ValuesClauseSegment"), OptionallyBracketed(Ref("SelectableGrammar")), ), ), ), )
class UseStatementSegment(BaseSegment): """A snowflake `USE` statement. https://docs.snowflake.com/en/sql-reference/sql/use.html """ type = "use_statement" match_grammar = StartsWith("USE") parse_grammar = Sequence( "USE", OneOf("ROLE", "WAREHOUSE", "DATABASE", "SCHEMA", optional=True), Ref("ObjectReferenceSegment"), )
class DateLiteralNSegment(BaseSegment): """A Date literal keyword that takes the :n integer suffix. https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_dateformats.htm """ type = "date_n_literal" match_grammar = Sequence( OneOf(*date_n_literals), Ref("ColonSegment"), Ref("NumericLiteralSegment"), allow_gaps=False, )
class SetSessionStatementSegment(BaseSegment): """A `SET SESSION` statement. https://docs.teradata.com/r/Teradata-Database-SQL-Data-Definition-Language-Syntax-and-Examples/December-2015/Session-Statements/SET-SESSION-DATABASE """ type = "set_session_statement" match_grammar: Matchable = Sequence( OneOf( Sequence("SET", "SESSION"), "SS", ), Ref("DatabaseStatementSegment"), )
class FromBeforeExpressionSegment(BaseSegment): """A BEFORE expression.""" type = "from_before_expression" match_grammar = Sequence("BEFORE", Bracketed(Anything())) parse_grammar = Sequence( "BEFORE", Bracketed( OneOf("TIMESTAMP", "OFFSET", "STATEMENT"), Ref("ParameterAssignerSegment"), Ref("ExpressionSegment"), ), )
class QualifyClauseSegment(BaseSegment): """A `QUALIFY` clause like in `SELECT`. https://docs.snowflake.com/en/sql-reference/constructs/qualify.html """ type = "having_clause" match_grammar = StartsWith( "QUALIFY", terminator=OneOf( "ORDER", "LIMIT", ), ) parse_grammar = Sequence( "QUALIFY", Indent, OneOf( Bracketed(Ref("ExpressionSegment"), ), Ref("ExpressionSegment"), ), Dedent, )