Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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);