Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 9b28685

Browse files
committed
Add more sanity checks with callers of changeDependencyFor()
changeDependencyFor() returns the number of pg_depend entries changed, or 0 if there is a problem. The callers of this routine expect only one dependency to change, but they did not check for the result returned. The following code paths gain checks: - Namespace for extensions. - Namespace for various object types (see AlterObjectNamespace). - Planner support function for a function. Some existing error messages related to all that are reworded to be more consistent with the project style, and the new error messages added follow the same style. This change has exposed one bug fixed a bit earlier with bd5ddbe. Reviewed-by: Heikki Linnakangas, Akshat Jaimini Discussion: https://postgr.es/m/ZJzD/rn+UbloKjB7@paquier.xyz
1 parent bd5ddbe commit 9b28685

File tree

6 files changed

+21
-13
lines changed

6 files changed

+21
-13
lines changed

src/backend/commands/alter.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -847,9 +847,11 @@ AlterObjectNamespace_internal(Relation rel, Oid objid, Oid nspOid)
847847
pfree(nulls);
848848
pfree(replaces);
849849

850-
/* update dependencies to point to the new schema */
851-
changeDependencyFor(classId, objid,
852-
NamespaceRelationId, oldNspOid, nspOid);
850+
/* update dependency to point to the new schema */
851+
if (changeDependencyFor(classId, objid,
852+
NamespaceRelationId, oldNspOid, nspOid) != 1)
853+
elog(ERROR, "could not change schema dependency for object %u",
854+
objid);
853855

854856
InvokeObjectPostAlterHook(classId, objid, 0);
855857

src/backend/commands/cluster.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,15 +1271,15 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class,
12711271
AccessMethodRelationId,
12721272
relam1,
12731273
relam2) != 1)
1274-
elog(ERROR, "failed to change access method dependency for relation \"%s.%s\"",
1274+
elog(ERROR, "could not change access method dependency for relation \"%s.%s\"",
12751275
get_namespace_name(get_rel_namespace(r1)),
12761276
get_rel_name(r1));
12771277
if (changeDependencyFor(RelationRelationId,
12781278
r2,
12791279
AccessMethodRelationId,
12801280
relam2,
12811281
relam1) != 1)
1282-
elog(ERROR, "failed to change access method dependency for relation \"%s.%s\"",
1282+
elog(ERROR, "could not change access method dependency for relation \"%s.%s\"",
12831283
get_namespace_name(get_rel_namespace(r2)),
12841284
get_rel_name(r2));
12851285
}

src/backend/commands/extension.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2944,9 +2944,11 @@ AlterExtensionNamespace(const char *extensionName, const char *newschema, Oid *o
29442944

29452945
table_close(extRel, RowExclusiveLock);
29462946

2947-
/* update dependencies to point to the new schema */
2948-
changeDependencyFor(ExtensionRelationId, extensionOid,
2949-
NamespaceRelationId, oldNspOid, nspOid);
2947+
/* update dependency to point to the new schema */
2948+
if (changeDependencyFor(ExtensionRelationId, extensionOid,
2949+
NamespaceRelationId, oldNspOid, nspOid) != 1)
2950+
elog(ERROR, "could not change schema dependency for extension %s",
2951+
NameStr(extForm->extname));
29502952

29512953
InvokeObjectPostAlterHook(ExtensionRelationId, extensionOid, 0);
29522954

src/backend/commands/functioncmds.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,9 +1450,13 @@ AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt)
14501450

14511451
/* Add or replace dependency on support function */
14521452
if (OidIsValid(procForm->prosupport))
1453-
changeDependencyFor(ProcedureRelationId, funcOid,
1454-
ProcedureRelationId, procForm->prosupport,
1455-
newsupport);
1453+
{
1454+
if (changeDependencyFor(ProcedureRelationId, funcOid,
1455+
ProcedureRelationId, procForm->prosupport,
1456+
newsupport) != 1)
1457+
elog(ERROR, "could not change support dependency for function %s",
1458+
get_func_name(funcOid));
1459+
}
14561460
else
14571461
{
14581462
ObjectAddress referenced;

src/backend/commands/tablecmds.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16608,7 +16608,7 @@ AlterRelationNamespaceInternal(Relation classRel, Oid relOid,
1660816608
NamespaceRelationId,
1660916609
oldNspOid,
1661016610
newNspOid) != 1)
16611-
elog(ERROR, "failed to change schema dependency for relation \"%s\"",
16611+
elog(ERROR, "could not change schema dependency for relation \"%s\"",
1661216612
NameStr(classForm->relname));
1661316613
}
1661416614
if (!already_done)

src/backend/commands/typecmds.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4059,7 +4059,7 @@ AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid,
40594059
!isImplicitArray)
40604060
if (changeDependencyFor(TypeRelationId, typeOid,
40614061
NamespaceRelationId, oldNspOid, nspOid) != 1)
4062-
elog(ERROR, "failed to change schema dependency for type %s",
4062+
elog(ERROR, "could not change schema dependency for type \"%s\"",
40634063
format_type_be(typeOid));
40644064

40654065
InvokeObjectPostAlterHook(TypeRelationId, typeOid, 0);

0 commit comments

Comments
 (0)