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.
This commit is contained in:
Noah Misch 2013-06-12 19:50:37 -04:00
parent fb435f40d5
commit 813895e4ac
3 changed files with 6 additions and 6 deletions

View File

@ -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)
{

View File

@ -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))));
}

View File

@ -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);