in webv2/api/schema.go [1508:1589]
func dropTableHelper(w http.ResponseWriter, tableId string) session.ConvWithMetadata {
sessionState := session.GetSessionState()
if sessionState.Conv == nil || sessionState.Driver == "" {
http.Error(w, fmt.Sprintf("Schema is not converted or Driver is not configured properly. Please retry converting the database to Spanner."), http.StatusNotFound)
return session.ConvWithMetadata{}
}
if tableId == "" {
http.Error(w, fmt.Sprintf("Table Id is empty"), http.StatusBadRequest)
}
sessionState.Conv.ConvLock.Lock()
defer sessionState.Conv.ConvLock.Unlock()
spSchema := sessionState.Conv.SpSchema
issues := sessionState.Conv.SchemaIssues
syntheticPkey := sessionState.Conv.SyntheticPKeys
// remove deleted name from usedName
usedNames := sessionState.Conv.UsedNames
delete(usedNames, strings.ToLower(sessionState.Conv.SpSchema[tableId].Name))
for _, index := range sessionState.Conv.SpSchema[tableId].Indexes {
delete(usedNames, index.Name)
}
for _, fk := range sessionState.Conv.SpSchema[tableId].ForeignKeys {
delete(usedNames, fk.Name)
}
delete(spSchema, tableId)
issues[tableId] = internal.TableIssues{
TableLevelIssues: []internal.SchemaIssue{},
ColumnLevelIssues: map[string][]internal.SchemaIssue{},
}
delete(syntheticPkey, tableId)
// drop reference foreign key
for tableName, spTable := range spSchema {
fks := []ddl.Foreignkey{}
for _, fk := range spTable.ForeignKeys {
if fk.ReferTableId != tableId {
fks = append(fks, fk)
} else {
delete(usedNames, fk.Name)
}
}
spTable.ForeignKeys = fks
spSchema[tableName] = spTable
}
// remove interleave that are interleaved on the drop table as parent
for id, spTable := range spSchema {
if spTable.ParentTable.Id == tableId {
spTable.ParentTable.Id = ""
spTable.ParentTable.OnDelete = ""
spSchema[id] = spTable
}
}
// remove interleavable suggestion on droping the parent table
for tableName, tableIssues := range issues {
for colName, colIssues := range tableIssues.ColumnLevelIssues {
updatedColIssues := []internal.SchemaIssue{}
for _, val := range colIssues {
if val != internal.InterleavedOrder {
updatedColIssues = append(updatedColIssues, val)
}
}
if len(updatedColIssues) == 0 {
delete(issues[tableName].ColumnLevelIssues, colName)
} else {
issues[tableName].ColumnLevelIssues[colName] = updatedColIssues
}
}
}
sessionState.Conv.SpSchema = spSchema
sessionState.Conv.SchemaIssues = issues
sessionState.Conv.UsedNames = usedNames
convm := session.ConvWithMetadata{
SessionMetadata: sessionState.SessionMetadata,
Conv: *sessionState.Conv,
}
return convm
}