class SetStatementSegment(BaseSegment): """Setting an already declared variable. https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting#set """ type = "set_segment" match_grammar = StartsWith("SET") parse_grammar = Sequence( "SET", OneOf( Ref("NakedIdentifierSegment"), Bracketed(Delimited(Ref("NakedIdentifierSegment"))), ), Ref("EqualsSegment"), Delimited( OneOf( Ref("LiteralGrammar"), Bracketed(Ref("SelectStatementSegment")), Ref("BareFunctionSegment"), Ref("FunctionSegment"), Bracketed( Delimited( OneOf( Ref("LiteralGrammar"), Bracketed(Ref("SelectStatementSegment")), Ref("BareFunctionSegment"), Ref("FunctionSegment"), ) ) ), Ref("ArrayLiteralSegment"), ), ), )
class FromPivotExpressionSegment(BaseSegment): """A PIVOT expression. https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#pivot_operator """ type = "from_pivot_expression" match_grammar = Sequence("PIVOT", Bracketed(Anything())) parse_grammar = Sequence( "PIVOT", Bracketed( Delimited( Sequence( Ref("FunctionSegment"), Ref("AliasExpressionSegment", optional=True), ), ), "FOR", Ref("SingleIdentifierGrammar"), "IN", Bracketed( Delimited( Sequence( Ref("LiteralGrammar"), Ref("AliasExpressionSegment", optional=True), ), ) ), ), )
class ColumnAttributeSegment(BaseSegment): """Redshift specific column attributes. As specified in https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html """ type = "column_attribute_segment" match_grammar = AnySetOf( Sequence("DEFAULT", Ref("ExpressionSegment")), Sequence( "IDENTITY", Bracketed(Delimited(Ref("NumericLiteralSegment"))), ), Sequence( "GENERATED", "BY", "DEFAULT", "AS", "IDENTITY", Bracketed(Delimited(Ref("NumericLiteralSegment"))), ), Sequence("ENCODE", Ref("ColumnEncodingGrammar")), "DISTKEY", "SORTKEY", Sequence("COLLATE", OneOf("CASE_SENSITIVE", "CASE_INSENSITIVE")), )
class TableConstraintSegment(BaseSegment): """Redshift specific table constraints. As specified in https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html """ type = "table_constraint" match_grammar = AnySetOf( Sequence("UNIQUE", Bracketed(Delimited(Ref("ColumnReferenceSegment")))), Sequence( "PRIMARY", "KEY", Bracketed(Delimited(Ref("ColumnReferenceSegment"))), ), Sequence( "FOREIGN", "KEY", Bracketed(Delimited(Ref("ColumnReferenceSegment"))), "REFERENCES", Ref("TableReferenceSegment"), Sequence(Bracketed(Ref("ColumnReferenceSegment"))), ), )
class CreateIndexStatementSegment(BaseSegment): """A `CREATE INDEX` statement. https://docs.microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql?view=sql-server-ver15 """ type = "create_index_statement" match_grammar = Sequence( "CREATE", Ref("OrReplaceGrammar", optional=True), Sequence("UNIQUE", optional=True), OneOf("CLUSTERED", "NONCLUSTERED", optional=True), "INDEX", Ref("IfNotExistsGrammar", optional=True), Ref("IndexReferenceSegment"), "ON", Ref("TableReferenceSegment"), Sequence(Bracketed(Delimited( Ref("IndexColumnDefinitionSegment"), ), )), Sequence( "INCLUDE", Sequence( Bracketed(Delimited(Ref("IndexColumnDefinitionSegment"), ), )), 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 GetDiagnosticsSegment(BaseSegment): """This is the body of a `GET DIAGNOSTICS` statement. https://dev.mysql.com/doc/refman/8.0/en/get-diagnostics.html """ type = "get_diagnostics_segment" match_grammar = Sequence( "GET", Sequence("CURRENT", "STACKED", optional=True), "DIAGNOSTICS", Delimited( Sequence( OneOf( Ref("SessionVariableNameSegment"), Ref("LocalVariableNameSegment") ), Ref("EqualsSegment"), OneOf("NUMBER", "ROW_COUNT"), ), optional=True, ), "CONDITION", OneOf( Ref("SessionVariableNameSegment"), Ref("LocalVariableNameSegment"), Ref("NumericLiteralSegment"), ), Delimited( Sequence( OneOf( Ref("SessionVariableNameSegment"), Ref("LocalVariableNameSegment") ), Ref("EqualsSegment"), OneOf( "CLASS_ORIGIN", "SUBCLASS_ORIGIN", "RETURNED_SQLSTATE", "MESSAGE_TEXT", "MYSQL_ERRNO", "CONSTRAINT_CATALOG", "CONSTRAINT_SCHEMA", "CONSTRAINT_NAME", "CATALOG_NAME", "SCHEMA_NAME", "TABLE_NAME", "COLUMN_NAME", "CURSOR_NAME", ), ), optional=True, ), )
class FromUnpivotExpressionSegment(BaseSegment): """An UNPIVOT expression. https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#unpivot_operator """ type = "from_unpivot_expression" match_grammar = Sequence( "UNPIVOT", Sequence( OneOf("INCLUDE", "EXCLUDE"), "NULLS", optional=True, ), OneOf( Bracketed( Ref("SingleIdentifierGrammar"), "FOR", Ref("SingleIdentifierGrammar"), "IN", Bracketed( Delimited(Ref("SingleIdentifierGrammar")), Ref("UnpivotAliasExpressionSegment", optional=True), ), ), Bracketed( Bracketed( Delimited( Ref("SingleIdentifierGrammar"), min_delimiters=1, ), ), "FOR", Ref("SingleIdentifierGrammar"), "IN", Bracketed( Delimited( Sequence( Bracketed( Delimited( Ref("SingleIdentifierGrammar"), min_delimiters=1, ), ), Ref("UnpivotAliasExpressionSegment", optional=True), ), ), ), ), ), )
class TdTableConstraints(BaseSegment): """Teradata specific table attributes. e.g. UNIQUE PRIMARY INDEX Column_name | ( Column_name, ... ) NO PRIMARY INDEX ... """ type = "td_table_constraint" match_grammar = AnyNumberOf( # PRIMARY Index OneOf( Sequence( # UNIQUE PRIMARY INDEX Column_name | ( Column_name, ... ) Ref.keyword("UNIQUE", optional=True), "PRIMARY", "INDEX", Ref("ObjectReferenceSegment", optional=True), # primary index name OneOf( Bracketed( Delimited( Ref("SingleIdentifierGrammar"), ) ), Ref("SingleIdentifierGrammar"), ), ), Sequence("NO", "PRIMARY", "INDEX"), # NO PRIMARY INDEX ), # PARTITION BY ... Sequence( # INDEX HOPR_TRN_TRAV_SIN_MP_I ( IND_TIPO_TARJETA ); "PARTITION", "BY", Ref("TdTablePartitioningLevel"), ), # Index Sequence( # INDEX HOPR_TRN_TRAV_SIN_MP_I ( IND_TIPO_TARJETA ); Ref.keyword("UNIQUE", optional=True), "INDEX", Ref("ObjectReferenceSegment"), # Index name Ref.keyword("ALL", optional=True), Bracketed( # Columns making up constraint Delimited(Ref("ColumnReferenceSegment")), ), ), # WITH DATA Sequence("WITH", Sequence("NO", optional=True), "DATA"), # ON COMMIT PRESERVE ROWS Sequence("ON", "COMMIT", OneOf("PRESERVE", "DELETE"), "ROWS"), )
class SkewedByClauseSegment(BaseSegment): """`SKEWED BY` clause in a CREATE / ALTER statement.""" type = "skewed_by_clause" match_grammar = Sequence( "SKEWED", "BY", Ref("BracketedColumnReferenceListGrammar"), "ON", Bracketed( Delimited( OneOf(Ref("LiteralGrammar"), Bracketed(Delimited(Ref("LiteralGrammar")))))), Sequence("STORED", "AS", "DIRECTORIES", optional=True), )
class DistributeByClauseSegment(ansi.OrderByClauseSegment): """A `DISTRIBUTE BY` clause like in `SELECT`.""" type = "distributeby_clause" match_grammar: Matchable = StartsWith( Sequence("DISTRIBUTE", "BY"), terminator=OneOf( "SORT", "LIMIT", "HAVING", "QUALIFY", # For window functions "WINDOW", Ref("FrameClauseUnitGrammar"), "SEPARATOR", ), ) parse_grammar: Optional[Matchable] = Sequence( "DISTRIBUTE", "BY", Indent, Delimited( Sequence( OneOf( Ref("ColumnReferenceSegment"), Ref("NumericLiteralSegment"), Ref("ExpressionSegment"), ), ), terminator=OneOf( Ref.keyword("LIMIT"), Ref("FrameClauseUnitGrammar"), Ref.keyword("SORT") ), ), Dedent, )
class DatatypeSegment(BaseSegment): """A data type segment. In particular here, this enabled the support for the STRUCT datatypes. """ type = "data_type" match_grammar = OneOf( # Parameter type Ref("DatatypeIdentifierSegment"), # Simple type Sequence("ANY", "TYPE"), # SQL UDFs can specify this "type" Sequence( "ARRAY", Bracketed( Ref("DatatypeSegment"), bracket_type="angle", bracket_pairs_set="angle_bracket_pairs", ), ), Sequence( "STRUCT", Bracketed( Delimited( # Comma-separated list of field names/types Sequence( Ref("ParameterNameSegment"), Ref("DatatypeSegment"), ), delimiter=Ref("CommaSegment"), bracket_pairs_set="angle_bracket_pairs", ), bracket_type="angle", bracket_pairs_set="angle_bracket_pairs", ), ), )
class FunctionDefinitionGrammar(BaseSegment): """This is the body of a `CREATE FUNCTION AS` statement.""" match_grammar = Sequence( AnyNumberOf( 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("DoubleQuotedLiteralSegment"), Ref("QuotedLiteralSegment"), Bracketed( OneOf(Ref("ExpressionSegment"), Ref("SelectStatementSegment"))), ), ), ))
class DatatypeSegment(BaseSegment): """A data type segment. Updated for Transact-SQL to allow bracketed data types with bracketed schemas. """ type = "data_type" match_grammar = Sequence( # Some dialects allow optional qualification of data types with schemas Sequence( Ref("SingleIdentifierGrammar"), Ref("DotSegment"), allow_gaps=False, optional=True, ), OneOf( Ref("DatatypeIdentifierSegment"), Bracketed(Ref("DatatypeIdentifierSegment"), bracket_type="square"), ), Bracketed( OneOf( Delimited(Ref("ExpressionSegment")), # The brackets might be empty for some cases... optional=True, ), # There may be no brackets for some data types optional=True, ), Ref("CharCharacterSetSegment", optional=True), )
class CreateTableStatementSegment(BaseSegment): """A `CREATE TABLE` statement.""" type = "create_table_statement" # https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_table_statement match_grammar = Sequence( "CREATE", Ref("OrReplaceGrammar", optional=True), Ref("TemporaryTransientGrammar", optional=True), "TABLE", Ref("IfNotExistsGrammar", optional=True), Ref("TableReferenceSegment"), # Column list Sequence( Bracketed( Delimited( OneOf( Ref("TableConstraintSegment"), Ref("ColumnDefinitionSegment"), ), ) ), Ref("CommentClauseSegment", optional=True), optional=True, ), Ref("PartitionBySegment", optional=True), Ref("ClusterBySegment", optional=True), Ref("OptionsSegment", optional=True), # Create AS syntax: Sequence( "AS", OptionallyBracketed(Ref("SelectableGrammar")), optional=True, ), )
class CallStoredProcedureSegment(BaseSegment): """This is a CALL statement used to execute a stored procedure. https://dev.mysql.com/doc/refman/8.0/en/call.html """ type = "call_segment" match_grammar = Sequence( "CALL", OneOf( Ref("SingleIdentifierGrammar"), Ref("QuotedIdentifierSegment"), ), Bracketed( AnyNumberOf( Delimited( Ref("QuotedLiteralSegment"), Ref("NumericLiteralSegment"), Ref("DoubleQuotedLiteralSegment"), Ref("SessionVariableNameSegment"), Ref("LocalVariableNameSegment"), Ref("FunctionSegment"), ), ), ), )
class AlterTableStatementSegment(ansi.AlterTableStatementSegment): """An `ALTER TABLE` statement. https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/ALTER-TABLE.html If possible, please keep the order below the same as Oracle's doc: """ match_grammar: Matchable = Sequence( "ALTER", "TABLE", Ref("TableReferenceSegment"), OneOf( # @TODO all stuff inside this "Delimited" is not validated for Oracle Delimited( OneOf( # Table options Sequence( Ref("ParameterNameSegment"), Ref("EqualsSegment", optional=True), OneOf(Ref("LiteralGrammar"), Ref("NakedIdentifierSegment")), ), ), ), Ref("AlterTablePropertiesSegment"), Ref("AlterTableColumnClausesSegment"), Ref("AlterTableConstraintClauses"), ), )
class TableReferenceSegment(ObjectReferenceSegment): """A reference to an table, CTE, subquery or alias. Extended from ANSI to allow Database Link syntax using AtSignSegment """ type = "table_reference" match_grammar: Matchable = Delimited( Ref("SingleIdentifierGrammar"), delimiter=OneOf( Ref("DotSegment"), Sequence(Ref("DotSegment"), Ref("DotSegment")), Ref("AtSignSegment"), ), terminator=OneOf( "ON", "AS", "USING", Ref("CommaSegment"), Ref("CastOperatorSegment"), Ref("StartSquareBracketSegment"), Ref("StartBracketSegment"), Ref("BinaryOperatorGrammar"), Ref("ColonSegment"), Ref("DelimiterGrammar"), Ref("JoinLikeClauseGrammar"), BracketedSegment, ), allow_gaps=False, )
class SortByClauseSegment(ansi.OrderByClauseSegment): """A `SORT BY` clause like in `SELECT`.""" type = "sortby_clause" match_grammar: Matchable = StartsWith( Sequence("SORT", "BY"), terminator=ansi.OrderByClauseSegment.match_grammar.terminator, # type: ignore ) parse_grammar: Optional[Matchable] = Sequence( "SORT", "BY", Indent, Delimited( Sequence( OneOf( Ref("ColumnReferenceSegment"), Ref("NumericLiteralSegment"), Ref("ExpressionSegment"), ), OneOf("ASC", "DESC", optional=True), Sequence("NULLS", OneOf("FIRST", "LAST"), optional=True), ), terminator=OneOf(Ref.keyword("LIMIT"), Ref("FrameClauseUnitGrammar")), ), Dedent, )
class TdTablePartitioningLevel(BaseSegment): """Partitioning Level. https://docs.teradata.com/reader/eWpPpcMoLGQcZEoyt5AjEg/e0GX8Iw16u1SCwYvc5qXzg partition_expression or COLUMN [[NO] AUTO COMPRESS] [[ALL BUT] column_partition] [ADD constant] column_partition := ([COLUMN|ROW] column_name (, column_name2, ...) NO AUTOCOMPRESS partition_expression := CASE_N, RANGE_N, EXTRACT, expression and in case of multi-level in parenthesis """ type = "td_partitioning_level" match_grammar = OneOf( Sequence( Ref("FunctionNameSegment"), Bracketed(Anything(optional=True)), ), Bracketed( Delimited( Sequence( Ref("FunctionNameSegment"), Bracketed(Anything(optional=True)), ), delimiter=Ref("CommaSegment"), ), ), )
class TypelessStructSegment(BaseSegment): """Expression to construct a STRUCT with implicit types. https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#typeless_struct_syntax """ type = "typeless_struct" match_grammar = Sequence( "STRUCT", Bracketed( Delimited( AnyNumberOf( Sequence( OneOf( Ref("LiteralGrammar"), Ref("FunctionSegment"), Ref("IntervalExpressionSegment"), Ref("ObjectReferenceSegment"), Ref("ExpressionSegment"), ), Ref("AliasExpressionSegment", optional=True), ), ), delimiter=Ref("CommaSegment"), ), optional=True, ), )
class TdCollectStatisticsStatementSegment(BaseSegment): """A `COLLECT STATISTICS (Optimizer Form)` statement. # TODO: Make complete COLLECT [SUMMARY] (STATISTICS|STAT) [[COLUMN| [UNIQUE] INDEX] (expression (, expression ...)] ON TABLENAME """ type = "collect_statistics_statement" match_grammar = Sequence( "COLLECT", Ref.keyword("SUMMARY", optional=True), OneOf("STATISTICS", "STAT"), OneOf( Sequence( OneOf( "COLUMN", Sequence( Ref.keyword("UNIQUE", optional=True), "INDEX", ), ), OneOf( Bracketed( Delimited(Ref("ObjectReferenceSegment"), delimiter=Ref("CommaSegment"))), Ref("ObjectReferenceSegment"), ), ), optional=True, ), "ON", Ref("ObjectReferenceSegment"), )
class TdColumnOptionSegment(BaseSegment): """Teradata specific column attributes. e.g. CHARACTER SET LATIN or [NOT] CASESPECIFIC """ type = "td_column_attribute_constraint" match_grammar = Sequence( OneOf( Sequence( # CHARACTER SET LATIN "CHARACTER", "SET", Ref("SingleIdentifierGrammar")), Sequence( # [NOT] CASESPECIFIC Ref.keyword("NOT", optional=True), "CASESPECIFIC", ), Sequence( # COMPRESS [(1.,3.) | 3. | NULL], "COMPRESS", OneOf( Bracketed( Delimited(Ref("LiteralGrammar"), delimiter=Ref("CommaSegment"))), Ref("LiteralGrammar"), "NULL", optional=True, ), ), ), )
class CreateTableAsStatementSegment(BaseSegment): """A `CREATE TABLE AS` statement. As specified in https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_AS.html """ type = "create_table_as_statement" match_grammar = Sequence( "CREATE", Sequence( Ref.keyword("LOCAL", optional=True), OneOf("TEMPORARY", "TEMP"), optional=True, ), "TABLE", Ref("ObjectReferenceSegment"), Bracketed( Delimited(Ref("ColumnReferenceSegment"), ), optional=True, ), Sequence("BACKUP", OneOf("YES", "NO"), optional=True), Ref("TableAttributeSegment", optional=True), "AS", OptionallyBracketed(Ref("SelectableGrammar")), )
class ColumnReferenceSegment(ObjectReferenceSegment): # type: ignore """A reference to column, field or alias. Adjusted to support column references for Redshift's SUPER data type (https://docs.aws.amazon.com/redshift/latest/dg/super-overview.html), which uses a subset of the PartiQL language (https://partiql.org/) to reference columns. """ type = "column_reference" match_grammar: Matchable = Delimited( Sequence( Ref("SingleIdentifierGrammar"), AnyNumberOf(Ref("ArrayAccessorSegment")), ), delimiter=OneOf(Ref("DotSegment"), Sequence(Ref("DotSegment"), Ref("DotSegment"))), terminator=OneOf( "ON", "AS", "USING", Ref("CommaSegment"), Ref("CastOperatorSegment"), Ref("BinaryOperatorGrammar"), Ref("ColonSegment"), Ref("DelimiterSegment"), Ref("JoinLikeClauseGrammar"), ), allow_gaps=False, )
class CreateTableStatementSegment(BaseSegment): """A `CREATE TABLE` statement.""" type = "create_table_statement" # https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql?view=sql-server-ver15 # https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-azure-sql-data-warehouse?view=aps-pdw-2016-au7 match_grammar = Sequence( "CREATE", "TABLE", Ref("TableReferenceSegment"), OneOf( # Columns and comment syntax: Sequence( Bracketed( Delimited( OneOf( Ref("TableConstraintSegment"), Ref("ColumnDefinitionSegment"), ), )), Ref("CommentClauseSegment", optional=True), ), # Create AS syntax: Sequence( "AS", OptionallyBracketed(Ref("SelectableGrammar")), ), # Create like syntax Sequence("LIKE", Ref("TableReferenceSegment")), ), Ref("TableDistributionIndexClause", optional=True), # Azure Synapse Analytics specific ) parse_grammar = match_grammar
class TableAttributeSegment(BaseSegment): """Redshift specific table attributes. As specified in https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html """ type = "table_constraint" match_grammar = AnySetOf( Sequence("DISTSTYLE", OneOf("AUTO", "EVEN", "KEY", "ALL"), optional=True), Sequence("DISTKEY", Bracketed(Ref("ColumnReferenceSegment")), optional=True), OneOf( Sequence( OneOf("COMPOUND", "INTERLEAVED", optional=True), "SORTKEY", Bracketed(Delimited(Ref("ColumnReferenceSegment"))), ), Sequence("SORTKEY", "AUTO"), optional=True, ), Sequence("ENCODE", "AUTO", optional=True), )
class AlterGroupStatementSegment(BaseSegment): """`ALTER GROUP` statement. https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_GROUP.html """ type = "alter_group" match_grammar = Sequence( "ALTER", "GROUP", Ref("ObjectReferenceSegment"), OneOf( Sequence( OneOf("ADD", "DROP"), "USER", Delimited(Ref("ObjectReferenceSegment"), ), ), Sequence( "RENAME", "TO", Ref("ObjectReferenceSegment"), ), ), )
class AlterTableColumnClausesSegment(BaseSegment): """ALTER TABLE `column_clauses` per defined in Oracle's grammar. https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/ALTER-TABLE.html If possible, please match the order of this sequence with what's defined in Oracle's column_clauses grammar. """ type = "alter_table_column_clauses" match_grammar = OneOf( # add_column_clause # modify_column_clause Sequence( OneOf( "ADD", "MODIFY", ), OneOf( Ref("ColumnDefinitionSegment"), Bracketed(Delimited(Ref("ColumnDefinitionSegment"))), ), ), # drop_column_clause # @TODO: extend drop_column_clause Sequence( "DROP", OneOf( Sequence("COLUMN", Ref("ColumnReferenceSegment")), Bracketed(Delimited(Ref("ColumnReferenceSegment"))), ), ), # @TODO: add_period_clause # @TODO: drop_period_clause # rename_column_clause Sequence( "RENAME", "COLUMN", Ref("ColumnReferenceSegment"), "TO", Ref("ColumnReferenceSegment"), ) # @TODO: modify_collection_retrieval # @TODO: modify_LOB_storage_clause # @TODO: alter_varray_col_properties )
class TupleSegment(BaseSegment): """Expression to construct a TUPLE. https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#tuple_syntax """ type = "tuple" match_grammar = Bracketed(Delimited(Ref("BaseExpressionElementGrammar")))