// TODO(a-robinson): Support renaming objects depended on by views once we have // a better encoding for view queries (#10083). func (p *planner) dependentViewRenameError( typeName, objName string, parentID, viewID sqlbase.ID, ) error { viewDesc, err := sqlbase.GetTableDescFromID(p.txn, viewID) if err != nil { return err } viewName := viewDesc.Name if viewDesc.ParentID != parentID { var err error viewName, err = p.getQualifiedTableName(viewDesc) if err != nil { log.Warningf(p.ctx(), "unable to retrieve name of view %d: %v", viewID, err) return sqlbase.NewDependentObjectError("cannot rename %s %q because a view depends on it", typeName, objName) } } return sqlbase.NewDependentObjectError("cannot rename %s %q because view %q depends on it", typeName, objName, viewName) }
// RenameDatabase renames the database. // Privileges: security.RootUser user, DROP on source database. // Notes: postgres requires superuser, db owner, or "CREATEDB". // mysql >= 5.1.23 does not allow database renames. func (p *planner) RenameDatabase(n *parser.RenameDatabase) (planNode, error) { if n.Name == "" || n.NewName == "" { return nil, errEmptyDatabaseName } if p.session.User != security.RootUser { return nil, fmt.Errorf("only %s is allowed to rename databases", security.RootUser) } dbDesc, err := p.mustGetDatabaseDesc(string(n.Name)) if err != nil { return nil, err } if err := p.checkPrivilege(dbDesc, privilege.DROP); err != nil { return nil, err } if n.Name == n.NewName { // Noop. return &emptyNode{}, nil } // Check if any views depend on tables in the database. Because our views // are currently just stored as strings, they explicitly specify the database // name. Rather than trying to rewrite them with the changed DB name, we // simply disallow such renames for now. tbNames, err := p.getTableNames(dbDesc) if err != nil { return nil, err } for i := range tbNames { tbDesc, err := p.getTableOrViewDesc(&tbNames[i]) if err != nil { return nil, err } if tbDesc == nil { continue } if len(tbDesc.DependedOnBy) > 0 { viewDesc, err := sqlbase.GetTableDescFromID(p.txn, tbDesc.DependedOnBy[0].ID) if err != nil { return nil, err } viewName := viewDesc.Name if dbDesc.ID != viewDesc.ParentID { var err error viewName, err = p.getQualifiedTableName(viewDesc) if err != nil { log.Warningf(p.ctx(), "Unable to retrieve fully-qualified name of view %d: %v", viewDesc.ID, err) return nil, sqlbase.NewDependentObjectError( "cannot rename database because a view depends on table %q", tbDesc.Name) } } return nil, sqlbase.NewDependentObjectError( "cannot rename database because view %q depends on table %q", viewName, tbDesc.Name) } } if err := p.renameDatabase(dbDesc, string(n.NewName)); err != nil { return nil, err } return &emptyNode{}, nil }