mirror of
https://github.com/dolthub/dolt.git
synced 2026-03-15 11:20:37 -05:00
Merge pull request #5515 from dolthub/andy/drop-pk-fk-checks
go/doltcore/sqle: fix FK checks on drop PK to look at correct Fks
This commit is contained in:
@@ -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()})
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user