Don't pass oidvector by value.
authorNoah Misch <noah@leadboat.com>
Wed, 12 Jun 2013 23:50:37 +0000 (19:50 -0400)
committerNoah Misch <noah@leadboat.com>
Wed, 12 Jun 2013 23:50:37 +0000 (19:50 -0400)
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
src/backend/commands/functioncmds.c
src/include/commands/defrem.h

index bb6c1a46606cb2c7c3cdf1c9dc0e9241660d3dab..b62ec70e20f35b6780c4265b1a026e6361f0e3e2 100644 (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)
        {
index 38187a837c60cf95a32f1b4fc1ea09790a660d38..c776758b51f224e58d37f3951416708cc6fee956 100644 (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))));
 }
 
index 01d165fb794d7d3b075e3b69c137245d571a3cf1..fa9f41f88f0a5fa090121d68f169f624053c6165 100644 (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);