From 73b31e784d64a4f24644de11d02fa632fe97bfab Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 11 Mar 2020 11:04:59 -0300 Subject: Avoid duplicates in ALTER ... DEPENDS ON EXTENSION If the command is attempted for an extension that the object already depends on, silently do nothing. In particular, this means that if a database containing multiple such entries is dumped, the restore will silently do the right thing and record just the first one. (At least, in a world where pg_dump does dump such entries -- which it doesn't currently, but it will.) Backpatch to 9.6, where this kind of dependency was introduced. Reviewed-by: Ibrar Ahmed, Tom Lane (offlist) Discussion: https://postgr.es/m/20200217225333.GA30974@alvherre.pgsql --- src/backend/commands/alter.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/backend/commands/alter.c') diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c index 3ef3bd4b067..b12f8a60887 100644 --- a/src/backend/commands/alter.c +++ b/src/backend/commands/alter.c @@ -403,6 +403,7 @@ ExecAlterObjectDependsStmt(AlterObjectDependsStmt *stmt, ObjectAddress *refAddre ObjectAddress address; ObjectAddress refAddr; Relation rel; + List *currexts; address = get_object_address_rv(stmt->objectType, stmt->relation, stmt->objname, @@ -434,7 +435,11 @@ ExecAlterObjectDependsStmt(AlterObjectDependsStmt *stmt, ObjectAddress *refAddre if (refAddress) *refAddress = refAddr; - recordDependencyOn(&address, &refAddr, DEPENDENCY_AUTO_EXTENSION); + /* Avoid duplicates */ + currexts = getAutoExtensionsOfObject(address.classId, + address.objectId); + if (!list_member_oid(currexts, refAddr.objectId)) + recordDependencyOn(&address, &refAddr, DEPENDENCY_AUTO_EXTENSION); return address; } -- cgit v1.2.3