// Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group // Portions Copyright (c) 1994, Regents of the University of California // Portions of this file are additionally subject to the following // license and copyright. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or // implied. See the License for the specific language governing // permissions and limitations under the License. // Going to add a new statement? // Consider taking a look at our codelab guide to learn what is needed to add a statement. // https://github.com/cockroachdb/cockroach/blob/master/docs/codelabs/01-sql-statement.md %{ package parser import ( "fmt" "math" "strings" "go/constant" "github.com/cockroachdb/cockroach/pkg/geo/geopb" "github.com/cockroachdb/cockroach/pkg/security/username" "github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgcode" "github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgerror" "github.com/cockroachdb/cockroach/pkg/sql/privilege" "github.com/cockroachdb/cockroach/pkg/sql/scanner" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree/treebin" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree/treecmp" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree/treewindow" "github.com/cockroachdb/cockroach/pkg/sql/sem/idxtype" "github.com/cockroachdb/cockroach/pkg/sql/types" "github.com/cockroachdb/cockroach/pkg/util/vector" "github.com/cockroachdb/errors" "github.com/lib/pq/oid" ) // MaxUint is the maximum value of an uint. const MaxUint = ^uint(0) // MaxInt is the maximum value of an int. const MaxInt = int(MaxUint >> 1) func unimplemented(sqllex sqlLexer, feature string) int { sqllex.(*lexer).Unimplemented(feature) return 1 } func purposelyUnimplemented(sqllex sqlLexer, feature string, reason string) int { sqllex.(*lexer).PurposelyUnimplemented(feature, reason) return 1 } func setErr(sqllex sqlLexer, err error) int { sqllex.(*lexer).setErr(err) return 1 } func setErrNoDetails(sqllex sqlLexer, err error) int { sqllex.(*lexer).setErrNoDetails(err) return 1 } func unimplementedWithIssue(sqllex sqlLexer, issue int) int { sqllex.(*lexer).UnimplementedWithIssue(issue) return 1 } func unimplementedWithIssueDetail(sqllex sqlLexer, issue int, detail string) int { sqllex.(*lexer).UnimplementedWithIssueDetail(issue, detail) return 1 } func processBinaryQualOp( sqllex sqlLexer, op tree.Operator, lhs tree.Expr, rhs tree.Expr, ) (tree.Expr, int) { switch op := op.(type) { case treebin.BinaryOperator: op.IsExplicitOperator = true return &tree.BinaryExpr{Operator: op, Left: lhs, Right: rhs}, 0 case treecmp.ComparisonOperator: op.IsExplicitOperator = true return &tree.ComparisonExpr{Operator: op, Left: lhs, Right: rhs}, 0 case tree.UnaryOperator: // We have a unary operator which have the same symbol as the binary // operator, so adjust accordingly. switch op.Symbol { case tree.UnaryComplement: return &tree.ComparisonExpr{ Operator: treecmp.ComparisonOperator{ Symbol: treecmp.RegMatch, IsExplicitOperator: true, }, Left: lhs, Right: rhs, }, 0 default: sqllex.Error(fmt.Sprintf("unknown binary operator %s", op)) return nil, -1 } default: sqllex.Error(fmt.Sprintf("unknown binary operator %s", op)) return nil, 1 } } func processUnaryQualOp( sqllex sqlLexer, op tree.Operator, expr tree.Expr, ) (tree.Expr, int) { e, code := processUnaryQualOpInternal(sqllex, op, expr) if code != 0 { return e, code } if e, ok := e.(*tree.UnaryExpr); ok { e.Operator.IsExplicitOperator = true } return e, code } func processUnaryQualOpInternal( sqllex sqlLexer, op tree.Operator, expr tree.Expr, ) (tree.Expr, int) { switch op := op.(type) { case tree.UnaryOperator: return &tree.UnaryExpr{Operator: op, Expr: expr}, 0 case treebin.BinaryOperator: // We have some binary operators which have the same symbol as the unary // operator, so adjust accordingly. switch op.Symbol { case treebin.Plus: return &tree.UnaryExpr{ Operator: tree.MakeUnaryOperator(tree.UnaryPlus), Expr: expr, }, 0 case treebin.Minus: return &tree.UnaryExpr{ Operator: tree.MakeUnaryOperator(tree.UnaryMinus), Expr: expr, }, 0 } case treecmp.ComparisonOperator: switch op.Symbol { case treecmp.RegMatch: return &tree.UnaryExpr{ Operator: tree.MakeUnaryOperator(tree.UnaryComplement), Expr: expr, }, 0 } } sqllex.Error(fmt.Sprintf("unknown unary operator %s", op)) return nil, 1 } %} %{ // sqlSymType is generated by goyacc, and implements the ScanSymType interface. var _ scanner.ScanSymType = &sqlSymType{} func (s *sqlSymType) ID() int32 { return s.id } func (s *sqlSymType) SetID(id int32) { s.id = id } func (s *sqlSymType) Pos() int32 { return s.pos } func (s *sqlSymType) SetPos(pos int32) { s.pos = pos } func (s *sqlSymType) Str() string { return s.str } func (s *sqlSymType) SetStr(str string) { s.str = str } func (s *sqlSymType) UnionVal() interface{} { return s.union.val } func (s *sqlSymType) SetUnionVal(val interface{}) { s.union.val = val } // sqlSymUnion represents a union of types, providing accessor methods // to retrieve the underlying type stored in the union's empty interface. // The purpose of the sqlSymUnion struct is to reduce the memory footprint of // the sqlSymType because only one value (of a variety of types) is ever needed // to be stored in the union field at a time. // // By using an empty interface, we lose the type checking previously provided // by yacc and the Go compiler when dealing with union values. Instead, runtime // type assertions must be relied upon in the methods below, and as such, the // parser should be thoroughly tested whenever new syntax is added. // // It is important to note that when assigning values to sqlSymUnion.val, all // nil values should be typed so that they are stored as nil instances in the // empty interface, instead of setting the empty interface to nil. This means // that: // $$ = []String(nil) // should be used, instead of: // $$ = nil // to assign a nil string slice to the union. type sqlSymUnion struct { val interface{} } // The following accessor methods come in three forms, depending on the // type of the value being accessed and whether a nil value is admissible // for the corresponding grammar rule. // - Values and pointers are directly type asserted from the empty // interface, regardless of whether a nil value is admissible or // not. A panic occurs if the type assertion is incorrect; no panic occurs // if a nil is not expected but present. (TODO(knz): split this category of // accessor in two; with one checking for unexpected nils.) // Examples: bool(), tableIndexName(). // // - Interfaces where a nil is admissible are handled differently // because a nil instance of an interface inserted into the empty interface // becomes a nil instance of the empty interface and therefore will fail a // direct type assertion. Instead, a guarded type assertion must be used, // which returns nil if the type assertion fails. // Examples: expr(), stmt(). // // - Interfaces where a nil is not admissible are implemented as a direct // type assertion, which causes a panic to occur if an unexpected nil // is encountered. // Examples: tblDef(). // func (u *sqlSymUnion) numVal() *tree.NumVal { return u.val.(*tree.NumVal) } func (u *sqlSymUnion) strVal() *tree.StrVal { if stmt, ok := u.val.(*tree.StrVal); ok { return stmt } return nil } func (u *sqlSymUnion) placeholder() *tree.Placeholder { return u.val.(*tree.Placeholder) } func (u *sqlSymUnion) auditMode() tree.AuditMode { return u.val.(tree.AuditMode) } func (u *sqlSymUnion) bool() bool { return u.val.(bool) } func (u *sqlSymUnion) viewOptions() *tree.ViewOptions { return u.val.(*tree.ViewOptions) } func (u *sqlSymUnion) strPtr() *string { return u.val.(*string) } func (u *sqlSymUnion) strs() []string { return u.val.([]string) } func (u *sqlSymUnion) roleSpec() tree.RoleSpec { return u.val.(tree.RoleSpec) } func (u *sqlSymUnion) roleSpecList() tree.RoleSpecList { return u.val.(tree.RoleSpecList) } func (u *sqlSymUnion) user() username.SQLUsername { return u.val.(username.SQLUsername) } func (u *sqlSymUnion) userPtr() *username.SQLUsername { return u.val.(*username.SQLUsername) } func (u *sqlSymUnion) users() []username.SQLUsername { return u.val.([]username.SQLUsername) } func (u *sqlSymUnion) newTableIndexName() *tree.TableIndexName { tn := u.val.(tree.TableIndexName) return &tn } func (u *sqlSymUnion) tableIndexName() tree.TableIndexName { return u.val.(tree.TableIndexName) } func (u *sqlSymUnion) newTableIndexNames() tree.TableIndexNames { return u.val.(tree.TableIndexNames) } func (u *sqlSymUnion) shardedIndexDef() *tree.ShardedIndexDef { return u.val.(*tree.ShardedIndexDef) } func (u *sqlSymUnion) nameList() tree.NameList { return u.val.(tree.NameList) } func (u *sqlSymUnion) enumValueList() tree.EnumValueList { return u.val.(tree.EnumValueList) } func (u *sqlSymUnion) compositeTypeList() []tree.CompositeTypeElem { return u.val.([]tree.CompositeTypeElem) } func (u *sqlSymUnion) domainConstraintDefs() []tree.DomainConstraintDef { return u.val.([]tree.DomainConstraintDef) } func (u *sqlSymUnion) createType() *tree.CreateType { return u.val.(*tree.CreateType) } func (u *sqlSymUnion) unresolvedName() *tree.UnresolvedName { return u.val.(*tree.UnresolvedName) } func (u *sqlSymUnion) unresolvedObjectName() *tree.UnresolvedObjectName { return u.val.(*tree.UnresolvedObjectName) } func (u *sqlSymUnion) unresolvedObjectNames() []*tree.UnresolvedObjectName { return u.val.([]*tree.UnresolvedObjectName) } func (u *sqlSymUnion) tablePatterns() tree.TablePatterns { return u.val.(tree.TablePatterns) } func (u *sqlSymUnion) tableNames() tree.TableNames { return u.val.(tree.TableNames) } func (u *sqlSymUnion) indexFlags() *tree.IndexFlags { return u.val.(*tree.IndexFlags) } func (u *sqlSymUnion) arraySubscript() *tree.ArraySubscript { return u.val.(*tree.ArraySubscript) } func (u *sqlSymUnion) arraySubscripts() tree.ArraySubscripts { if as, ok := u.val.(tree.ArraySubscripts); ok { return as } return nil } func (u *sqlSymUnion) stmt() tree.Statement { if stmt, ok := u.val.(tree.Statement); ok { return stmt } return nil } func (u *sqlSymUnion) cte() *tree.CTE { if cte, ok := u.val.(*tree.CTE); ok { return cte } return nil } func (u *sqlSymUnion) ctes() []*tree.CTE { return u.val.([]*tree.CTE) } func (u *sqlSymUnion) with() *tree.With { if with, ok := u.val.(*tree.With); ok { return with } return nil } func (u *sqlSymUnion) slct() *tree.Select { return u.val.(*tree.Select) } func (u *sqlSymUnion) selectStmt() tree.SelectStatement { return u.val.(tree.SelectStatement) } func (u *sqlSymUnion) colTableDef() *tree.ColumnTableDef { return u.val.(*tree.ColumnTableDef) } func (u *sqlSymUnion) colDef() tree.ColumnDef { return u.val.(tree.ColumnDef) } func (u *sqlSymUnion) colDefList() tree.ColumnDefList { return u.val.(tree.ColumnDefList) } func (u *sqlSymUnion) constraintDef() tree.ConstraintTableDef { return u.val.(tree.ConstraintTableDef) } func (u *sqlSymUnion) tblDef() tree.TableDef { return u.val.(tree.TableDef) } func (u *sqlSymUnion) tblDefs() tree.TableDefs { return u.val.(tree.TableDefs) } func (u *sqlSymUnion) likeTableOption() tree.LikeTableOption { return u.val.(tree.LikeTableOption) } func (u *sqlSymUnion) likeTableOptionList() []tree.LikeTableOption { return u.val.([]tree.LikeTableOption) } func (u *sqlSymUnion) colQual() tree.NamedColumnQualification { return u.val.(tree.NamedColumnQualification) } func (u *sqlSymUnion) colQualElem() tree.ColumnQualification { return u.val.(tree.ColumnQualification) } func (u *sqlSymUnion) colQuals() []tree.NamedColumnQualification { return u.val.([]tree.NamedColumnQualification) } func (u *sqlSymUnion) storageParam() tree.StorageParam { return u.val.(tree.StorageParam) } func (u *sqlSymUnion) storageParams() []tree.StorageParam { if params, ok := u.val.([]tree.StorageParam); ok { return params } return nil } func (u *sqlSymUnion) storageParamKeys() []string { if params, ok := u.val.([]string); ok { return params } return nil } func (u *sqlSymUnion) tenantCapability() tree.TenantCapability { return u.val.(tree.TenantCapability) } func (u *sqlSymUnion) tenantCapabilities() []tree.TenantCapability { if capabilities, ok := u.val.([]tree.TenantCapability); ok { return capabilities } return nil } func (u *sqlSymUnion) persistence() tree.Persistence { return u.val.(tree.Persistence) } func (u *sqlSymUnion) colType() *types.T { if colType, ok := u.val.(*types.T); ok && colType != nil { return colType } return nil } func (u *sqlSymUnion) tableRefCols() []tree.ColumnID { if refCols, ok := u.val.([]tree.ColumnID); ok { return refCols } return nil } func (u *sqlSymUnion) colTypes() []*types.T { return u.val.([]*types.T) } func (u *sqlSymUnion) int32() int32 { return u.val.(int32) } func (u *sqlSymUnion) int64() int64 { return u.val.(int64) } func (u *sqlSymUnion) int64Ptr() *int64 { return u.val.(*int64) } func (u *sqlSymUnion) seqOpt() tree.SequenceOption { return u.val.(tree.SequenceOption) } func (u *sqlSymUnion) seqOpts() []tree.SequenceOption { return u.val.([]tree.SequenceOption) } func (u *sqlSymUnion) expr() tree.Expr { if expr, ok := u.val.(tree.Expr); ok { return expr } return nil } func (u *sqlSymUnion) exprs() tree.Exprs { return u.val.(tree.Exprs) } func (u *sqlSymUnion) selExpr() tree.SelectExpr { return u.val.(tree.SelectExpr) } func (u *sqlSymUnion) selExprs() tree.SelectExprs { return u.val.(tree.SelectExprs) } func (u *sqlSymUnion) retClause() tree.ReturningClause { return u.val.(tree.ReturningClause) } func (u *sqlSymUnion) aliasClause() tree.AliasClause { return u.val.(tree.AliasClause) } func (u *sqlSymUnion) asOfClause() tree.AsOfClause { return u.val.(tree.AsOfClause) } func (u *sqlSymUnion) tblExpr() tree.TableExpr { return u.val.(tree.TableExpr) } func (u *sqlSymUnion) tblExprs() tree.TableExprs { return u.val.(tree.TableExprs) } func (u *sqlSymUnion) from() tree.From { return u.val.(tree.From) } func (u *sqlSymUnion) batch() *tree.Batch { if batch, ok := u.val.(*tree.Batch); ok { return batch } return nil } func (u *sqlSymUnion) batchParam() tree.BatchParam { return u.val.(tree.BatchParam) } func (u *sqlSymUnion) batchParams() []tree.BatchParam { return u.val.([]tree.BatchParam) } func (u *sqlSymUnion) superRegion() tree.SuperRegion { return u.val.(tree.SuperRegion) } func (u *sqlSymUnion) int32s() []int32 { return u.val.([]int32) } func (u *sqlSymUnion) joinCond() tree.JoinCond { return u.val.(tree.JoinCond) } func (u *sqlSymUnion) when() *tree.When { return u.val.(*tree.When) } func (u *sqlSymUnion) whens() []*tree.When { return u.val.([]*tree.When) } func (u *sqlSymUnion) lockingClause() tree.LockingClause { return u.val.(tree.LockingClause) } func (u *sqlSymUnion) lockingItem() *tree.LockingItem { return u.val.(*tree.LockingItem) } func (u *sqlSymUnion) lockingStrength() tree.LockingStrength { return u.val.(tree.LockingStrength) } func (u *sqlSymUnion) lockingWaitPolicy() tree.LockingWaitPolicy { return u.val.(tree.LockingWaitPolicy) } func (u *sqlSymUnion) updateExpr() *tree.UpdateExpr { return u.val.(*tree.UpdateExpr) } func (u *sqlSymUnion) updateExprs() tree.UpdateExprs { return u.val.(tree.UpdateExprs) } func (u *sqlSymUnion) limit() *tree.Limit { return u.val.(*tree.Limit) } func (u *sqlSymUnion) backupTargetList() tree.BackupTargetList { return u.val.(tree.BackupTargetList) } func (u *sqlSymUnion) backupTargetListPtr() *tree.BackupTargetList { return u.val.(*tree.BackupTargetList) } func (u *sqlSymUnion) grantTargetList() tree.GrantTargetList { return u.val.(tree.GrantTargetList) } func (u *sqlSymUnion) grantTargetListPtr() *tree.GrantTargetList { return u.val.(*tree.GrantTargetList) } func (u *sqlSymUnion) changefeedTableTargets() tree.ChangefeedTableTargets { return u.val.(tree.ChangefeedTableTargets) } func (u *sqlSymUnion) changefeedTableTarget() tree.ChangefeedTableTarget { return u.val.(tree.ChangefeedTableTarget) } func (u *sqlSymUnion) privilegeType() privilege.Kind { return u.val.(privilege.Kind) } func (u *sqlSymUnion) privilegeList() privilege.List { return u.val.(privilege.List) } func (u *sqlSymUnion) onConflict() *tree.OnConflict { return u.val.(*tree.OnConflict) } func (u *sqlSymUnion) orderBy() tree.OrderBy { return u.val.(tree.OrderBy) } func (u *sqlSymUnion) order() *tree.Order { return u.val.(*tree.Order) } func (u *sqlSymUnion) orders() []*tree.Order { return u.val.([]*tree.Order) } func (u *sqlSymUnion) groupBy() tree.GroupBy { return u.val.(tree.GroupBy) } func (u *sqlSymUnion) windowFrame() *tree.WindowFrame { return u.val.(*tree.WindowFrame) } func (u *sqlSymUnion) windowFrameBounds() tree.WindowFrameBounds { return u.val.(tree.WindowFrameBounds) } func (u *sqlSymUnion) windowFrameBound() *tree.WindowFrameBound { return u.val.(*tree.WindowFrameBound) } func (u *sqlSymUnion) windowFrameExclusion() treewindow.WindowFrameExclusion { return u.val.(treewindow.WindowFrameExclusion) } func (u *sqlSymUnion) distinctOn() tree.DistinctOn { return u.val.(tree.DistinctOn) } func (u *sqlSymUnion) dir() tree.Direction { return u.val.(tree.Direction) } func (u *sqlSymUnion) nullsOrder() tree.NullsOrder { return u.val.(tree.NullsOrder) } func (u *sqlSymUnion) alterChangefeedCmd() tree.AlterChangefeedCmd { return u.val.(tree.AlterChangefeedCmd) } func (u *sqlSymUnion) alterChangefeedCmds() tree.AlterChangefeedCmds { return u.val.(tree.AlterChangefeedCmds) } func (u *sqlSymUnion) backupKMS() tree.BackupKMS { return u.val.(tree.BackupKMS) } func (u *sqlSymUnion) alterBackupCmd() tree.AlterBackupCmd { return u.val.(tree.AlterBackupCmd) } func (u *sqlSymUnion) alterBackupCmds() tree.AlterBackupCmds { return u.val.(tree.AlterBackupCmds) } func (u *sqlSymUnion) alterBackupScheduleCmd() tree.AlterBackupScheduleCmd { return u.val.(tree.AlterBackupScheduleCmd) } func (u *sqlSymUnion) alterBackupScheduleCmds() tree.AlterBackupScheduleCmds { return u.val.(tree.AlterBackupScheduleCmds) } func (u *sqlSymUnion) alterTableCmd() tree.AlterTableCmd { return u.val.(tree.AlterTableCmd) } func (u *sqlSymUnion) alterTableCmds() tree.AlterTableCmds { return u.val.(tree.AlterTableCmds) } func (u *sqlSymUnion) alterIndexCmd() tree.AlterIndexCmd { return u.val.(tree.AlterIndexCmd) } func (u *sqlSymUnion) alterIndexCmds() tree.AlterIndexCmds { return u.val.(tree.AlterIndexCmds) } func (u *sqlSymUnion) isoLevel() tree.IsolationLevel { return u.val.(tree.IsolationLevel) } func (u *sqlSymUnion) userPriority() tree.UserPriority { return u.val.(tree.UserPriority) } func (u *sqlSymUnion) readWriteMode() tree.ReadWriteMode { return u.val.(tree.ReadWriteMode) } func (u *sqlSymUnion) deferrableMode() tree.DeferrableMode { return u.val.(tree.DeferrableMode) } func (u *sqlSymUnion) idxElem() tree.IndexElem { return u.val.(tree.IndexElem) } func (u *sqlSymUnion) idxElems() tree.IndexElemList { return u.val.(tree.IndexElemList) } func (u *sqlSymUnion) indexInvisibility() tree.IndexInvisibility { return u.val.(tree.IndexInvisibility) } func (u *sqlSymUnion) dropBehavior() tree.DropBehavior { return u.val.(tree.DropBehavior) } func (u *sqlSymUnion) rlsTableMode() tree.TableRLSMode { return u.val.(tree.TableRLSMode) } func (u *sqlSymUnion) alterPolicy() tree.AlterPolicy { return u.val.(tree.AlterPolicy) } func (u *sqlSymUnion) createPolicy() tree.CreatePolicy { return u.val.(tree.CreatePolicy) } func (u *sqlSymUnion) policyType() tree.PolicyType { return u.val.(tree.PolicyType) } func (u *sqlSymUnion) policyCommand() tree.PolicyCommand { return u.val.(tree.PolicyCommand) } func (u *sqlSymUnion) policyExpressions() tree.PolicyExpressions { return u.val.(tree.PolicyExpressions) } func (u *sqlSymUnion) validationBehavior() tree.ValidationBehavior { return u.val.(tree.ValidationBehavior) } func (u *sqlSymUnion) partitionBy() *tree.PartitionBy { return u.val.(*tree.PartitionBy) } func (u *sqlSymUnion) partitionByTable() *tree.PartitionByTable { return u.val.(*tree.PartitionByTable) } func (u *sqlSymUnion) partitionByIndex() *tree.PartitionByIndex { return u.val.(*tree.PartitionByIndex) } func (u *sqlSymUnion) createTableOnCommitSetting() tree.CreateTableOnCommitSetting { return u.val.(tree.CreateTableOnCommitSetting) } func (u *sqlSymUnion) listPartition() tree.ListPartition { return u.val.(tree.ListPartition) } func (u *sqlSymUnion) listPartitions() []tree.ListPartition { return u.val.([]tree.ListPartition) } func (u *sqlSymUnion) rangePartition() tree.RangePartition { return u.val.(tree.RangePartition) } func (u *sqlSymUnion) rangePartitions() []tree.RangePartition { return u.val.([]tree.RangePartition) } func (u *sqlSymUnion) relocateSubject() tree.RelocateSubject { return u.val.(tree.RelocateSubject) } func (u *sqlSymUnion) setZoneConfig() *tree.SetZoneConfig { return u.val.(*tree.SetZoneConfig) } func (u *sqlSymUnion) tuples() []*tree.Tuple { return u.val.([]*tree.Tuple) } func (u *sqlSymUnion) tuple() *tree.Tuple { return u.val.(*tree.Tuple) } func (u *sqlSymUnion) windowDef() *tree.WindowDef { return u.val.(*tree.WindowDef) } func (u *sqlSymUnion) window() tree.Window { return u.val.(tree.Window) } func (u *sqlSymUnion) op() tree.Operator { return u.val.(tree.Operator) } func (u *sqlSymUnion) cmpOp() treecmp.ComparisonOperator { return u.val.(treecmp.ComparisonOperator) } func (u *sqlSymUnion) intervalTypeMetadata() types.IntervalTypeMetadata { return u.val.(types.IntervalTypeMetadata) } func (u *sqlSymUnion) kvOption() tree.KVOption { return u.val.(tree.KVOption) } func (u *sqlSymUnion) kvOptions() []tree.KVOption { if colType, ok := u.val.([]tree.KVOption); ok { return colType } return nil } func (u *sqlSymUnion) backupOptions() *tree.BackupOptions { return u.val.(*tree.BackupOptions) } func (u *sqlSymUnion) copyOptions() *tree.CopyOptions { return u.val.(*tree.CopyOptions) } func (u *sqlSymUnion) showJobOptions() *tree.ShowJobOptions { return u.val.(*tree.ShowJobOptions) } func (u *sqlSymUnion) showBackupDetails() tree.ShowBackupDetails { return u.val.(tree.ShowBackupDetails) } func (u *sqlSymUnion) showBackupOptions() *tree.ShowBackupOptions { return u.val.(*tree.ShowBackupOptions) } func (u *sqlSymUnion) showBackupTimeFilter() *tree.ShowBackupTimeFilter { return u.val.(*tree.ShowBackupTimeFilter) } func (u *sqlSymUnion) checkExternalConnectionOptions() *tree.CheckExternalConnectionOptions { return u.val.(*tree.CheckExternalConnectionOptions) } func (u *sqlSymUnion) restoreOptions() *tree.RestoreOptions { return u.val.(*tree.RestoreOptions) } func (u *sqlSymUnion) transactionModes() tree.TransactionModes { return u.val.(tree.TransactionModes) } func (u *sqlSymUnion) compositeKeyMatchMethod() tree.CompositeKeyMatchMethod { return u.val.(tree.CompositeKeyMatchMethod) } func (u *sqlSymUnion) referenceAction() tree.ReferenceAction { return u.val.(tree.ReferenceAction) } func (u *sqlSymUnion) referenceActions() tree.ReferenceActions { return u.val.(tree.ReferenceActions) } func (u *sqlSymUnion) createStatsOptions() *tree.CreateStatsOptions { return u.val.(*tree.CreateStatsOptions) } func (u *sqlSymUnion) scrubOptions() tree.ScrubOptions { return u.val.(tree.ScrubOptions) } func (u *sqlSymUnion) scrubOption() tree.ScrubOption { return u.val.(tree.ScrubOption) } func (u *sqlSymUnion) inspectOptions() tree.InspectOptions { return u.val.(tree.InspectOptions) } func (u *sqlSymUnion) inspectOption() tree.InspectOption { return u.val.(tree.InspectOption) } func (u *sqlSymUnion) resolvableFuncRefFromName() tree.ResolvableFunctionReference { return tree.ResolvableFunctionReference{FunctionReference: u.unresolvedName()} } func (u *sqlSymUnion) resolvableFuncRef() tree.ResolvableFunctionReference { return u.val.(tree.ResolvableFunctionReference) } func (u *sqlSymUnion) rowsFromExpr() *tree.RowsFromExpr { return u.val.(*tree.RowsFromExpr) } func (u *sqlSymUnion) stringOrPlaceholderOptList() tree.StringOrPlaceholderOptList { return u.val.(tree.StringOrPlaceholderOptList) } func (u *sqlSymUnion) listOfStringOrPlaceholderOptList() []tree.StringOrPlaceholderOptList { return u.val.([]tree.StringOrPlaceholderOptList) } func (u *sqlSymUnion) fullBackupClause() *tree.FullBackupClause { return u.val.(*tree.FullBackupClause) } func (u *sqlSymUnion) scheduleLabelSpec() *tree.LabelSpec { return u.val.(*tree.LabelSpec) } func (u *sqlSymUnion) labelSpec() *tree.LabelSpec { return u.val.(*tree.LabelSpec) } func (u *sqlSymUnion) geoShapeType() geopb.ShapeType { return u.val.(geopb.ShapeType) } func newNameFromStr(s string) *tree.Name { return (*tree.Name)(&s) } func (u *sqlSymUnion) typeReference() tree.ResolvableTypeReference { return u.val.(tree.ResolvableTypeReference) } func (u *sqlSymUnion) typeReferences() []tree.ResolvableTypeReference { return u.val.([]tree.ResolvableTypeReference) } func (u *sqlSymUnion) alterTypeAddValuePlacement() *tree.AlterTypeAddValuePlacement { return u.val.(*tree.AlterTypeAddValuePlacement) } func (u *sqlSymUnion) scheduleState() tree.ScheduleState { return u.val.(tree.ScheduleState) } func (u *sqlSymUnion) executorType() tree.ScheduledJobExecutorType { return u.val.(tree.ScheduledJobExecutorType) } func (u *sqlSymUnion) refreshDataOption() tree.RefreshDataOption { return u.val.(tree.RefreshDataOption) } func (u *sqlSymUnion) locality() *tree.Locality { return u.val.(*tree.Locality) } func (u *sqlSymUnion) survivalGoal() tree.SurvivalGoal { return u.val.(tree.SurvivalGoal) } func (u *sqlSymUnion) dataPlacement() tree.DataPlacement { return u.val.(tree.DataPlacement) } func (u *sqlSymUnion) objectNamePrefix() tree.ObjectNamePrefix { return u.val.(tree.ObjectNamePrefix) } func (u *sqlSymUnion) objectNamePrefixList() tree.ObjectNamePrefixList { return u.val.(tree.ObjectNamePrefixList) } func (u *sqlSymUnion) abbreviatedGrant() tree.AbbreviatedGrant { return u.val.(tree.AbbreviatedGrant) } func (u *sqlSymUnion) abbreviatedRevoke() tree.AbbreviatedRevoke { return u.val.(tree.AbbreviatedRevoke) } func (u *sqlSymUnion) targetObjectType() privilege.TargetObjectType { return u.val.(privilege.TargetObjectType) } func (u *sqlSymUnion) setVar() *tree.SetVar { return u.val.(*tree.SetVar) } func (u *sqlSymUnion) cursorSensitivity() tree.CursorSensitivity { return u.val.(tree.CursorSensitivity) } func (u *sqlSymUnion) cursorScrollOption() tree.CursorScrollOption { return u.val.(tree.CursorScrollOption) } func (u *sqlSymUnion) cursorStmt() tree.CursorStmt { return u.val.(tree.CursorStmt) } func (u *sqlSymUnion) asTenantClause() tree.TenantID { return u.val.(tree.TenantID) } func (u *sqlSymUnion) routineOptions() tree.RoutineOptions { return u.val.(tree.RoutineOptions) } func (u *sqlSymUnion) functionOption() tree.RoutineOption { return u.val.(tree.RoutineOption) } func (u *sqlSymUnion) routineParams() tree.RoutineParams { return u.val.(tree.RoutineParams) } func (u *sqlSymUnion) routineParam() tree.RoutineParam { return u.val.(tree.RoutineParam) } func (u *sqlSymUnion) routineParamClass() tree.RoutineParamClass { return u.val.(tree.RoutineParamClass) } func (u *sqlSymUnion) stmts() tree.Statements { return u.val.(tree.Statements) } func (u *sqlSymUnion) routineBody() *tree.RoutineBody { return u.val.(*tree.RoutineBody) } func (u *sqlSymUnion) functionObj() tree.RoutineObj { return u.val.(tree.RoutineObj) } func (u *sqlSymUnion) routineObjs() tree.RoutineObjs { return u.val.(tree.RoutineObjs) } func (u *sqlSymUnion) tenantReplicationOptions() *tree.TenantReplicationOptions { return u.val.(*tree.TenantReplicationOptions) } func (u *sqlSymUnion) showRangesOpts() *tree.ShowRangesOptions { return u.val.(*tree.ShowRangesOptions) } func (u *sqlSymUnion) tenantSpec() *tree.TenantSpec { return u.val.(*tree.TenantSpec) } func (u *sqlSymUnion) cteMaterializeClause() tree.CTEMaterializeClause { return u.val.(tree.CTEMaterializeClause) } func (u *sqlSymUnion) showTenantOpts() tree.ShowTenantOptions { return u.val.(tree.ShowTenantOptions) } func (u *sqlSymUnion) showLogicalReplicationJobsOpts() tree.ShowLogicalReplicationJobsOptions { return u.val.(tree.ShowLogicalReplicationJobsOptions) } func (u *sqlSymUnion) showCreateFormatOption() tree.ShowCreateFormatOption { return u.val.(tree.ShowCreateFormatOption) } func (u *sqlSymUnion) beginTransaction() *tree.BeginTransaction { return u.val.(*tree.BeginTransaction) } func (u *sqlSymUnion) showFingerprintOptions() *tree.ShowFingerprintOptions { return u.val.(*tree.ShowFingerprintOptions) } func (u *sqlSymUnion) showHintsOptions() *tree.ShowHintsOptions { return u.val.(*tree.ShowHintsOptions) } func (u *sqlSymUnion) logicalReplicationResources() tree.LogicalReplicationResources { return u.val.(tree.LogicalReplicationResources) } func (u *sqlSymUnion) logicalReplicationOptions() *tree.LogicalReplicationOptions { return u.val.(*tree.LogicalReplicationOptions) } func (u *sqlSymUnion) tableNamePtr() *tree.TableName { return u.val.(*tree.TableName) } func (u *sqlSymUnion) triggerActionTime() tree.TriggerActionTime { return u.val.(tree.TriggerActionTime) } func (u *sqlSymUnion) triggerEvent() *tree.TriggerEvent { return u.val.(*tree.TriggerEvent) } func (u *sqlSymUnion) triggerEvents() []*tree.TriggerEvent { return u.val.([]*tree.TriggerEvent) } func (u *sqlSymUnion) triggerTransition() *tree.TriggerTransition { return u.val.(*tree.TriggerTransition) } func (u *sqlSymUnion) triggerTransitions() []*tree.TriggerTransition { return u.val.([]*tree.TriggerTransition) } func (u *sqlSymUnion) triggerForEach() tree.TriggerForEach { return u.val.(tree.TriggerForEach) } func (u *sqlSymUnion) indexType() idxtype.T { return u.val.(idxtype.T) } func (u *sqlSymUnion) doBlockOptions() tree.DoBlockOptions { return u.val.(tree.DoBlockOptions) } func (u *sqlSymUnion) doBlockOption() tree.DoBlockOption { return u.val.(tree.DoBlockOption) } func (u *sqlSymUnion) changefeedFilterOption() tree.ChangefeedFilterOption { return u.val.(tree.ChangefeedFilterOption) } func (u *sqlSymUnion) filterType() tree.FilterType { return u.val.(tree.FilterType) } %} // NB: the %token definitions must come before the %type definitions in this // file to work around a bug in goyacc. See #16369 for more details. // Non-keyword token types. %token IDENT SCONST BCONST BITCONST %token <*tree.NumVal> ICONST FCONST %token <*tree.Placeholder> PLACEHOLDER %token TYPECAST TYPEANNOTATE DOT_DOT %token LESS_EQUALS GREATER_EQUALS NOT_EQUALS %token NOT_REGMATCH REGIMATCH NOT_REGIMATCH %token ERROR // If you want to make any keyword changes, add the new keyword here as well as // to the appropriate one of the reserved-or-not-so-reserved keyword lists, // below; search this file for "Keyword category lists". // Ordinary key words in alphabetical order. %token ABORT ABSOLUTE ACCESS ACTION ADD ADMIN AFTER AGGREGATE %token ALL ALTER ALWAYS ANALYSE ANALYZE AND AND_AND ANY ANNOTATE_TYPE ARRAY AS ASC AS_JSON AT_AT %token ASENSITIVE ASYMMETRIC AT ATOMIC ATTRIBUTE AUTHORIZATION AUTOMATIC AVAILABILITY AVOID_FULL_SCAN %token BACKUP BACKUPS BACKWARD BATCH BEFORE BEGIN BETWEEN BIDIRECTIONAL BIGINT BIGSERIAL BINARY BIT %token BUCKET_COUNT %token BOOLEAN BOTH BOX2D BY BYPASSRLS %token CACHE CALL CALLED CANCEL CANCELQUERY CAPABILITIES CAPABILITY CASCADE CASE CAST CBRT CHAIN CHANGEFEED CHAR %token CHARACTER CHARACTERISTICS CHECK CHECK_FILES CLOSE %token CLUSTER CLUSTERS COALESCE COLLATE COLLATION COLUMN COLUMNS COMMENT COMMENTS COMMIT %token COMMITTED COMPACT COMPLETE COMPLETIONS CONCAT CONCURRENTLY CONFIGURATION CONFIGURATIONS CONFIGURE %token CONFLICT CONNECTION CONNECTIONS CONSTRAINT CONSTRAINTS CONTAINS CONTROLCHANGEFEED CONTROLJOB %token CONVERSION CONVERT COPY COS_DISTANCE COST COVERING CREATE CREATEDB CREATELOGIN CREATEROLE %token CROSS CSV CUBE CURRENT CURRENT_CATALOG CURRENT_DATE CURRENT_SCHEMA %token CURRENT_ROLE CURRENT_TIME CURRENT_TIMESTAMP %token CURRENT_USER CURSOR CYCLE %token DATA DATABASE DATABASES DATE DAY DEBUG_IDS DEC DECIMAL DEFAULT DEFAULTS DEFINER %token DEALLOCATE DECLARE DEFERRABLE DEFERRED DELETE DELIMITER DEPENDS DESC DESTINATION DETACHED DETAILS %token DISABLE DISCARD DISTANCE DISTINCT DO DOMAIN DOUBLE DROP %token EACH ELSE ENABLE ENCODING ENCRYPTED ENCRYPTION_PASSPHRASE END ENUM ENUMS ERRORS ESCAPE %token EXCEPT EXCLUDE EXCLUDING EXPLICIT EXISTS EXECUTE EXECUTION EXPERIMENTAL %token EXPERIMENTAL_FINGERPRINTS EXPERIMENTAL_REPLICA %token EXPERIMENTAL_AUDIT EXPERIMENTAL_RELOCATE %token EXPIRATION EXPLAIN EXPORT EXTENSION EXTERNAL EXTRACT EXTRACT_DURATION EXTREMES %token FAILURE FALSE FAMILY FETCH FETCHVAL FETCHTEXT FETCHVAL_PATH FETCHTEXT_PATH %token FILES FILTER FINGERPRINTS %token FIRST FIRST_CONTAINED_BY FIRST_CONTAINS FLOAT FLOAT4 FLOAT8 FLOORDIV FOLLOWING FOR FORCE FORCE_INDEX %token FORCE_INVERTED_INDEX FORCE_NOT_NULL FORCE_NULL FORCE_QUOTE FORCE_ZIGZAG %token FOREIGN FORMAT FORWARD FREEZE FROM FULL FUNCTION FUNCTIONS %token GENERATED GEOGRAPHY GEOMETRY GEOMETRYM GEOMETRYZ GEOMETRYZM %token GEOMETRYCOLLECTION GEOMETRYCOLLECTIONM GEOMETRYCOLLECTIONZ GEOMETRYCOLLECTIONZM %token GLOBAL GOAL GRANT GRANTEE GRANTS GREATEST GROUP GROUPING GROUPS %token HAVING HASH HEADER HIGH HINTS HISTOGRAM HOLD HOUR %token IDENTITY %token IF IFERROR IFNULL IGNORE_FOREIGN_KEYS ILIKE IMMEDIATE IMMEDIATELY IMMUTABLE IMPORT IN INCLUDE %token INCLUDING INCLUDE_ALL_SECONDARY_TENANTS INCLUDE_ALL_VIRTUAL_CLUSTERS INCREMENT %token INET INET_CONTAINED_BY_OR_EQUALS %token INET_CONTAINS_OR_EQUALS INDEX INDEXES INHERITS INJECT INITIALLY %token INDEX_BEFORE_PAREN INDEX_BEFORE_NAME_THEN_PAREN INDEX_AFTER_ORDER_BY_BEFORE_AT %token INNER INOUT INPUT INSENSITIVE INSERT INSPECT INSTEAD INT INTEGER %token INTERSECT INTERVAL INTO INTO_DB INVERTED INVOKER IS ISERROR ISNULL ISOLATION %token JOB JOBS JOIN JSON JSONB JSON_SOME_EXISTS JSON_ALL_EXISTS %token KEY KEYS KMS KV %token LABEL LANGUAGE LAST LATERAL LATEST LC_CTYPE LC_COLLATE %token LEADING LEASE LEAST LEAKPROOF LEFT LESS LEVEL LIKE LIMIT %token LINESTRING LINESTRINGM LINESTRINGZ LINESTRINGZM %token LIST LOCAL LOCALITY LOCALTIME LOCALTIMESTAMP LOCKED LOGGED LOGICAL LOGICALLY LOGIN LOOKUP LOW LSHIFT %token MATCH MATERIALIZED MERGE MINVALUE MAXVALUE METHOD MINUTE MODIFYCLUSTERSETTING MODE MONTH MOVE %token MULTILINESTRING MULTILINESTRINGM MULTILINESTRINGZ MULTILINESTRINGZM %token MULTIPOINT MULTIPOINTM MULTIPOINTZ MULTIPOINTZM %token MULTIPOLYGON MULTIPOLYGONM MULTIPOLYGONZ MULTIPOLYGONZM %token NAN NAME NAMES NATURAL NEG_INNER_PRODUCT NEVER NEW NEWER NEW_DB_NAME NEW_KMS NEXT NO NOBYPASSRLS NOCANCELQUERY NOCONTROLCHANGEFEED %token NOCONTROLJOB NOCREATEDB NOCREATELOGIN NOCREATEROLE NODE NOLOGIN NOMODIFYCLUSTERSETTING NOREPLICATION %token NOSQLLOGIN NO_INDEX_JOIN NO_ZIGZAG_JOIN NO_FULL_SCAN NONE NONVOTERS NORMAL NOT %token NOTHING NOTHING_AFTER_RETURNING %token NOTNULL %token NOVIEWACTIVITY NOVIEWACTIVITYREDACTED NOVIEWCLUSTERSETTING NOWAIT NULL NULLIF NULLS NUMERIC %token OF OFF OFFSET OID OIDS OIDVECTOR OLD OLDER OLD_KMS ON ONLY OPT OPTION OPTIONS OR %token ORDER ORDINALITY OTHERS OUT OUTER OVER OVERLAPS OVERLAY OWNED OWNER OPERATOR %token PARALLEL PARENT PARTIAL PARTITION PARTITIONS PASSWORD PAUSE PAUSED PER PERMISSIVE PHYSICAL PLACEMENT PLACING %token PLAN PLANS POINT POINTM POINTZ POINTZM POLICIES POLICY POLYGON POLYGONM POLYGONZ POLYGONZM %token POSITION PRECEDING PRECISION PREPARE PREPARED PRESERVE PRIMARY PRIOR PRIORITY PRIVILEGES PUSH %token PROCEDURAL PROCEDURE PROCEDURES PROVISIONSRC PUBLIC PUBLICATION %token QUERIES QUERY QUOTE %token RANGE RANGES READ REAL REASON REASSIGN RECURSIVE RECURRING REDACT REF REFERENCES REFERENCING REFRESH %token REGCLASS REGION REGIONAL REGIONS REGNAMESPACE REGPROC REGPROCEDURE REGROLE REGTYPE REINDEX %token RELATIVE RELOCATE REMOVE_PATH REMOVE_REGIONS RENAME REPEATABLE REPLACE REPLICATED REPLICATION %token RELEASE RESET RESOLVED RESTART RESTORE RESTRICT RESTRICTED RESTRICTIVE RESUME RETENTION RETURNING RETURN RETURNS REVISION REVISION_HISTORY %token REVOKE RIGHT ROLE ROLES ROLLBACK ROLLUP ROUTINES ROW ROWS RSHIFT RULE RUN RUNNING %token SAVEPOINT SCANS SCATTER SCHEDULE SCHEDULES SCROLL SCHEMA SCHEMA_ONLY SCHEMAS SCRUB %token SEARCH SECOND SECONDARY SECURITY SECURITY_INVOKER SELECT SEQUENCE SEQUENCES %token SERIALIZABLE SERVER SERVICE SESSION SESSIONS SESSION_USER SET SETOF SETS SETTING SETTINGS %token SHARE SHARED SHOW SIMILAR SIMPLE SIZE SKIP SKIP_LOCALITIES_CHECK SKIP_MISSING_FOREIGN_KEYS %token SKIP_MISSING_SEQUENCES SKIP_MISSING_SEQUENCE_OWNERS SKIP_MISSING_VIEWS SKIP_MISSING_UDFS SMALLINT SMALLSERIAL %token SNAPSHOT SOME SOURCE SPLIT SQL SQLLOGIN %token STABLE START STATE STATEMENT STATISTICS STATUS STDIN STDOUT STOP STRAIGHT STREAM STRICT STRING STORAGE STORE STORED STORING SUBJECT SUBSTRING SUPER %token SUPPORT SURVIVE SURVIVAL SYMMETRIC SYNTAX SYSTEM SQRT SUBSCRIPTION STATEMENTS %token TABLE TABLES TABLESPACE TEMP TEMPLATE TEMPORARY TENANT TENANT_NAME TENANTS TESTING_RELOCATE TEXT THAN THEN %token TIES TIME TIMETZ TIMESTAMP TIMESTAMPTZ TO THROTTLING TRAILING TRACE %token TRANSACTION TRANSACTIONS TRANSFER TRANSFORM TREAT TRIGGER TRIGGERS TRIM TRUE %token TRUNCATE TRUSTED TYPE TYPES %token TRACING %token UNBOUNDED UNCOMMITTED UNIDIRECTIONAL UNION UNIQUE UNKNOWN UNLISTEN UNLOGGED UNSAFE_RESTORE_INCOMPATIBLE_VERSION UNSPLIT %token UPDATE UPDATES_CLUSTER_MONITORING_METRICS UPSERT UNSET UNTIL USE USER USERS USING UUID %token VALID VALIDATE VALUE VALUES VARBIT VARCHAR VARIADIC VECTOR VERIFY_BACKUP_TABLE_DATA VIEW VARIABLES VARYING VIEWACTIVITY VIEWACTIVITYREDACTED %token VIEWCLUSTERSETTING VIRTUAL VISIBLE INVISIBLE VISIBILITY VOLATILE VOTERS %token VIRTUAL_CLUSTER_NAME VIRTUAL_CLUSTER %token WATCHED_TABLES WHEN WHERE WINDOW WITH WITHIN WITHOUT WORK WRITE %token YEAR %token ZONE // The grammar thinks these are keywords, but they are not in any category // and so can never be entered directly. The filter in scan.go creates these // tokens when required (based on looking one token ahead). // Reference: pkg/sql/parser/lexer.go // // - NOT_LA exists so that productions such as NOT LIKE can be given the same // precedence as LIKE; otherwise they'd effectively have the same precedence as // NOT, at least with respect to their left-hand subexpression. // - WITH_LA is needed to make the grammar LALR(1). // - GENERATED_ALWAYS is needed to support the Postgres syntax for computed // columns along with our family related extensions (CREATE FAMILY/CREATE FAMILY // family_name). // - RESET_ALL is used to differentiate `RESET var` from `RESET ALL`. // - ROLE_ALL and USER_ALL are used in ALTER ROLE and SHOW DEFAULT SESSION VARIABLES FOR ROLE statements that affect all // roles. // - ON_LA is needed for ON UPDATE and ON DELETE expressions for foreign key // references. // - TENANT_ALL is used to differentiate `ALTER TENANT ` from // `ALTER TENANT ALL`. Ditto `CLUSTER_ALL` and `CLUSTER ALL`. %token NOT_LA NULLS_LA WITH_LA AS_LA GENERATED_ALWAYS GENERATED_BY_DEFAULT RESET_ALL ROLE_ALL %token USER_ALL ON_LA TENANT_ALL CLUSTER_ALL SET_TRACING CREATE_CHANGEFEED_FOR_DATABASE FOR_TABLE %token FOR_JOB %token EXECUTE_SCHEDULE EXECUTE_SCHEDULES %union { id int32 pos int32 str string union sqlSymUnion } %type stmt_block %type stmt stmt_without_legacy_transaction %type alter_stmt %type alter_changefeed_stmt %type alter_backup_stmt %type alter_ddl_stmt %type alter_table_stmt %type alter_index_stmt %type alter_view_stmt %type alter_sequence_stmt %type alter_database_stmt %type alter_range_stmt %type alter_partition_stmt %type alter_role_stmt %type <*tree.SetVar> set_or_reset_clause %type alter_type_stmt %type alter_schema_stmt %type alter_unsupported_stmt %type alter_func_stmt %type alter_proc_stmt %type alter_policy_stmt // ALTER RANGE %type alter_zone_range_stmt %type alter_range_relocate_stmt // ALTER TABLE %type alter_onetable_stmt %type alter_split_stmt %type alter_unsplit_stmt %type alter_rename_table_stmt %type alter_scatter_stmt %type alter_relocate_stmt %type alter_zone_table_stmt %type alter_table_set_schema_stmt %type alter_table_locality_stmt %type alter_table_logged_stmt %type alter_table_owner_stmt // ALTER VIRTUAL CLUSTER %type alter_virtual_cluster_stmt // ALTER VIRTUAL CLUSTER CAPABILITY %type virtual_cluster_capability virtual_cluster_capability_list // ALTER VIRTUAL CLUSTER SET CLUSTER SETTING %type alter_virtual_cluster_csetting_stmt // ALTER VIRTUAL CLUSTER CAPABILITY %type alter_virtual_cluster_capability_stmt // Other ALTER VIRTUAL CLUSTER statements. %type alter_virtual_cluster_replication_stmt %type alter_virtual_cluster_rename_stmt %type alter_virtual_cluster_reset_stmt %type alter_virtual_cluster_service_stmt // ALTER PARTITION %type alter_zone_partition_stmt // ALTER DATABASE %type alter_rename_database_stmt %type alter_database_to_schema_stmt %type alter_database_add_region_stmt %type alter_database_drop_region_stmt %type alter_database_survival_goal_stmt %type alter_database_primary_region_stmt %type alter_zone_database_stmt %type alter_database_owner %type alter_database_placement_stmt %type alter_database_set_stmt %type alter_database_add_super_region %type alter_database_alter_super_region %type alter_database_drop_super_region %type alter_database_set_secondary_region_stmt %type alter_database_drop_secondary_region %type alter_database_set_zone_config_extension_stmt // ALTER INDEX %type alter_oneindex_stmt %type alter_scatter_index_stmt %type alter_split_index_stmt %type alter_unsplit_index_stmt %type alter_rename_index_stmt %type alter_relocate_index_stmt %type alter_zone_index_stmt %type alter_index_visible_stmt // ALTER VIEW %type alter_rename_view_stmt %type alter_view_set_schema_stmt %type alter_view_owner_stmt %type alter_view_set_options_stmt %type alter_view_reset_options_stmt // ALTER SEQUENCE %type alter_rename_sequence_stmt %type alter_sequence_options_stmt %type alter_sequence_set_schema_stmt %type alter_sequence_owner_stmt // ALTER DEFAULT PRIVILEGES %type alter_default_privileges_stmt // ALTER FUNCTION %type alter_func_options_stmt %type alter_func_rename_stmt %type alter_func_set_schema_stmt %type alter_func_owner_stmt %type alter_func_dep_extension_stmt // ALTER PROCEDURE %type alter_proc_rename_stmt %type alter_proc_set_schema_stmt %type alter_proc_owner_stmt %type backup_stmt %type begin_stmt %type call_stmt %type cancel_stmt %type cancel_jobs_stmt %type cancel_queries_stmt %type cancel_sessions_stmt %type cancel_all_jobs_stmt // SCRUB %type scrub_stmt %type scrub_database_stmt %type scrub_table_stmt %type opt_scrub_options_clause %type scrub_option_list %type scrub_option // INSPECT %type inspect_stmt %type inspect_table_stmt %type inspect_database_stmt %type opt_inspect_options_clause %type inspect_option_list %type inspect_option %type comment_stmt %type commit_stmt %type copy_stmt %type create_stmt %type create_schedule_stmt %type create_changefeed_stmt create_schedule_for_changefeed_stmt %type create_ddl_stmt %type create_database_stmt %type create_extension_stmt %type create_external_connection_stmt %type alter_external_connection_stmt %type create_index_stmt %type create_role_stmt %type create_schedule_for_backup_stmt %type alter_backup_schedule %type create_schema_stmt %type create_table_stmt %type create_table_as_stmt %type create_virtual_cluster_stmt %type create_logical_replication_stream_stmt %type create_view_stmt %type create_sequence_stmt %type create_func_stmt %type create_proc_stmt %type create_trigger_stmt %type create_policy_stmt %type check_stmt %type check_external_connection_stmt %type logical_replication_resources logical_replication_resources_list %type <*tree.LogicalReplicationOptions> opt_logical_replication_options logical_replication_options logical_replication_options_list opt_logical_replication_create_table_options logical_replication_create_table_options logical_replication_create_table_options_list %type create_stats_stmt %type <*tree.CreateStatsOptions> opt_create_stats_options %type <*tree.CreateStatsOptions> create_stats_option_list %type <*tree.CreateStatsOptions> create_stats_option %type <*tree.CheckExternalConnectionOptions> opt_with_check_external_connection_options_list check_external_connection_options_list check_external_connection_options %type create_type_stmt %type create_domain_stmt %type delete_stmt %type discard_stmt %type drop_stmt %type drop_ddl_stmt %type drop_database_stmt %type drop_external_connection_stmt %type drop_index_stmt %type drop_role_stmt %type drop_schema_stmt %type drop_table_stmt %type drop_type_stmt %type drop_view_stmt %type drop_sequence_stmt %type drop_func_stmt %type drop_policy_stmt %type drop_proc_stmt %type drop_trigger_stmt %type drop_virtual_cluster_stmt %type opt_immediate %type opt_with_explicit_columns %type analyze_stmt %type explain_stmt %type prepare_stmt %type preparable_stmt %type explainable_stmt %type row_source_extension_stmt %type copy_to_stmt %type do_stmt %type export_stmt %type execute_stmt %type deallocate_stmt %type grant_stmt %type insert_stmt %type import_stmt %type pause_stmt pause_jobs_stmt pause_schedules_stmt pause_all_jobs_stmt alter_job_stmt %type <*tree.Select> for_schedules_clause %type reassign_owned_by_stmt %type drop_owned_by_stmt %type release_stmt %type reset_stmt reset_session_stmt reset_csetting_stmt %type resume_stmt resume_jobs_stmt resume_schedules_stmt resume_all_jobs_stmt %type drop_schedule_stmt %type execute_schedules_stmt %type restore_stmt %type string_or_placeholder_opt_list %type revoke_stmt %type refresh_stmt %type <*tree.Select> select_stmt %type abort_stmt %type rollback_stmt %type savepoint_stmt %type prepare_transaction_stmt %type commit_prepared_stmt %type rollback_prepared_stmt %type preparable_set_stmt nonpreparable_set_stmt %type set_local_stmt %type set_session_stmt %type set_csetting_stmt set_or_reset_csetting_stmt %type set_transaction_stmt %type set_exprs_internal %type generic_set %type set_rest_more %type set_rest %type set_names %type show_stmt %type show_backup_stmt %type show_columns_stmt %type show_commit_timestamp_stmt %type show_constraints_stmt %type show_triggers_stmt %type show_create_stmt %type opt_show_create_format_options %type show_create_schedules_stmt %type show_create_external_connections_stmt %type show_csettings_stmt show_local_or_virtual_cluster_csettings_stmt %type show_databases_stmt %type show_default_privileges_stmt %type show_enums_stmt %type show_external_connections_stmt %type show_fingerprints_stmt opt_with_show_fingerprints_options fingerprint_options_list fingerprint_options %type show_statement_hints_stmt opt_with_show_hints_options show_hints_options_list show_hints_options %type experimental_or_not_fingerprints %type show_functions_stmt %type show_procedures_stmt %type show_grants_stmt %type show_histogram_stmt %type show_indexes_stmt %type show_partitions_stmt %type show_jobs_stmt %type show_statements_stmt %type show_ranges_stmt %type show_range_for_row_stmt %type show_locality_stmt %type show_survival_goal_stmt %type show_regions_stmt %type show_roles_stmt %type show_schemas_stmt %type show_sequences_stmt %type show_session_stmt %type show_sessions_stmt %type show_savepoint_stmt %type show_stats_stmt %type show_syntax_stmt %type show_last_query_stats_stmt %type show_tables_stmt %type show_virtual_cluster_stmt opt_show_virtual_cluster_options show_virtual_cluster_options %type show_trace_stmt %type show_transaction_stmt %type show_transactions_stmt %type show_transfer_stmt %type show_types_stmt %type show_users_stmt %type show_default_session_variables_for_role_stmt %type show_zone_stmt %type show_schedules_stmt %type show_full_scans_stmt %type show_completions_stmt %type show_logical_replication_jobs_stmt opt_show_logical_replication_jobs_options show_logical_replication_jobs_options %type show_policies_stmt %type show_inspect_errors_stmt %type <*tree.TableName> opt_for_table_clause %type <*int64> opt_for_job_clause %type opt_with_details %type statements_or_queries %type session_var %type <*string> comment_text %type transaction_stmt legacy_transaction_stmt legacy_begin_stmt legacy_end_stmt %type truncate_stmt %type unlisten_stmt %type update_stmt %type upsert_stmt %type use_stmt %type close_cursor_stmt %type declare_cursor_stmt %type fetch_cursor_stmt %type move_cursor_stmt %type cursor_movement_specifier %type opt_hold opt_binary opt_transaction_chain %type opt_sensitivity %type opt_scroll %type opt_forward_backward forward_backward %type next_prior %type reindex_stmt %type kv_option %type <[]tree.KVOption> kv_option_list opt_with_options var_set_list opt_with_schedule_options %type <*tree.BackupOptions> opt_with_backup_options backup_options backup_options_list %type <*tree.RestoreOptions> opt_with_restore_options restore_options restore_options_list %type <*tree.TenantReplicationOptions> opt_with_replication_options replication_options replication_options_list source_replication_options source_replication_options_list %type show_backup_details %type <*tree.ShowJobOptions> show_job_options show_job_options_list %type <*tree.ShowBackupOptions> opt_with_show_backup_options show_backup_options show_backup_options_list opt_with_show_backups_options show_backups_options %type <*tree.ShowBackupTimeFilter> opt_show_backups_time_filter_clause %type <*tree.CopyOptions> opt_with_copy_options copy_options copy_options_list copy_generic_options copy_generic_options_list %type import_format %type storage_parameter_key %type <[]string> storage_parameter_key_list %type storage_parameter %type <[]tree.StorageParam> storage_parameter_list opt_table_with opt_with_storage_parameter_list %type <*tree.Select> select_no_parens %type select_clause select_with_parens simple_select values_clause table_clause simple_select_clause %type for_locking_clause opt_for_locking_clause for_locking_items %type <*tree.LockingItem> for_locking_item %type for_locking_strength %type opt_nowait_or_skip %type set_operation %type alter_column_default %type alter_column_on_update %type alter_column_visible %type opt_asc_desc %type opt_nulls_order %type alter_changefeed_cmd %type alter_changefeed_cmds %type alter_backup_schedule_cmd %type alter_backup_schedule_cmds %type backup_kms %type alter_backup_cmd %type alter_backup_cmds %type alter_table_cmd %type alter_table_cmds %type alter_index_cmd %type alter_index_cmds %type opt_drop_behavior %type opt_validate_behavior %type opt_template_clause opt_encoding_clause opt_lc_collate_clause opt_lc_ctype_clause %type opt_regions_list %type region_name primary_region_clause opt_primary_region_clause secondary_region_clause opt_secondary_region_clause %type super_region_clause opt_super_region_clause %type opt_placement_clause placement_clause %type region_name_list %type survival_goal_clause opt_survival_goal_clause %type <*tree.Locality> locality opt_locality %type opt_connection_limit %type transaction_iso_level %type transaction_user_priority %type transaction_read_mode %type transaction_deferrable_mode %type name opt_name opt_name_parens %type privilege savepoint_name %type role_option password_clause valid_until_clause subject_clause provisionsrc_clause %type subquery_op %type <*tree.UnresolvedName> func_name func_name_no_crdb_extra %type func_application_name %type opt_class opt_collate %type cursor_name database_name index_name opt_index_name column_name insert_column_item statistics_name window_name opt_in_database %type family_name opt_family_name table_alias_name constraint_name target_name zone_name partition_name collation_name %type db_object_name_component %type <*tree.UnresolvedObjectName> table_name db_name standalone_index_name sequence_name type_name %type <*tree.UnresolvedObjectName> view_name db_object_name simple_db_object_name complex_db_object_name %type <[]*tree.UnresolvedObjectName> type_name_list %type schema_name opt_in_schema %type qualifiable_schema_name opt_schema_name wildcard_pattern %type schema_name_list %type schema_wildcard %type <*tree.UnresolvedName> table_pattern complex_table_pattern %type <*tree.UnresolvedName> column_path prefixed_column_path column_path_with_star %type insert_target create_stats_target analyze_target %type <*tree.TableIndexName> table_index_name %type table_index_name_list %type all_op qual_op operator_op %type iso_level %type user_priority %type opt_table_elem_list table_elem_list create_as_opt_col_list create_as_table_defs %type <[]tree.LikeTableOption> like_table_option_list %type like_table_option %type opt_create_table_on_commit %type <*tree.PartitionBy> opt_partition_by partition_by partition_by_inner %type <*tree.PartitionByTable> opt_partition_by_table partition_by_table %type <*tree.PartitionByIndex> opt_partition_by_index partition_by_index %type partition opt_partition %type opt_create_table_inherits %type list_partition %type <[]tree.ListPartition> list_partitions %type range_partition %type <[]tree.RangePartition> range_partitions %type opt_all_clause %type opt_privileges_clause %type distinct_clause opt_with_data %type distinct_on_clause %type opt_column_list insert_column_list opt_stats_columns query_stats_cols // Note that "no index" variants exist to disable custom ORDER BY syntax // in some places like function calls. %type sort_clause sort_clause_no_index single_sort_clause opt_sort_clause opt_sort_clause_no_index %type <[]*tree.Order> sortby_list sortby_no_index_list %type index_params create_as_params %type opt_index_visible alter_index_visible %type opt_index_access_method %type name_list privilege_list %type <[]int32> opt_array_bounds %type <*tree.Batch> opt_batch_clause %type from_clause %type from_list rowsfrom_list opt_from_list %type table_pattern_list %type db_object_name_list table_name_list view_name_list sequence_name_list opt_locked_rels %type expr_list opt_expr_list tuple1_ambiguous_values tuple1_unambiguous_values %type <*tree.Tuple> expr_tuple1_ambiguous expr_tuple_unambiguous %type attrs %type <[]string> session_var_parts %type opt_target_list target_list %type set_clause_list %type <*tree.UpdateExpr> set_clause multiple_set_clause %type array_subscripts %type group_clause %type group_by_list %type group_by_item %type <*tree.Limit> select_limit opt_select_limit %type relation_expr_list %type returning_clause %type opt_using_clause %type opt_clear_data %type db_level_changefeed_filter_option optional_db_level_changefeed_filter_option %type include_or_exclude %type batch_param %type <[]tree.BatchParam> batch_param_list %type <[]tree.SequenceOption> sequence_option_list opt_sequence_option_list %type sequence_option_elem %type <[]tree.SequenceOption> identity_option_list %type identity_option_elem %type all_or_distinct %type with_comment %type join_outer %type join_qual %type join_type %type opt_join_hint %type extract_list %type overlay_list %type position_list %type substr_list %type trim_list %type execute_param_clause %type opt_interval_qualifier interval_qualifier interval_second %type overlay_placing %type <*tree.TenantSpec> virtual_cluster_spec virtual_cluster_spec_opt_all %type opt_unique opt_concurrently opt_cluster opt_without_index %type <*tree.Limit> limit_clause offset_clause opt_limit_clause %type select_fetch_first_value %type row_or_rows %type first_or_next %type insert_rest %type col_def_list opt_col_def_list_no_types col_def_list_no_types %type col_def %type <*tree.OnConflict> on_conflict %type begin_transaction %type transaction_mode_list transaction_mode %type opt_hash_sharded_bucket_count %type <*tree.ShardedIndexDef> opt_hash_sharded %type opt_storing %type <*tree.ColumnTableDef> column_table_def %type table_elem %type where_clause opt_where_clause %type <*tree.ArraySubscript> array_subscript %type opt_slice_bound %type <*tree.IndexFlags> opt_index_flags %type <*tree.IndexFlags> index_flags_param %type <*tree.IndexFlags> index_flags_param_list %type a_expr b_expr c_expr d_expr typed_literal %type substr_from substr_for %type in_expr %type having_clause %type array_expr %type interval_value %type <[]tree.ResolvableTypeReference> type_list prep_type_clause %type array_expr_list %type <*tree.Tuple> row labeled_row %type case_expr case_arg case_default %type <*tree.When> when_clause %type <[]*tree.When> when_clause_list %type sub_type %type numeric_only %type alias_clause opt_alias_clause func_alias_clause opt_func_alias_clause %type opt_ordinality opt_compact %type <*tree.Order> sortby sortby_index %type index_elem index_elem_options create_as_param %type table_ref numeric_table_ref func_table %type rowsfrom_list %type rowsfrom_item %type joined_table %type <*tree.UnresolvedObjectName> relation_expr %type table_expr_opt_alias_idx table_name_opt_idx %type opt_only opt_descendant %type target_elem %type <*tree.UpdateExpr> single_set_clause %type as_of_clause opt_as_of_clause %type opt_changefeed_sink changefeed_sink %type opt_changefeed_family %type explain_option_name %type <[]string> explain_option_list opt_enum_val_list enum_val_list %type <[]tree.CompositeTypeElem> composite_type_list opt_composite_type_list %type <*tree.CreateType> domain_constraint_list_opt %type typename simple_typename cast_target %type <*types.T> const_typename %type <*tree.AlterTypeAddValuePlacement> opt_add_val_placement %type opt_timezone %type <*types.T> numeric opt_numeric_modifiers %type <*types.T> opt_float %type <*types.T> character_with_length character_without_length %type <*types.T> const_datetime interval_type %type <*types.T> bit_with_length bit_without_length %type <*types.T> character_base %type <*types.T> geo_shape_type %type <*types.T> const_geo %type <*types.T> const_vector %type extract_arg %type opt_varying %type <*tree.NumVal> signed_iconst only_signed_iconst %type <*tree.NumVal> signed_fconst only_signed_fconst %type iconst32 %type signed_iconst64 %type iconst64 %type var_value %type var_list %type var_name %type unrestricted_name type_function_name type_function_name_no_crdb_extra %type non_reserved_word %type non_reserved_word_or_sconst %type role_spec opt_owner_clause %type role_spec_list %type zone_value %type string_or_placeholder %type string_or_placeholder_list %type region_or_regions %type unreserved_keyword type_func_name_keyword type_func_name_no_crdb_extra_keyword type_func_name_crdb_extra_keyword %type bare_label_keywords bare_col_label %type col_name_keyword reserved_keyword cockroachdb_extra_reserved_keyword extra_var_value %type complex_type_name %type general_type_name %type table_constraint constraint_elem create_as_constraint_def create_as_constraint_elem %type index_def %type family_def %type <[]tree.NamedColumnQualification> col_qual_list create_as_col_qual_list %type col_qualification create_as_col_qualification %type col_qualification_elem create_as_col_qualification_elem %type key_match %type reference_actions %type reference_action reference_on_delete reference_on_update %type func_application func_expr_common_subexpr special_function %type func_expr func_expr_windowless %type opt_with %type <*tree.With> with_clause opt_with_clause %type <[]*tree.CTE> cte_list %type <*tree.CTE> common_table_expr %type materialize_clause %type within_group_clause %type filter_clause %type opt_partition_clause %type window_clause window_definition_list %type <*tree.WindowDef> window_definition over_clause window_specification %type opt_existing_window_name %type <*tree.WindowFrame> opt_frame_clause %type frame_extent %type <*tree.WindowFrameBound> frame_bound %type opt_frame_exclusion %type <[]tree.ColumnID> opt_tableref_col_list tableref_col_list %type changefeed_table_targets %type changefeed_table_target %type backup_targets %type <*tree.BackupTargetList> opt_backup_targets %type grant_targets targets_roles target_types %type changefeed_target_expr %type <*tree.GrantTargetList> opt_on_targets_roles %type for_grantee_clause %type privileges %type <[]tree.KVOption> opt_role_options role_options %type audit_mode %type relocate_kw %type relocate_subject relocate_subject_nonlease %type <*tree.SetZoneConfig> set_zone_config %type opt_alter_column_using %type opt_temp %type opt_persistence_temp_table %type role_or_group_or_user %type <*tree.LabelSpec> schedule_label_spec %type cron_expr sconst_or_placeholder %type <*tree.FullBackupClause> opt_full_backup_clause %type schedule_state %type opt_schedule_executor_type %type abbreviated_grant_stmt %type abbreviated_revoke_stmt %type opt_with_grant_option %type opt_for_roles %type opt_policy_roles %type opt_policy_exprs %type opt_policy_type %type opt_policy_command %type table_rls_mode %type opt_in_schemas %type target_object_type // Routine (UDF/SP) relevant components. %type opt_or_replace opt_return_set opt_no %type param_name routine_as %type opt_routine_param_with_default_list routine_param_with_default_list %type func_params func_params_list table_func_column_list %type routine_param_with_default routine_param table_func_column %type routine_return_type routine_param_type %type opt_create_routine_opt_list create_routine_opt_list alter_func_opt_list %type create_routine_opt_item common_routine_opt_item %type routine_param_class %type <*tree.UnresolvedObjectName> routine_create_name %type do_stmt_opt_list %type do_stmt_opt_item %type routine_return_stmt routine_body_stmt %type routine_body_stmt_list %type <*tree.RoutineBody> opt_routine_body %type function_with_paramtypes %type function_with_paramtypes_list %type opt_link_sym // Trigger relevant components. %type trigger_action_time %type <*tree.TriggerEvent> trigger_event %type <[]*tree.TriggerEvent> trigger_event_list %type <*tree.TriggerTransition> trigger_transition %type <[]*tree.TriggerTransition> trigger_transition_list opt_trigger_transition_list %type transition_is_new transition_is_row %type <*tree.ViewOptions> opt_view_with %type trigger_for_each trigger_for_type %type trigger_when %type trigger_func_arg opt_as function_or_procedure %type <[]string> trigger_func_args %type <*tree.LabelSpec> label_spec %type <*tree.ShowRangesOptions> opt_show_ranges_options show_ranges_options // Precedence: lowest to highest %nonassoc VALUES // see value_clause %nonassoc SET // see table_expr_opt_alias_idx %left UNION EXCEPT %left INTERSECT %left OR %left AND %right NOT %nonassoc IS ISNULL NOTNULL // IS sets precedence for IS NULL, etc %nonassoc '<' '>' '=' LESS_EQUALS GREATER_EQUALS NOT_EQUALS %nonassoc '~' BETWEEN IN LIKE ILIKE SIMILAR NOT_REGMATCH REGIMATCH NOT_REGIMATCH NOT_LA %nonassoc ESCAPE // ESCAPE must be just above LIKE/ILIKE/SIMILAR %nonassoc CONTAINS FIRST_CONTAINS CONTAINED_BY FIRST_CONTAINED_BY '?' JSON_SOME_EXISTS JSON_ALL_EXISTS %nonassoc OVERLAPS %left POSTFIXOP // dummy for postfix OP rules // To support target_elem without AS, we must give IDENT an explicit priority // between POSTFIXOP and OP. We can safely assign the same priority to various // unreserved keywords as needed to resolve ambiguities (this can't have any // bad effects since obviously the keywords will still behave the same as if // they weren't keywords). We need to do this for PARTITION, RANGE, ROWS, // GROUPS to support opt_existing_window_name; and for RANGE, ROWS, GROUPS so // that they can follow a_expr without creating postfix-operator problems; and // for NULL so that it can follow b_expr in col_qual_list without creating // postfix-operator problems. // // To support CUBE and ROLLUP in GROUP BY without reserving them, we give them // an explicit priority lower than '(', so that a rule with CUBE '(' will shift // rather than reducing a conflicting rule that takes CUBE as a function name. // Using the same precedence as IDENT seems right for the reasons given above. // // The frame_bound productions UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING are // even messier: since UNBOUNDED is an unreserved keyword (per spec!), there is // no principled way to distinguish these from the productions a_expr // PRECEDING/FOLLOWING. We hack this up by giving UNBOUNDED slightly lower // precedence than PRECEDING and FOLLOWING. At present this doesn't appear to // cause UNBOUNDED to be treated differently from other unreserved keywords // anywhere else in the grammar, but it's definitely risky. We can blame any // funny behavior of UNBOUNDED on the SQL standard, though. %nonassoc UNBOUNDED // ideally should have same precedence as IDENT %nonassoc IDENT NULL PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP %left CONCAT FETCHVAL FETCHTEXT FETCHVAL_PATH FETCHTEXT_PATH REMOVE_PATH AT_AT DISTANCE COS_DISTANCE NEG_INNER_PRODUCT // multi-character ops %left '|' %left '#' %left '&' %left LSHIFT RSHIFT INET_CONTAINS_OR_EQUALS INET_CONTAINED_BY_OR_EQUALS AND_AND SQRT CBRT %left OPERATOR // if changing the last token before OPERATOR, change all instances of %prec %left '+' '-' %left '*' '/' FLOORDIV '%' %left '^' %left INTERVAL_SIMPLE // sets precedence for interval syntax %left TO // sets precedence for interval syntax // Unary Operators %left AT // sets precedence for AT TIME ZONE %left COLLATE %right UMINUS %left '[' ']' %left '(' ')' %left TYPEANNOTATE %left TYPECAST %left '.' // These might seem to be low-precedence, but actually they are not part // of the arithmetic hierarchy at all in their use as JOIN operators. // We make them high-precedence to support their use as function names. // They wouldn't be given a precedence at all, were it not that we need // left-associativity among the JOIN rules themselves. %left JOIN CROSS LEFT FULL RIGHT INNER NATURAL %right HELPTOKEN %% stmt_block: stmt { sqllex.(*lexer).SetStmt($1.stmt()) } stmt: HELPTOKEN { return helpWith(sqllex, "") } | stmt_without_legacy_transaction | legacy_transaction_stmt | /* EMPTY */ { $$.val = tree.Statement(nil) } stmt_without_legacy_transaction: preparable_stmt // help texts in sub-rule | analyze_stmt // EXTEND WITH HELP: ANALYZE | call_stmt | copy_stmt | comment_stmt | execute_stmt // EXTEND WITH HELP: EXECUTE | deallocate_stmt // EXTEND WITH HELP: DEALLOCATE | discard_stmt // EXTEND WITH HELP: DISCARD | do_stmt // EXTEND WITH HELP: DO | grant_stmt // EXTEND WITH HELP: GRANT | prepare_stmt // EXTEND WITH HELP: PREPARE | revoke_stmt // EXTEND WITH HELP: REVOKE | savepoint_stmt // EXTEND WITH HELP: SAVEPOINT | reassign_owned_by_stmt // EXTEND WITH HELP: REASSIGN OWNED BY | drop_owned_by_stmt // EXTEND WITH HELP: DROP OWNED BY | release_stmt // EXTEND WITH HELP: RELEASE | refresh_stmt // EXTEND WITH HELP: REFRESH | nonpreparable_set_stmt // help texts in sub-rule | transaction_stmt // help texts in sub-rule | close_cursor_stmt // EXTEND WITH HELP: CLOSE | declare_cursor_stmt // EXTEND WITH HELP: DECLARE | fetch_cursor_stmt // EXTEND WITH HELP: FETCH | move_cursor_stmt // EXTEND WITH HELP: MOVE | reindex_stmt | unlisten_stmt | show_commit_timestamp_stmt // EXTEND WITH HELP: SHOW COMMIT TIMESTAMP // %Help: ALTER // %Category: Group // %Text: ALTER TABLE, ALTER INDEX, ALTER VIEW, ALTER SEQUENCE, ALTER DATABASE, ALTER USER, ALTER ROLE, ALTER DEFAULT PRIVILEGES,ALTER EXTERNAL CONNECTION alter_stmt: alter_ddl_stmt // help texts in sub-rule | alter_external_connection_stmt // EXTEND WITH HELP: ALTER EXTERNAL CONNECTION | alter_role_stmt // EXTEND WITH HELP: ALTER ROLE | alter_virtual_cluster_stmt /* SKIP DOC */ | alter_unsupported_stmt | ALTER error // SHOW HELP: ALTER alter_ddl_stmt: alter_table_stmt // EXTEND WITH HELP: ALTER TABLE | alter_index_stmt // EXTEND WITH HELP: ALTER INDEX | alter_view_stmt // EXTEND WITH HELP: ALTER VIEW | alter_sequence_stmt // EXTEND WITH HELP: ALTER SEQUENCE | alter_database_stmt // EXTEND WITH HELP: ALTER DATABASE | alter_range_stmt // EXTEND WITH HELP: ALTER RANGE | alter_partition_stmt // EXTEND WITH HELP: ALTER PARTITION | alter_schema_stmt // EXTEND WITH HELP: ALTER SCHEMA | alter_type_stmt // EXTEND WITH HELP: ALTER TYPE | alter_default_privileges_stmt // EXTEND WITH HELP: ALTER DEFAULT PRIVILEGES | alter_changefeed_stmt // EXTEND WITH HELP: ALTER CHANGEFEED | alter_backup_stmt // EXTEND WITH HELP: ALTER BACKUP | alter_func_stmt // EXTEND WITH HELP: ALTER FUNCTION | alter_proc_stmt // EXTEND WITH HELP: ALTER PROCEDURE | alter_backup_schedule // EXTEND WITH HELP: ALTER BACKUP SCHEDULE | alter_policy_stmt // EXTEND WITH HELP: ALTER POLICY | alter_job_stmt // EXTEND WITH HELP: ALTER JOB // %Help: ALTER TABLE - change the definition of a table // %Category: DDL // %Text: // ALTER TABLE [IF EXISTS] [, ...] // // Commands: // ALTER TABLE ... ADD [COLUMN] [IF NOT EXISTS] [] // ALTER TABLE ... ADD // ALTER TABLE ... DROP [COLUMN] [IF EXISTS] [RESTRICT | CASCADE] // ALTER TABLE ... DROP CONSTRAINT [IF EXISTS] [RESTRICT | CASCADE] // ALTER TABLE ... ALTER [COLUMN] {SET DEFAULT | DROP DEFAULT} // ALTER TABLE ... ALTER [COLUMN] {SET ON UPDATE | DROP ON UPDATE} // ALTER TABLE ... ALTER [COLUMN] DROP NOT NULL // ALTER TABLE ... ALTER [COLUMN] DROP STORED // ALTER TABLE ... ALTER [COLUMN] ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( opt_sequence_option_list ) ] // ALTER TABLE ... ALTER [COLUMN] SET GENERATED { ALWAYS | BY DEFAULT } // ALTER TABLE ... ALTER [COLUMN] // ALTER TABLE ... ALTER [COLUMN] DROP IDENTITY [ IF EXISTS ] // ALTER TABLE ... ALTER [COLUMN] [SET DATA] TYPE [COLLATE ] // ALTER TABLE ... ALTER PRIMARY KEY USING COLUMNS ( ) // ALTER TABLE ... RENAME TO // ALTER TABLE ... RENAME [COLUMN] TO // ALTER TABLE ... VALIDATE CONSTRAINT // ALTER TABLE ... SET (storage_param = value, ...) // ALTER TABLE ... SPLIT AT [WITH EXPIRATION ] // ALTER TABLE ... UNSPLIT AT // ALTER TABLE ... UNSPLIT ALL // ALTER TABLE ... SCATTER [ FROM ( ) TO ( ) ] // ALTER TABLE ... INJECT STATISTICS ... (experimental) // ALTER TABLE ... RELOCATE [ LEASE | VOTERS | NONVOTERS ] (experimental) // ALTER TABLE ... PARTITION BY RANGE ( ) ( ) // ALTER TABLE ... PARTITION BY LIST ( ) ( ) // ALTER TABLE ... PARTITION BY NOTHING // ALTER TABLE ... CONFIGURE ZONE // ALTER TABLE ... SET SCHEMA // ALTER TABLE ... SET LOCALITY [REGIONAL BY [TABLE IN | ROW] | GLOBAL] // ALTER TABLE ... {ENABLE | DISABLE | FORCE | NO FORCE} ROW LEVEL SECURITY // // Column qualifiers: // [CONSTRAINT ] {NULL | NOT NULL | UNIQUE | PRIMARY KEY | CHECK () | DEFAULT } // FAMILY , CREATE [IF NOT EXISTS] FAMILY [] // REFERENCES [( )] // COLLATE // // Zone configurations: // DISCARD // USING = [, ...] // USING = COPY FROM PARENT [, ...] // { TO | = } // // %SeeAlso: WEBDOCS/alter-table.html alter_table_stmt: alter_onetable_stmt | alter_relocate_stmt | alter_split_stmt | alter_unsplit_stmt | alter_scatter_stmt | alter_zone_table_stmt | alter_rename_table_stmt | alter_table_set_schema_stmt | alter_table_locality_stmt | alter_table_logged_stmt | alter_table_owner_stmt // ALTER TABLE has its error help token here because the ALTER TABLE // prefix is spread over multiple non-terminals. | ALTER TABLE error // SHOW HELP: ALTER TABLE // %Help: ALTER PARTITION - apply zone configurations to a partition // %Category: DDL // %Text: // ALTER PARTITION // // Commands: // -- Alter a single partition which exists on any of a table's indexes. // ALTER PARTITION OF TABLE CONFIGURE ZONE // // -- Alter a partition of a specific index. // ALTER PARTITION OF INDEX @ CONFIGURE ZONE // // -- Alter all partitions with the same name across a table's indexes. // ALTER PARTITION OF INDEX @* CONFIGURE ZONE // // Zone configurations: // DISCARD // USING = [, ...] // USING = COPY FROM PARENT [, ...] // { TO | = } // // %SeeAlso: WEBDOCS/alter-partition.html alter_partition_stmt: alter_zone_partition_stmt | ALTER PARTITION error // SHOW HELP: ALTER PARTITION // %Help: ALTER VIEW - change the definition of a view // %Category: DDL // %Text: // ALTER [MATERIALIZED] VIEW [IF EXISTS] RENAME TO // ALTER [MATERIALIZED] VIEW [IF EXISTS] SET SCHEMA // %SeeAlso: WEBDOCS/alter-view.html alter_view_stmt: alter_rename_view_stmt | alter_view_set_schema_stmt | alter_view_owner_stmt | alter_view_set_options_stmt | alter_view_reset_options_stmt // ALTER VIEW has its error help token here because the ALTER VIEW // prefix is spread over multiple non-terminals. | ALTER VIEW error // SHOW HELP: ALTER VIEW // %Help: ALTER SEQUENCE - change the definition of a sequence // %Category: DDL // %Text: // ALTER SEQUENCE [IF EXISTS] // [AS ] // [INCREMENT ] // [MINVALUE | NO MINVALUE] // [MAXVALUE | NO MAXVALUE] // [START [WITH] ] // [RESTART [[WITH] ]] // [[NO] CYCLE] // ALTER SEQUENCE [IF EXISTS] RENAME TO // ALTER SEQUENCE [IF EXISTS] SET SCHEMA alter_sequence_stmt: alter_rename_sequence_stmt | alter_sequence_options_stmt | alter_sequence_set_schema_stmt | alter_sequence_owner_stmt | ALTER SEQUENCE error // SHOW HELP: ALTER SEQUENCE alter_sequence_options_stmt: ALTER SEQUENCE sequence_name sequence_option_list { $$.val = &tree.AlterSequence{Name: $3.unresolvedObjectName(), Options: $4.seqOpts(), IfExists: false} } | ALTER SEQUENCE IF EXISTS sequence_name sequence_option_list { $$.val = &tree.AlterSequence{Name: $5.unresolvedObjectName(), Options: $6.seqOpts(), IfExists: true} } // %Help: ALTER DATABASE - change the definition of a database // %Category: DDL // %Text: // ALTER DATABASE RENAME TO // ALTER DATABASE CONFIGURE ZONE // ALTER DATABASE OWNER TO // ALTER DATABASE CONVERT TO SCHEMA WITH PARENT // ALTER DATABASE ADD REGION [IF NOT EXISTS] // ALTER DATABASE DROP REGION [IF EXISTS] // ALTER DATABASE PRIMARY REGION // ALTER DATABASE SURVIVE // ALTER DATABASE PLACEMENT { RESTRICTED | DEFAULT } // ALTER DATABASE SET var { TO | = } { value | DEFAULT } // ALTER DATABASE RESET { var | ALL } // ALTER DATABASE ALTER LOCALITY { GLOBAL | REGIONAL [IN ] } CONFIGURE ZONE // %SeeAlso: WEBDOCS/alter-database.html alter_database_stmt: alter_rename_database_stmt | alter_zone_database_stmt | alter_database_owner | alter_database_to_schema_stmt | alter_database_add_region_stmt | alter_database_drop_region_stmt | alter_database_survival_goal_stmt | alter_database_primary_region_stmt | alter_database_placement_stmt | alter_database_set_stmt | alter_database_add_super_region | alter_database_alter_super_region | alter_database_drop_super_region | alter_database_set_secondary_region_stmt | alter_database_drop_secondary_region | alter_database_set_zone_config_extension_stmt // %Help: ALTER FUNCTION - change the definition of a function // %Category: DDL // %Text: // ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] // action [ ... ] [ RESTRICT ] // ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] // RENAME TO new_name // ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] // OWNER TO { new_owner | CURRENT_USER | SESSION_USER } // ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] // SET SCHEMA new_schema // // where action is one of: // // CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT // IMMUTABLE | STABLE | VOLATILE // [ NOT ] LEAKPROOF // [ EXTERNAL ] SECURITY { INVOKER | DEFINER } // %SeeAlso: WEBDOCS/alter-function.html alter_func_stmt: alter_func_options_stmt | alter_func_rename_stmt | alter_func_owner_stmt | alter_func_set_schema_stmt | alter_func_dep_extension_stmt | ALTER FUNCTION error // SHOW HELP: ALTER FUNCTION // %Help: ALTER PROCEDURE - change the definition of a procedure // %Category: DDL // %Text: // ALTER PROCEDURE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] // RENAME TO new_name // ALTER PROCEDURE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] // OWNER TO { new_owner | CURRENT_USER | SESSION_USER } // ALTER PROCEDURE name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] // SET SCHEMA new_schema // // %SeeAlso: WEBDOCS/alter-procedure.html alter_proc_stmt: alter_proc_rename_stmt | alter_proc_owner_stmt | alter_proc_set_schema_stmt | ALTER PROCEDURE error // SHOW HELP: ALTER PROCEDURE // ALTER DATABASE has its error help token here because the ALTER DATABASE // prefix is spread over multiple non-terminals. | ALTER DATABASE error // SHOW HELP: ALTER DATABASE alter_database_owner: ALTER DATABASE database_name OWNER TO role_spec { $$.val = &tree.AlterDatabaseOwner{Name: tree.Name($3), Owner: $6.roleSpec()} } // This form is an alias for ALTER ROLE ALL IN DATABASE SET ... alter_database_set_stmt: ALTER DATABASE database_name set_or_reset_clause { $$.val = &tree.AlterRoleSet{ AllRoles: true, DatabaseName: tree.Name($3), IsRole: true, SetOrReset: $4.setVar(), } } alter_database_placement_stmt: ALTER DATABASE database_name placement_clause { $$.val = &tree.AlterDatabasePlacement{ Name: tree.Name($3), Placement: $4.dataPlacement(), } } alter_database_add_region_stmt: ALTER DATABASE database_name ADD REGION region_name { $$.val = &tree.AlterDatabaseAddRegion{ Name: tree.Name($3), Region: tree.Name($6), } } | ALTER DATABASE database_name ADD REGION IF NOT EXISTS region_name { $$.val = &tree.AlterDatabaseAddRegion{ Name: tree.Name($3), Region: tree.Name($9), IfNotExists: true, } } alter_database_drop_region_stmt: ALTER DATABASE database_name DROP REGION region_name { $$.val = &tree.AlterDatabaseDropRegion{ Name: tree.Name($3), Region: tree.Name($6), } } | ALTER DATABASE database_name DROP REGION IF EXISTS region_name { $$.val = &tree.AlterDatabaseDropRegion{ Name: tree.Name($3), Region: tree.Name($8), IfExists: true, } } alter_database_survival_goal_stmt: ALTER DATABASE database_name survival_goal_clause { $$.val = &tree.AlterDatabaseSurvivalGoal{ Name: tree.Name($3), SurvivalGoal: $4.survivalGoal(), } } alter_database_primary_region_stmt: ALTER DATABASE database_name primary_region_clause { $$.val = &tree.AlterDatabasePrimaryRegion{ Name: tree.Name($3), PrimaryRegion: tree.Name($4), } } | ALTER DATABASE database_name SET primary_region_clause { $$.val = &tree.AlterDatabasePrimaryRegion{ Name: tree.Name($3), PrimaryRegion: tree.Name($5), } } alter_database_add_super_region: ALTER DATABASE database_name ADD SUPER REGION region_name VALUES region_name_list { $$.val = &tree.AlterDatabaseAddSuperRegion{ DatabaseName: tree.Name($3), SuperRegionName: tree.Name($7), Regions: $9.nameList(), } } alter_database_drop_super_region: ALTER DATABASE database_name DROP SUPER REGION region_name { $$.val = &tree.AlterDatabaseDropSuperRegion{ DatabaseName: tree.Name($3), SuperRegionName: tree.Name($7), } } alter_database_alter_super_region: ALTER DATABASE database_name ALTER SUPER REGION region_name VALUES region_name_list { $$.val = &tree.AlterDatabaseAlterSuperRegion{ DatabaseName: tree.Name($3), SuperRegionName: tree.Name($7), Regions: $9.nameList(), } } | ALTER DATABASE database_name ALTER SUPER REGION region_name survival_goal_clause { $$.val = &tree.AlterDatabaseAlterSuperRegionSurvivalGoal{ DatabaseName: tree.Name($3), SuperRegionName: tree.Name($7), SurvivalGoal: $8.survivalGoal(), } } | ALTER DATABASE database_name ALTER SUPER REGION region_name SURVIVE DEFAULT { $$.val = &tree.AlterDatabaseAlterSuperRegionSurvivalGoal{ DatabaseName: tree.Name($3), SuperRegionName: tree.Name($7), SurvivalGoal: tree.SurvivalGoalDefault, } } alter_database_set_secondary_region_stmt: ALTER DATABASE database_name SET secondary_region_clause { $$.val = &tree.AlterDatabaseSecondaryRegion{ DatabaseName: tree.Name($3), SecondaryRegion: tree.Name($5), } } alter_database_drop_secondary_region: ALTER DATABASE database_name DROP SECONDARY REGION { $$.val = &tree.AlterDatabaseDropSecondaryRegion{ DatabaseName: tree.Name($3), IfExists: false, } } | ALTER DATABASE database_name DROP SECONDARY REGION IF EXISTS { $$.val = &tree.AlterDatabaseDropSecondaryRegion{ DatabaseName: tree.Name($3), IfExists: true, } } alter_database_set_zone_config_extension_stmt: ALTER DATABASE database_name ALTER LOCALITY GLOBAL set_zone_config { s := $7.setZoneConfig() $$.val = &tree.AlterDatabaseSetZoneConfigExtension{ DatabaseName: tree.Name($3), LocalityLevel: tree.LocalityLevelGlobal, ZoneConfigSettings: tree.ZoneConfigSettings { SetDefault: s.SetDefault, YAMLConfig: s.YAMLConfig, Options: s.Options, }, } } | ALTER DATABASE database_name ALTER LOCALITY REGIONAL set_zone_config { s := $7.setZoneConfig() $$.val = &tree.AlterDatabaseSetZoneConfigExtension{ DatabaseName: tree.Name($3), LocalityLevel: tree.LocalityLevelTable, ZoneConfigSettings: tree.ZoneConfigSettings { SetDefault: s.SetDefault, YAMLConfig: s.YAMLConfig, Options: s.Options, }, } } | ALTER DATABASE database_name ALTER LOCALITY REGIONAL IN region_name set_zone_config { s := $9.setZoneConfig() $$.val = &tree.AlterDatabaseSetZoneConfigExtension{ DatabaseName: tree.Name($3), LocalityLevel: tree.LocalityLevelTable, RegionName: tree.Name($8), ZoneConfigSettings: tree.ZoneConfigSettings { SetDefault: s.SetDefault, YAMLConfig: s.YAMLConfig, Options: s.Options, }, } } | ALTER DATABASE database_name ALTER LOCALITY SUPER REGION region_name set_zone_config { s := $9.setZoneConfig() $$.val = &tree.AlterDatabaseSetZoneConfigExtension{ DatabaseName: tree.Name($3), LocalityLevel: tree.LocalityLevelSuperRegion, SuperRegionName: tree.Name($8), ZoneConfigSettings: tree.ZoneConfigSettings { SetDefault: s.SetDefault, YAMLConfig: s.YAMLConfig, Options: s.Options, }, } } // %Help: ALTER RANGE - change the parameters of a range // %Category: DDL // %Text: // ALTER RANGE // // Commands: // ALTER RANGE ... CONFIGURE ZONE // ALTER RANGE RELOCATE { VOTERS | NONVOTERS } FROM TO FOR // ALTER RANGE r RELOCATE { VOTERS | NONVOTERS } FROM TO // ALTER RANGE RELOCATE LEASE TO FOR // ALTER RANGE r RELOCATE LEASE TO // // Zone configurations: // DISCARD // USING = [, ...] // USING = COPY FROM PARENT [, ...] // { TO | = } // // %SeeAlso: ALTER TABLE alter_range_stmt: alter_zone_range_stmt | alter_range_relocate_stmt | ALTER RANGE error // SHOW HELP: ALTER RANGE // %Help: ALTER INDEX - change the definition of an index // %Category: DDL // %Text: // ALTER INDEX [IF EXISTS] // // Commands: // ALTER INDEX ... RENAME TO // ALTER INDEX ... SPLIT AT [WITH EXPIRATION ] // ALTER INDEX ... UNSPLIT AT // ALTER INDEX ... UNSPLIT ALL // ALTER INDEX ... SCATTER [ FROM ( ) TO ( ) ] // ALTER INDEX ... RELOCATE [ LEASE | VOTERS | NONVOTERS ] // ALTER INDEX ... [VISIBLE | NOT VISIBLE | INVISIBLE | VISIBILITY ...] // // Zone configurations: // DISCARD // USING = [, ...] // USING = COPY FROM PARENT [, ...] // { TO | = } // // %SeeAlso: WEBDOCS/alter-index.html alter_index_stmt: alter_oneindex_stmt | alter_relocate_index_stmt | alter_split_index_stmt | alter_unsplit_index_stmt | alter_scatter_index_stmt | alter_rename_index_stmt | alter_zone_index_stmt | alter_index_visible_stmt // ALTER INDEX has its error help token here because the ALTER INDEX // prefix is spread over multiple non-terminals. | ALTER INDEX error // SHOW HELP: ALTER INDEX alter_onetable_stmt: ALTER TABLE relation_expr alter_table_cmds { $$.val = &tree.AlterTable{Table: $3.unresolvedObjectName(), IfExists: false, Cmds: $4.alterTableCmds()} } | ALTER TABLE IF EXISTS relation_expr alter_table_cmds { $$.val = &tree.AlterTable{Table: $5.unresolvedObjectName(), IfExists: true, Cmds: $6.alterTableCmds()} } alter_oneindex_stmt: ALTER INDEX table_index_name alter_index_cmds { $$.val = &tree.AlterIndex{Index: $3.tableIndexName(), IfExists: false, Cmds: $4.alterIndexCmds()} } | ALTER INDEX IF EXISTS table_index_name alter_index_cmds { $$.val = &tree.AlterIndex{Index: $5.tableIndexName(), IfExists: true, Cmds: $6.alterIndexCmds()} } alter_split_stmt: ALTER TABLE table_name SPLIT AT select_stmt { name := $3.unresolvedObjectName().ToTableName() $$.val = &tree.Split{ TableOrIndex: tree.TableIndexName{Table: name}, Rows: $6.slct(), ExpireExpr: tree.Expr(nil), } } | ALTER TABLE table_name SPLIT AT select_stmt WITH EXPIRATION a_expr { name := $3.unresolvedObjectName().ToTableName() $$.val = &tree.Split{ TableOrIndex: tree.TableIndexName{Table: name}, Rows: $6.slct(), ExpireExpr: $9.expr(), } } alter_split_index_stmt: ALTER INDEX table_index_name SPLIT AT select_stmt { $$.val = &tree.Split{TableOrIndex: $3.tableIndexName(), Rows: $6.slct(), ExpireExpr: tree.Expr(nil)} } | ALTER INDEX table_index_name SPLIT AT select_stmt WITH EXPIRATION a_expr { $$.val = &tree.Split{TableOrIndex: $3.tableIndexName(), Rows: $6.slct(), ExpireExpr: $9.expr()} } alter_unsplit_stmt: ALTER TABLE table_name UNSPLIT AT select_stmt { name := $3.unresolvedObjectName().ToTableName() $$.val = &tree.Unsplit{ TableOrIndex: tree.TableIndexName{Table: name}, Rows: $6.slct(), } } | ALTER TABLE table_name UNSPLIT ALL { name := $3.unresolvedObjectName().ToTableName() $$.val = &tree.Unsplit { TableOrIndex: tree.TableIndexName{Table: name}, All: true, } } alter_unsplit_index_stmt: ALTER INDEX table_index_name UNSPLIT AT select_stmt { $$.val = &tree.Unsplit{TableOrIndex: $3.tableIndexName(), Rows: $6.slct()} } | ALTER INDEX table_index_name UNSPLIT ALL { $$.val = &tree.Unsplit{TableOrIndex: $3.tableIndexName(), All: true} } relocate_kw: TESTING_RELOCATE | EXPERIMENTAL_RELOCATE | RELOCATE relocate_subject: relocate_subject_nonlease | LEASE { $$.val = tree.RelocateLease } relocate_subject_nonlease: VOTERS { $$.val = tree.RelocateVoters } | /* EMPTY */ { // No keyword is an alias for VOTERS. $$.val = tree.RelocateVoters } | NONVOTERS { $$.val = tree.RelocateNonVoters } alter_relocate_stmt: ALTER TABLE table_name relocate_kw relocate_subject select_stmt { /* SKIP DOC */ name := $3.unresolvedObjectName().ToTableName() $$.val = &tree.Relocate{ TableOrIndex: tree.TableIndexName{Table: name}, Rows: $6.slct(), SubjectReplicas: $5.relocateSubject(), } } alter_relocate_index_stmt: ALTER INDEX table_index_name relocate_kw relocate_subject select_stmt { /* SKIP DOC */ $$.val = &tree.Relocate{ TableOrIndex: $3.tableIndexName(), Rows: $6.slct(), SubjectReplicas: $5.relocateSubject(), } } alter_index_visible_stmt: ALTER INDEX table_index_name alter_index_visible { $$.val = &tree.AlterIndexVisible{ Index: $3.tableIndexName(), Invisibility: $4.indexInvisibility(), IfExists: false, } } | ALTER INDEX IF EXISTS table_index_name alter_index_visible { $$.val = &tree.AlterIndexVisible{ Index: $5.tableIndexName(), Invisibility: $6.indexInvisibility(), IfExists: true, } } alter_index_visible: NOT VISIBLE { $$.val = tree.IndexInvisibility{Value: 1.0} } | INVISIBLE { $$.val = tree.IndexInvisibility{Value: 1.0} } | VISIBLE { $$.val = tree.IndexInvisibility{Value: 0.0} } | VISIBILITY FCONST { visibilityConst, _ := constant.Float64Val($2.numVal().AsConstantValue()) if visibilityConst < 0.0 || visibilityConst > 1.0 { sqllex.Error("index visibility must be between 0 and 1") return 1 } invisibilityConst := 1.0 - visibilityConst $$.val = tree.IndexInvisibility{Value: invisibilityConst, FloatProvided: true} } // Note: even though the ALTER RANGE ... CONFIGURE ZONE syntax only // accepts unrestricted names in the 3rd position, such that we could // write: // ALTER RANGE zone_name set_zone_config // we have to parse a full a_expr there instead, for otherwise we get // a reduce/reduce conflict with the ALTER RANGE ... RELOCATE variants // below. // // TODO(knz): Would it make sense to extend the semantics to enable // zone configurations on arbitrary range IDs? alter_zone_range_stmt: ALTER RANGE a_expr set_zone_config { var zoneName string switch e := $3.expr().(type) { case *tree.UnresolvedName: if e.NumParts != 1 { return setErr(sqllex, errors.New("only simple names are supported in ALTER RANGE ... CONFIGURE ZONE")) } zoneName = e.Parts[0] case tree.DefaultVal: zoneName = "default" default: return setErr(sqllex, errors.New("only simple names are supported in ALTER RANGE ... CONFIGURE ZONE")) } s := $4.setZoneConfig() s.ZoneSpecifier = tree.ZoneSpecifier{NamedZone: tree.UnrestrictedName(zoneName)} $$.val = s } alter_range_relocate_stmt: ALTER RANGE relocate_kw LEASE TO a_expr FOR select_stmt { $$.val = &tree.RelocateRange{ Rows: $8.slct(), FromStoreID: tree.DNull, ToStoreID: $6.expr(), SubjectReplicas: tree.RelocateLease, } } | ALTER RANGE a_expr relocate_kw LEASE TO a_expr { $$.val = &tree.RelocateRange{ Rows: &tree.Select{ Select: &tree.ValuesClause{Rows: []tree.Exprs{tree.Exprs{$3.expr()}}}, }, FromStoreID: tree.DNull, ToStoreID: $7.expr(), SubjectReplicas: tree.RelocateLease, } } | ALTER RANGE relocate_kw relocate_subject_nonlease FROM a_expr TO a_expr FOR select_stmt { $$.val = &tree.RelocateRange{ Rows: $10.slct(), FromStoreID: $6.expr(), ToStoreID: $8.expr(), SubjectReplicas: $4.relocateSubject(), } } | ALTER RANGE a_expr relocate_kw relocate_subject_nonlease FROM a_expr TO a_expr { $$.val = &tree.RelocateRange{ Rows: &tree.Select{ Select: &tree.ValuesClause{Rows: []tree.Exprs{tree.Exprs{$3.expr()}}}, }, FromStoreID: $7.expr(), ToStoreID: $9.expr(), SubjectReplicas: $5.relocateSubject(), } } set_zone_config: CONFIGURE ZONE to_or_eq a_expr { /* SKIP DOC */ $$.val = &tree.SetZoneConfig{ ZoneConfigSettings: tree.ZoneConfigSettings { YAMLConfig: $4.expr(), }, } } | CONFIGURE ZONE USING var_set_list { $$.val = &tree.SetZoneConfig{ ZoneConfigSettings: tree.ZoneConfigSettings { Options: $4.kvOptions(), }, } } | CONFIGURE ZONE USING DEFAULT { /* SKIP DOC */ $$.val = &tree.SetZoneConfig{ ZoneConfigSettings: tree.ZoneConfigSettings { SetDefault: true, }, } } | CONFIGURE ZONE DISCARD { $$.val = &tree.SetZoneConfig{ ZoneConfigSettings: tree.ZoneConfigSettings { Discard: true, YAMLConfig: tree.DNull, }, } } alter_zone_database_stmt: ALTER DATABASE database_name set_zone_config { s := $4.setZoneConfig() s.ZoneSpecifier = tree.ZoneSpecifier{Database: tree.Name($3)} $$.val = s } alter_zone_table_stmt: ALTER TABLE table_name set_zone_config { name := $3.unresolvedObjectName().ToTableName() s := $4.setZoneConfig() s.ZoneSpecifier = tree.ZoneSpecifier{ TableOrIndex: tree.TableIndexName{Table: name}, } $$.val = s } alter_zone_index_stmt: ALTER INDEX table_index_name set_zone_config { s := $4.setZoneConfig() s.ZoneSpecifier = tree.ZoneSpecifier{ TableOrIndex: $3.tableIndexName(), } $$.val = s } alter_zone_partition_stmt: ALTER PARTITION partition_name OF TABLE table_name set_zone_config { name := $6.unresolvedObjectName().ToTableName() s := $7.setZoneConfig() s.ZoneSpecifier = tree.ZoneSpecifier{ TableOrIndex: tree.TableIndexName{Table: name}, Partition: tree.Name($3), } $$.val = s } | ALTER PARTITION partition_name OF INDEX table_index_name set_zone_config { s := $7.setZoneConfig() s.ZoneSpecifier = tree.ZoneSpecifier{ TableOrIndex: $6.tableIndexName(), Partition: tree.Name($3), } $$.val = s } | ALTER PARTITION partition_name OF INDEX table_name '@' '*' set_zone_config { name := $6.unresolvedObjectName().ToTableName() s := $9.setZoneConfig() s.ZoneSpecifier = tree.ZoneSpecifier{ TableOrIndex: tree.TableIndexName{Table: name}, Partition: tree.Name($3), StarIndex: true, } $$.val = s } | ALTER PARTITION partition_name OF TABLE table_name '@' error { err := errors.New("index name should not be specified in ALTER PARTITION ... OF TABLE") err = errors.WithHint(err, "try ALTER PARTITION ... OF INDEX") return setErr(sqllex, err) } | ALTER PARTITION partition_name OF TABLE table_name '@' '*' error { err := errors.New("index wildcard unsupported in ALTER PARTITION ... OF TABLE") err = errors.WithHint(err, "try ALTER PARTITION OF INDEX @*") return setErr(sqllex, err) } var_set_list: var_name '=' COPY FROM PARENT { $$.val = []tree.KVOption{tree.KVOption{Key: tree.Name(strings.Join($1.strs(), "."))}} } | var_name '=' var_value { $$.val = []tree.KVOption{tree.KVOption{Key: tree.Name(strings.Join($1.strs(), ".")), Value: $3.expr()}} } | var_set_list ',' var_name '=' var_value { $$.val = append($1.kvOptions(), tree.KVOption{Key: tree.Name(strings.Join($3.strs(), ".")), Value: $5.expr()}) } | var_set_list ',' var_name '=' COPY FROM PARENT { $$.val = append($1.kvOptions(), tree.KVOption{Key: tree.Name(strings.Join($3.strs(), "."))}) } alter_scatter_stmt: ALTER TABLE table_name SCATTER { name := $3.unresolvedObjectName().ToTableName() $$.val = &tree.Scatter{TableOrIndex: tree.TableIndexName{Table: name}} } | ALTER TABLE table_name SCATTER FROM '(' expr_list ')' TO '(' expr_list ')' { name := $3.unresolvedObjectName().ToTableName() $$.val = &tree.Scatter{ TableOrIndex: tree.TableIndexName{Table: name}, From: $7.exprs(), To: $11.exprs(), } } alter_scatter_index_stmt: ALTER INDEX table_index_name SCATTER { $$.val = &tree.Scatter{TableOrIndex: $3.tableIndexName()} } | ALTER INDEX table_index_name SCATTER FROM '(' expr_list ')' TO '(' expr_list ')' { $$.val = &tree.Scatter{TableOrIndex: $3.tableIndexName(), From: $7.exprs(), To: $11.exprs()} } alter_table_cmds: alter_table_cmd { $$.val = tree.AlterTableCmds{$1.alterTableCmd()} } | alter_table_cmds ',' alter_table_cmd { $$.val = append($1.alterTableCmds(), $3.alterTableCmd()) } alter_table_cmd: // ALTER TABLE RENAME [COLUMN] TO RENAME opt_column column_name TO column_name { $$.val = &tree.AlterTableRenameColumn{Column: tree.Name($3), NewName: tree.Name($5) } } // ALTER TABLE RENAME CONSTRAINT TO | RENAME CONSTRAINT column_name TO column_name { $$.val = &tree.AlterTableRenameConstraint{Constraint: tree.Name($3), NewName: tree.Name($5) } } // ALTER TABLE ADD | ADD column_table_def { $$.val = &tree.AlterTableAddColumn{IfNotExists: false, ColumnDef: $2.colTableDef()} } // ALTER TABLE ADD IF NOT EXISTS | ADD IF NOT EXISTS column_table_def { $$.val = &tree.AlterTableAddColumn{IfNotExists: true, ColumnDef: $5.colTableDef()} } // ALTER TABLE ADD COLUMN | ADD COLUMN column_table_def { $$.val = &tree.AlterTableAddColumn{IfNotExists: false, ColumnDef: $3.colTableDef()} } // ALTER TABLE ADD COLUMN IF NOT EXISTS | ADD COLUMN IF NOT EXISTS column_table_def { $$.val = &tree.AlterTableAddColumn{IfNotExists: true, ColumnDef: $6.colTableDef()} } // ALTER TABLE ALTER [COLUMN] {SET DEFAULT |DROP DEFAULT} | ALTER opt_column column_name alter_column_default { $$.val = &tree.AlterTableSetDefault{Column: tree.Name($3), Default: $4.expr()} } // ALTER TABLE ALTER [COLUMN] {SET ON UPDATE |DROP ON UPDATE} | ALTER opt_column column_name alter_column_on_update { $$.val = &tree.AlterTableSetOnUpdate{Column: tree.Name($3), Expr: $4.expr()} } // ALTER TABLE ALTER [COLUMN] SET {VISIBLE|NOT VISIBLE} | ALTER opt_column column_name alter_column_visible { $$.val = &tree.AlterTableSetVisible{Column: tree.Name($3), Visible: $4.bool()} } // ALTER TABLE ALTER [COLUMN] DROP NOT NULL | ALTER opt_column column_name DROP NOT NULL { $$.val = &tree.AlterTableDropNotNull{Column: tree.Name($3)} } // ALTER TABLE ALTER [COLUMN] ADD GENERATED ALWAYS AS IDENTITY | ALTER opt_column column_name ADD generated_always_as IDENTITY { qualification := tree.GeneratedAlwaysAsIdentity{} $$.val = &tree.AlterTableAddIdentity{Column: tree.Name($3), Qualification: &qualification} } // ALTER TABLE ALTER [COLUMN] ADD GENERATED BY DEFAULT AS IDENTITY | ALTER opt_column column_name ADD generated_by_default_as IDENTITY { qualification := tree.GeneratedByDefAsIdentity{} $$.val = &tree.AlterTableAddIdentity{Column: tree.Name($3), Qualification: &qualification} } // ALTER TABLE ALTER [COLUMN] ADD GENERATED ALWAYS AS IDENTITY ( ) | ALTER opt_column column_name ADD generated_always_as IDENTITY '(' opt_sequence_option_list ')' { qualification := tree.GeneratedAlwaysAsIdentity{ SeqOptions: $8.seqOpts(), } $$.val = &tree.AlterTableAddIdentity{Column: tree.Name($3), Qualification: &qualification} } // ALTER TABLE ALTER [COLUMN] ADD GENERATED BY DEFAULT AS IDENTITY ( ) | ALTER opt_column column_name ADD generated_by_default_as IDENTITY '(' opt_sequence_option_list ')' { qualification := tree.GeneratedByDefAsIdentity{ SeqOptions: $8.seqOpts(), } $$.val = &tree.AlterTableAddIdentity{Column: tree.Name($3), Qualification: &qualification} } // ALTER TABLE ALTER [COLUMN] SET GENERATED ALWAYS | ALTER opt_column column_name set_generated_always { $$.val = &tree.AlterTableSetIdentity{Column: tree.Name($3), GeneratedAsIdentityType: tree.GeneratedAlways} } // ALTER TABLE ALTER [COLUMN] SET GENERATED BY DEFAULT | ALTER opt_column column_name set_generated_default { $$.val = &tree.AlterTableSetIdentity{Column: tree.Name($3), GeneratedAsIdentityType: tree.GeneratedByDefault} } // ALTER TABLE ALTER [COLUMN] | ALTER opt_column column_name identity_option_list { $$.val = &tree.AlterTableIdentity{Column: tree.Name($3), SeqOptions: $4.seqOpts()} } // ALTER TABLE ALTER [COLUMN] DROP IDENTITY | ALTER opt_column column_name DROP IDENTITY { $$.val = &tree.AlterTableDropIdentity{Column: tree.Name($3), IfExists: false} } // ALTER TABLE ALTER [COLUMN] DROP IDENTITY IF EXISTS | ALTER opt_column column_name DROP IDENTITY IF EXISTS { $$.val = &tree.AlterTableDropIdentity{Column: tree.Name($3), IfExists: true} } // ALTER TABLE ALTER [COLUMN] DROP STORED | ALTER opt_column column_name DROP STORED { $$.val = &tree.AlterTableDropStored{Column: tree.Name($3)} } // ALTER TABLE ALTER [COLUMN] SET NOT NULL | ALTER opt_column column_name SET NOT NULL { $$.val = &tree.AlterTableSetNotNull{Column: tree.Name($3)} } | ALTER opt_column column_name ADD error { return unimplemented(sqllex, "alter table alter column add") } // ALTER TABLE DROP [COLUMN] IF EXISTS [RESTRICT|CASCADE] | DROP opt_column IF EXISTS column_name opt_drop_behavior { $$.val = &tree.AlterTableDropColumn{ IfExists: true, Column: tree.Name($5), DropBehavior: $6.dropBehavior(), } } // ALTER TABLE DROP [COLUMN] [RESTRICT|CASCADE] | DROP opt_column column_name opt_drop_behavior { $$.val = &tree.AlterTableDropColumn{ IfExists: false, Column: tree.Name($3), DropBehavior: $4.dropBehavior(), } } // ALTER TABLE ALTER [COLUMN] // [SET DATA] TYPE // [ COLLATE collation ] // [ USING ] | ALTER opt_column column_name opt_set_data TYPE typename opt_collate opt_alter_column_using { $$.val = &tree.AlterTableAlterColumnType{ Column: tree.Name($3), ToType: $6.typeReference(), Collation: $7, Using: $8.expr(), } } // ALTER TABLE ADD CONSTRAINT ... | ADD table_constraint opt_validate_behavior { $$.val = &tree.AlterTableAddConstraint{ ConstraintDef: $2.constraintDef(), ValidationBehavior: $3.validationBehavior(), } } // ALTER TABLE ADD CONSTRAINT IF NOT EXISTS ... | ADD CONSTRAINT IF NOT EXISTS constraint_name constraint_elem opt_validate_behavior { def := $7.constraintDef() def.SetName(tree.Name($6)) def.SetIfNotExists() $$.val = &tree.AlterTableAddConstraint{ ConstraintDef: def, ValidationBehavior: $8.validationBehavior(), } } // ALTER TABLE ALTER CONSTRAINT ... | ALTER CONSTRAINT constraint_name error { return unimplementedWithIssueDetail(sqllex, 31632, "alter constraint") } // ALTER TABLE INHERITS .... | INHERITS error { /* SKIP DOC */ return unimplementedWithIssueDetail(sqllex, 22456, "alter table inherits") } // ALTER TABLE NO INHERITS .... | NO INHERITS error { /* SKIP DOC */ return unimplementedWithIssueDetail(sqllex, 22456, "alter table no inherits") } // ALTER TABLE ALTER PRIMARY KEY USING COLUMNS ( ) | ALTER PRIMARY KEY USING COLUMNS '(' index_params ')' opt_hash_sharded opt_with_storage_parameter_list { $$.val = &tree.AlterTableAlterPrimaryKey{ Columns: $7.idxElems(), Sharded: $9.shardedIndexDef(), StorageParams: $10.storageParams(), } } // ALTER TABLE VALIDATE CONSTRAINT ... | VALIDATE CONSTRAINT constraint_name { $$.val = &tree.AlterTableValidateConstraint{ Constraint: tree.Name($3), } } // ALTER TABLE DROP CONSTRAINT IF EXISTS [RESTRICT|CASCADE] | DROP CONSTRAINT IF EXISTS constraint_name opt_drop_behavior { $$.val = &tree.AlterTableDropConstraint{ IfExists: true, Constraint: tree.Name($5), DropBehavior: $6.dropBehavior(), } } // ALTER TABLE DROP CONSTRAINT [RESTRICT|CASCADE] | DROP CONSTRAINT constraint_name opt_drop_behavior { $$.val = &tree.AlterTableDropConstraint{ IfExists: false, Constraint: tree.Name($3), DropBehavior: $4.dropBehavior(), } } // ALTER TABLE EXPERIMENTAL_AUDIT SET | EXPERIMENTAL_AUDIT SET audit_mode { $$.val = &tree.AlterTableSetAudit{Mode: $3.auditMode()} } // ALTER TABLE PARTITION BY ... | partition_by_table { $$.val = &tree.AlterTablePartitionByTable{ PartitionByTable: $1.partitionByTable(), } } // ALTER TABLE INJECT STATISTICS | INJECT STATISTICS a_expr { /* SKIP DOC */ $$.val = &tree.AlterTableInjectStats{ Stats: $3.expr(), } } // ALTER TABLE PUSH STATISTICS [WITH EXPLICIT COLUMNS] | PUSH STATISTICS opt_with_explicit_columns a_expr { /* SKIP DOC */ $$.val = &tree.AlterTablePushStats{ Stats: $4.expr(), ExplicitColumns: $3.bool(), } } | SET '(' storage_parameter_list ')' { $$.val = &tree.AlterTableSetStorageParams{ StorageParams: $3.storageParams(), } } | RESET '(' storage_parameter_key_list ')' { $$.val = &tree.AlterTableResetStorageParams{ Params: $3.storageParamKeys(), } } | table_rls_mode ROW LEVEL SECURITY { $$.val = &tree.AlterTableSetRLSMode{ Mode: $1.rlsTableMode(), } } // ALTER TABLE ENABLE TRIGGER | ENABLE TRIGGER name { $$.val = &tree.AlterTableSetTrigger{Enable: true, Scope: tree.TriggerScopeName, Name: tree.Name($3)} } // ALTER TABLE ENABLE TRIGGER ALL | ENABLE TRIGGER ALL { $$.val = &tree.AlterTableSetTrigger{Enable: true, Scope: tree.TriggerScopeAll} } // ALTER TABLE ENABLE TRIGGER USER | ENABLE TRIGGER USER { $$.val = &tree.AlterTableSetTrigger{Enable: true, Scope: tree.TriggerScopeUser} } // ALTER TABLE DISABLE TRIGGER | DISABLE TRIGGER name { $$.val = &tree.AlterTableSetTrigger{Enable: false, Scope: tree.TriggerScopeName, Name: tree.Name($3)} } // ALTER TABLE DISABLE TRIGGER ALL | DISABLE TRIGGER ALL { $$.val = &tree.AlterTableSetTrigger{Enable: false, Scope: tree.TriggerScopeAll} } // ALTER TABLE DISABLE TRIGGER USER | DISABLE TRIGGER USER { $$.val = &tree.AlterTableSetTrigger{Enable: false, Scope: tree.TriggerScopeUser} } audit_mode: READ WRITE { $$.val = tree.AuditModeReadWrite } | OFF { $$.val = tree.AuditModeDisable } alter_index_cmds: alter_index_cmd { $$.val = tree.AlterIndexCmds{$1.alterIndexCmd()} } | alter_index_cmds ',' alter_index_cmd { $$.val = append($1.alterIndexCmds(), $3.alterIndexCmd()) } alter_index_cmd: partition_by_index { $$.val = &tree.AlterIndexPartitionBy{ PartitionByIndex: $1.partitionByIndex(), } } | SET '(' storage_parameter_list ')' { $$.val = &tree.AlterIndexSetStorageParams{ StorageParams: $3.storageParams(), } } | RESET '(' storage_parameter_key_list ')' { $$.val = &tree.AlterIndexResetStorageParams{ Params: $3.storageParamKeys(), } } alter_column_default: SET DEFAULT a_expr { $$.val = $3.expr() } | DROP DEFAULT { $$.val = nil } alter_column_on_update: SET ON UPDATE a_expr { $$.val = $4.expr() } | DROP ON UPDATE { $$.val = nil } alter_column_visible: SET VISIBLE { $$.val = true } | SET NOT VISIBLE { $$.val = false } opt_alter_column_using: USING a_expr { $$.val = $2.expr() } | /* EMPTY */ { $$.val = nil } opt_with_explicit_columns: WITH EXPLICIT COLUMNS { $$.val = true } | /* EMPTY */ { $$.val = false } opt_drop_behavior: CASCADE { $$.val = tree.DropCascade } | RESTRICT { $$.val = tree.DropRestrict } | /* EMPTY */ { $$.val = tree.DropDefault } opt_validate_behavior: NOT VALID { $$.val = tree.ValidationSkip } | /* EMPTY */ { $$.val = tree.ValidationDefault } identity_option_elem: SET CYCLE { /* SKIP DOC */ $$.val = tree.SequenceOption{Name: tree.SeqOptCycle} } | SET NO CYCLE { $$.val = tree.SequenceOption{Name: tree.SeqOptNoCycle} } | SET CACHE signed_iconst64 { x := $3.int64() $$.val = tree.SequenceOption{Name: tree.SeqOptCacheNode, IntVal: &x} } | SET PER NODE CACHE signed_iconst64 { x := $5.int64() $$.val = tree.SequenceOption{Name: tree.SeqOptCacheNode, IntVal: &x} } | SET PER SESSION CACHE signed_iconst64 { x := $5.int64() $$.val = tree.SequenceOption{Name: tree.SeqOptCacheSession, IntVal: &x} } | SET INCREMENT signed_iconst64 { x := $3.int64() $$.val = tree.SequenceOption{Name: tree.SeqOptIncrement, IntVal: &x} } | SET INCREMENT BY signed_iconst64 { x := $4.int64() $$.val = tree.SequenceOption{Name: tree.SeqOptIncrement, IntVal: &x} } | SET MINVALUE signed_iconst64 { x := $3.int64() $$.val = tree.SequenceOption{Name: tree.SeqOptMinValue, IntVal: &x} } | SET NO MINVALUE { $$.val = tree.SequenceOption{Name: tree.SeqOptMinValue} } | SET MAXVALUE signed_iconst64 { x := $3.int64() $$.val = tree.SequenceOption{Name: tree.SeqOptMaxValue, IntVal: &x} } | SET NO MAXVALUE { $$.val = tree.SequenceOption{Name: tree.SeqOptMaxValue} } | SET START signed_iconst64 { x := $3.int64() $$.val = tree.SequenceOption{Name: tree.SeqOptStart, IntVal: &x} } | SET START WITH signed_iconst64 { x := $4.int64() $$.val = tree.SequenceOption{Name: tree.SeqOptStart, IntVal: &x} } | RESTART { $$.val = tree.SequenceOption{Name: tree.SeqOptRestart} } | RESTART signed_iconst64 { x := $2.int64() $$.val = tree.SequenceOption{Name: tree.SeqOptRestart, IntVal: &x} } | RESTART WITH signed_iconst64 { x := $3.int64() $$.val = tree.SequenceOption{Name: tree.SeqOptRestart, IntVal: &x} } | SET sequence_option_elem error { return setErr(sqllex, errors.Newf("sequence option \"%s\" not supported here", $2.seqOpt().Name)) } identity_option_list: identity_option_elem { $$.val = []tree.SequenceOption{$1.seqOpt()} } | identity_option_list identity_option_elem { $$.val = append($1.seqOpts(), $2.seqOpt()) } // %Help: ALTER TYPE - change the definition of a type. // %Category: DDL // %Text: ALTER TYPE // // Commands: // ALTER TYPE ... ADD VALUE [IF NOT EXISTS] [ { BEFORE | AFTER } ] // ALTER TYPE ... RENAME VALUE TO // ALTER TYPE ... RENAME TO // ALTER TYPE ... SET SCHEMA // ALTER TYPE ... OWNER TO { | CURRENT_USER | SESSION_USER } // ALTER TYPE ... RENAME ATTRIBUTE TO [ CASCADE | RESTRICT ] // ALTER TYPE ... [, ... ] // // Attribute action: // ADD ATTRIBUTE [ COLLATE ] [ CASCADE | RESTRICT ] // DROP ATTRIBUTE [IF EXISTS] [ CASCADE | RESTRICT ] // ALTER ATTRIBUTE [ SET DATA ] TYPE [ COLLATE ] [ CASCADE | RESTRICT ] // // %SeeAlso: WEBDOCS/alter-type.html alter_type_stmt: ALTER TYPE type_name ADD VALUE SCONST opt_add_val_placement { $$.val = &tree.AlterType{ Type: $3.unresolvedObjectName(), Cmd: &tree.AlterTypeAddValue{ NewVal: tree.EnumValue($6), IfNotExists: false, Placement: $7.alterTypeAddValuePlacement(), }, } } | ALTER TYPE type_name ADD VALUE IF NOT EXISTS SCONST opt_add_val_placement { $$.val = &tree.AlterType{ Type: $3.unresolvedObjectName(), Cmd: &tree.AlterTypeAddValue{ NewVal: tree.EnumValue($9), IfNotExists: true, Placement: $10.alterTypeAddValuePlacement(), }, } } | ALTER TYPE type_name DROP VALUE SCONST { $$.val = &tree.AlterType{ Type: $3.unresolvedObjectName(), Cmd: &tree.AlterTypeDropValue{ Val: tree.EnumValue($6), }, } } | ALTER TYPE type_name RENAME VALUE SCONST TO SCONST { $$.val = &tree.AlterType{ Type: $3.unresolvedObjectName(), Cmd: &tree.AlterTypeRenameValue{ OldVal: tree.EnumValue($6), NewVal: tree.EnumValue($8), }, } } | ALTER TYPE type_name RENAME TO name { $$.val = &tree.AlterType{ Type: $3.unresolvedObjectName(), Cmd: &tree.AlterTypeRename{ NewName: tree.Name($6), }, } } | ALTER TYPE type_name SET SCHEMA schema_name { $$.val = &tree.AlterType{ Type: $3.unresolvedObjectName(), Cmd: &tree.AlterTypeSetSchema{ Schema: tree.Name($6), }, } } | ALTER TYPE type_name OWNER TO role_spec { $$.val = &tree.AlterType{ Type: $3.unresolvedObjectName(), Cmd: &tree.AlterTypeOwner{ Owner: $6.roleSpec(), }, } } | ALTER TYPE type_name RENAME ATTRIBUTE column_name TO column_name opt_drop_behavior { return unimplementedWithIssueDetail(sqllex, 48701, "ALTER TYPE ATTRIBUTE") } | ALTER TYPE type_name alter_attribute_action_list { return unimplementedWithIssueDetail(sqllex, 48701, "ALTER TYPE ATTRIBUTE") } | ALTER TYPE error // SHOW HELP: ALTER TYPE opt_add_val_placement: BEFORE SCONST { $$.val = &tree.AlterTypeAddValuePlacement{ Before: true, ExistingVal: tree.EnumValue($2), } } | AFTER SCONST { $$.val = &tree.AlterTypeAddValuePlacement{ Before: false, ExistingVal: tree.EnumValue($2), } } | /* EMPTY */ { $$.val = (*tree.AlterTypeAddValuePlacement)(nil) } role_spec: IDENT { $$.val = tree.RoleSpec{ RoleSpecType: tree.RoleName, Name: $1, } } | unreserved_keyword { $$.val = tree.RoleSpec{ RoleSpecType: tree.RoleName, Name: $1, } } | CURRENT_USER { $$.val = tree.RoleSpec{ RoleSpecType: tree.CurrentUser, } } | SESSION_USER { $$.val = tree.RoleSpec{ RoleSpecType: tree.SessionUser, } } role_spec_list: role_spec { $$.val = tree.RoleSpecList{$1.roleSpec()} } | role_spec_list ',' role_spec { $$.val = append($1.roleSpecList(), $3.roleSpec()) } alter_attribute_action_list: alter_attribute_action | alter_attribute_action_list ',' alter_attribute_action alter_attribute_action: ADD ATTRIBUTE column_name type_name opt_collate opt_drop_behavior | DROP ATTRIBUTE column_name opt_drop_behavior | DROP ATTRIBUTE IF EXISTS column_name opt_drop_behavior | ALTER ATTRIBUTE column_name TYPE type_name opt_collate opt_drop_behavior | ALTER ATTRIBUTE column_name SET DATA TYPE type_name opt_collate opt_drop_behavior // %Help: REFRESH - recalculate a materialized view // %Category: Misc // %Text: // REFRESH MATERIALIZED VIEW [CONCURRENTLY] view_name [AS OF SYSTEM TIME >] [WITH [NO] DATA] refresh_stmt: REFRESH MATERIALIZED VIEW opt_concurrently view_name opt_as_of_clause opt_clear_data { $$.val = &tree.RefreshMaterializedView{ Name: $5.unresolvedObjectName(), Concurrently: $4.bool(), AsOf: $6.asOfClause(), RefreshDataOption: $7.refreshDataOption(), } } | REFRESH error // SHOW HELP: REFRESH opt_clear_data: WITH DATA { $$.val = tree.RefreshDataWithData } | WITH NO DATA { $$.val = tree.RefreshDataClear } | /* EMPTY */ { $$.val = tree.RefreshDataDefault } // %Help: BACKUP - back up data to external storage // %Category: CCL // %Text: // // Create a full backup // BACKUP INTO // [ AS OF SYSTEM TIME ] // [ WITH