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:
AndyA
2023-03-07 20:15:36 -08:00
committed by GitHub
2 changed files with 17 additions and 9 deletions

View File

@@ -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()})

View File

@@ -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
}