Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions go/vt/sqlparser/ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -1361,18 +1361,60 @@ func (c *ConstraintDefinition) walkSubtree(visit Visit) error {
return Walk(visit, c.Details)
}

// ReferenceAction indicates the action takes by a referential constraint e.g.
// the `CASCADE` in a `FOREIGN KEY .. ON DELETE CASCADE` table definition.
type ReferenceAction int

// These map to the SQL-defined reference actions.
// See https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html#foreign-keys-referential-actions
const (
// DefaultAction indicates no action was explicitly specified.
DefaultAction ReferenceAction = iota
Restrict
Cascade
NoAction
SetNull
SetDefault
)

func (a ReferenceAction) walkSubtree(visit Visit) error { return nil }

// Format formats the node.
func (a ReferenceAction) Format(buf *TrackedBuffer) {
switch a {
case Restrict:
buf.WriteString("restrict")
case Cascade:
buf.WriteString("cascade")
case NoAction:
buf.WriteString("no action")
case SetNull:
buf.WriteString("set null")
case SetDefault:
buf.WriteString("set default")
}
}

// ForeignKeyDefinition describes a foreign key in a CREATE TABLE statement
type ForeignKeyDefinition struct {
Source Columns
ReferencedTable TableName
ReferencedColumns Columns
OnDelete ReferenceAction
OnUpdate ReferenceAction
}

var _ ConstraintInfo = &ForeignKeyDefinition{}

// Format formats the node.
func (f *ForeignKeyDefinition) Format(buf *TrackedBuffer) {
buf.Myprintf("foreign key %v references %v %v", f.Source, f.ReferencedTable, f.ReferencedColumns)
if f.OnDelete != DefaultAction {
buf.Myprintf(" on delete %v", f.OnDelete)
}
if f.OnUpdate != DefaultAction {
buf.Myprintf(" on update %v", f.OnUpdate)
}
}

func (f *ForeignKeyDefinition) constraintInfo() {}
Expand Down
9 changes: 8 additions & 1 deletion go/vt/sqlparser/parse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1850,7 +1850,14 @@ func TestCreateTable(t *testing.T) {
" Z int,\n" +
" primary key (id, username),\n" +
" key by_email (email(10), username),\n" +
" constraint second_ibfk_1 foreign key (k, j) references simple (a, b)\n" +
" constraint second_ibfk_1 foreign key (k, j) references simple (a, b),\n" +
" constraint second_ibfk_1 foreign key (k, j) references simple (a, b) on delete restrict,\n" +
" constraint second_ibfk_1 foreign key (k, j) references simple (a, b) on delete no action,\n" +
" constraint second_ibfk_1 foreign key (k, j) references simple (a, b) on delete cascade on update set default,\n" +
" constraint second_ibfk_1 foreign key (k, j) references simple (a, b) on delete set default on update set null,\n" +
" constraint second_ibfk_1 foreign key (k, j) references simple (a, b) on delete set null on update restrict,\n" +
" constraint second_ibfk_1 foreign key (k, j) references simple (a, b) on update no action,\n" +
" constraint second_ibfk_1 foreign key (k, j) references simple (a, b) on update cascade\n" +
")",

// table options
Expand Down
Loading