diff --git a/go/libraries/doltcore/sqle/alterschema.go b/go/libraries/doltcore/sqle/alterschema.go index a60840c95f..6e791ce65b 100755 --- a/go/libraries/doltcore/sqle/alterschema.go +++ b/go/libraries/doltcore/sqle/alterschema.go @@ -334,13 +334,22 @@ var ErrKeylessAltTbl = errors.New("schema alterations not supported for keyless // backupFkcIndexesForKeyDrop finds backup indexes to cover foreign key references during a primary // key drop. If multiple indexes are valid, we sort by unique and select the first. // This will not work with a non-pk index drop without an additional index filter argument. -func backupFkcIndexesForPkDrop(ctx *sql.Context, sch schema.Schema, fkc *doltdb.ForeignKeyCollection) ([]doltdb.FkIndexUpdate, error) { +func backupFkcIndexesForPkDrop(ctx *sql.Context, tbl string, sch schema.Schema, fkc *doltdb.ForeignKeyCollection) ([]doltdb.FkIndexUpdate, error) { fkUpdates := make([]doltdb.FkIndexUpdate, 0) - for _, fk := range fkc.AllKeys() { - // if an index doesn't reference primary key, it is unaffected + + declared, referenced := fkc.KeysForTable(tbl) + for _, fk := range declared { + if fk.TableIndex == "" { + // pk used in fk definition on |tbl| + return nil, sql.ErrCantDropIndex.New("PRIMARY", fk.Name) + } + } + for _, fk := range referenced { if fk.ReferencedTableIndex != "" { + // if an index doesn't reference primary key, it is unaffected continue } + // pk reference by fk definition on |fk.TableName| // get column names from tags in foreign key fkParentCols := make([]string, len(fk.ReferencedTableColumns)) @@ -353,9 +362,8 @@ func backupFkcIndexesForPkDrop(ctx *sql.Context, sch schema.Schema, fkc *doltdb. newIdx, ok, err := findIndexWithPrefix(sch, sch.GetPKCols().GetColumnNames()) if err != nil { return nil, err - } - if !ok { - return nil, sql.ErrCantDropIndex.New("PRIMARY") + } else if !ok { + return nil, sql.ErrCantDropIndex.New("PRIMARY", fk.Name) } fkUpdates = append(fkUpdates, doltdb.FkIndexUpdate{FkName: fk.Name, FromIdx: fk.ReferencedTableIndex, ToIdx: newIdx.Name()}) diff --git a/go/libraries/doltcore/sqle/tables.go b/go/libraries/doltcore/sqle/tables.go index 1f18ed6e9e..a72be60478 100644 --- a/go/libraries/doltcore/sqle/tables.go +++ b/go/libraries/doltcore/sqle/tables.go @@ -1395,7 +1395,7 @@ func (t *AlterableDoltTable) RewriteInserter( } if len(oldSchema.PkOrdinals) > 0 && len(newSchema.PkOrdinals) == 0 { - newRoot, err = t.adjustForeignKeysForDroppedPk(ctx, newRoot) + newRoot, err = t.adjustForeignKeysForDroppedPk(ctx, t.Name(), newRoot) if err != nil { return nil, err } @@ -1534,7 +1534,7 @@ func validateSchemaChange( return nil } -func (t *AlterableDoltTable) adjustForeignKeysForDroppedPk(ctx *sql.Context, root *doltdb.RootValue) (*doltdb.RootValue, error) { +func (t *AlterableDoltTable) adjustForeignKeysForDroppedPk(ctx *sql.Context, tbl string, root *doltdb.RootValue) (*doltdb.RootValue, error) { if t.autoIncCol.AutoIncrement { return nil, sql.ErrWrongAutoKey.New() } @@ -1544,7 +1544,7 @@ func (t *AlterableDoltTable) adjustForeignKeysForDroppedPk(ctx *sql.Context, roo return nil, err } - fkcUpdates, err := backupFkcIndexesForPkDrop(ctx, t.sch, fkc) + fkcUpdates, err := backupFkcIndexesForPkDrop(ctx, tbl, t.sch, fkc) if err != nil { return nil, err }