26096 {
26097 if (IsSystemEntry(new_obj)) {
26098 D_ASSERT(IsSystemEntry(old_obj));
26099
26100 return;
26101 }
26102
26103 const auto old_info = GetLookupProperties(old_obj);
26104 const auto new_info = GetLookupProperties(new_obj);
26105
26106 vector<DependencyInfo> dependencies;
26107
26108 ScanDependents(transaction, old_info, [&](DependencyEntry &dep) {
26109
26110 D_ASSERT(dep.EntryInfo().type != CatalogType::SCHEMA_ENTRY);
26111
26112 bool disallow_alter = true;
26113 switch (alter_info.type) {
26114 case AlterType::ALTER_TABLE: {
26115 auto &alter_table = alter_info.Cast<AlterTableInfo>();
26116 switch (alter_table.alter_table_type) {
26117 case AlterTableType::FOREIGN_KEY_CONSTRAINT: {
26118
26119
26120 disallow_alter = false;
26121 break;
26122 }
26123 case AlterTableType::ADD_COLUMN:
26124 case AlterTableType::SET_DEFAULT: {
26125 disallow_alter = false;
26126 break;
26127 }
26128 default:
26129 break;
26130 }
26131 break;
26132 }
26133 case AlterType::SET_COLUMN_COMMENT:
26134 case AlterType::SET_COMMENT: {
26135 disallow_alter = false;
26136 break;
26137 }
26138 default:
26139 break;
26140 }
26141 if (disallow_alter) {
26142 throw DependencyException("Cannot alter entry \"%s\" because there are entries that "
26143 "depend on it.",
26144 old_obj.name);
26145 }
26146
26147 auto dep_info = DependencyInfo::FromDependent(dep);
26148 dep_info.subject.entry = new_info;
26149 dependencies.emplace_back(dep_info);
26150 });
26151
26152
26153 bool has_new_dependencies = alter_info.new_dependencies.get();
26154 ScanSubjects(transaction, old_info, [&](DependencyEntry &dep) {
26155 if (has_new_dependencies && !dep.Subject().flags.IsOwnership()) {
26156
26157
26158 return;
26159 }
26160 auto entry = LookupEntry(transaction, dep);
26161 if (!entry) {
26162 return;
26163 }
26164
26165 auto dep_info = DependencyInfo::FromSubject(dep);
26166 dep_info.dependent.entry = new_info;
26167 dependencies.emplace_back(dep_info);
26168 });
26169
26171
26172
26173 CleanupDependencies(transaction, old_obj);
26174 }
26175
26176 if (has_new_dependencies) {
26177
26178 CreateDependencies(transaction, new_obj, *alter_info.new_dependencies);
26179 }
26180
26181
26182 for (auto &dep : dependencies) {
26183 CreateDependency(transaction, dep);
26184 }
26185}
static DUCKDB_API bool CIEquals(const string &l1, const string &l2)
Case insensitive equals.