From 813895e4acfa646c6c0405a0a8c5d05637f42865 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Wed, 12 Jun 2013 19:50:37 -0400 Subject: [PATCH] Don't pass oidvector by value. Since the structure ends with a flexible array, doing so truncates any vector having more than one element. New in 9.3, so no back-patch. --- src/backend/commands/alter.c | 4 ++-- src/backend/commands/functioncmds.c | 6 +++--- src/include/commands/defrem.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c index bb6c1a4660..b62ec70e20 100644 --- a/src/backend/commands/alter.c +++ b/src/backend/commands/alter.c @@ -231,7 +231,7 @@ AlterObjectRename_internal(Relation rel, Oid objectId, const char *new_name) Form_pg_proc proc = (Form_pg_proc) GETSTRUCT(oldtup); IsThereFunctionInNamespace(new_name, proc->pronargs, - proc->proargtypes, proc->pronamespace); + &proc->proargtypes, proc->pronamespace); } else if (classId == CollationRelationId) { @@ -611,7 +611,7 @@ AlterObjectNamespace_internal(Relation rel, Oid objid, Oid nspOid) Form_pg_proc proc = (Form_pg_proc) GETSTRUCT(tup); IsThereFunctionInNamespace(NameStr(proc->proname), proc->pronargs, - proc->proargtypes, nspOid); + &proc->proargtypes, nspOid); } else if (classId == CollationRelationId) { diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index 38187a837c..c776758b51 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -1626,18 +1626,18 @@ DropCastById(Oid castOid) */ void IsThereFunctionInNamespace(const char *proname, int pronargs, - oidvector proargtypes, Oid nspOid) + oidvector *proargtypes, Oid nspOid) { /* check for duplicate name (more friendly than unique-index failure) */ if (SearchSysCacheExists3(PROCNAMEARGSNSP, CStringGetDatum(proname), - PointerGetDatum(&proargtypes), + PointerGetDatum(proargtypes), ObjectIdGetDatum(nspOid))) ereport(ERROR, (errcode(ERRCODE_DUPLICATE_FUNCTION), errmsg("function %s already exists in schema \"%s\"", funcname_signature_string(proname, pronargs, - NIL, proargtypes.values), + NIL, proargtypes->values), get_namespace_name(nspOid)))); } diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h index 01d165fb79..fa9f41f88f 100644 --- a/src/include/commands/defrem.h +++ b/src/include/commands/defrem.h @@ -50,7 +50,7 @@ extern Oid AlterFunction(AlterFunctionStmt *stmt); extern Oid CreateCast(CreateCastStmt *stmt); extern void DropCastById(Oid castOid); extern void IsThereFunctionInNamespace(const char *proname, int pronargs, - oidvector proargtypes, Oid nspOid); + oidvector *proargtypes, Oid nspOid); extern void ExecuteDoStmt(DoStmt *stmt); extern Oid get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok);