blob: bffb31d134b1c8cd5886fd3a85c8f0caec680fbe [file] [log] [blame]
/*
* For PostgreSQL Database Management System:
* (formerly known as Postgres, then as Postgres95)
*
* Portions Copyright (c) 1996-2010, The PostgreSQL Global Development Group
*
* Portions Copyright (c) 1994, The Regents of the University of California
*
* Permission to use, copy, modify, and distribute this software and its documentation for any purpose,
* without fee, and without a written agreement is hereby granted, provided that the above copyright notice
* and this paragraph and the following two paragraphs appear in all copies.
*
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT,
* INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY
* OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA
* HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*/
#include "postgres.h"
#include "access/htup_details.h"
#include "catalog/pg_proc.h"
#include "utils/builtins.h"
#include "utils/lsyscache.h"
#include "utils/syscache.h"
#include "catalog/ag_namespace.h"
#include "utils/ag_func.h"
/* checks that func_oid is of func_name function in ag_catalog */
bool is_oid_ag_func(Oid func_oid, const char *func_name)
{
HeapTuple proctup;
Form_pg_proc proc;
Oid nspid;
const char *nspname;
AssertArg(OidIsValid(func_oid));
AssertArg(func_name);
proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(func_oid));
Assert(HeapTupleIsValid(proctup));
proc = (Form_pg_proc)GETSTRUCT(proctup);
if (strncmp(NameStr(proc->proname), func_name, NAMEDATALEN) != 0)
{
ReleaseSysCache(proctup);
return false;
}
nspid = proc->pronamespace;
ReleaseSysCache(proctup);
nspname = get_namespace_name_or_temp(nspid);
Assert(nspname);
return (strcmp(nspname, "ag_catalog") == 0);
}
/* gets the function OID that matches with func_name and argument types */
Oid get_ag_func_oid(const char *func_name, const int nargs, ...)
{
Oid oids[FUNC_MAX_ARGS];
va_list ap;
int i;
oidvector *arg_types;
Oid func_oid;
AssertArg(func_name);
AssertArg(nargs >= 0 && nargs <= FUNC_MAX_ARGS);
va_start(ap, nargs);
for (i = 0; i < nargs; i++)
oids[i] = va_arg(ap, Oid);
va_end(ap);
arg_types = buildoidvector(oids, nargs);
func_oid = GetSysCacheOid3(PROCNAMEARGSNSP, Anum_pg_proc_oid,
CStringGetDatum(func_name),
PointerGetDatum(arg_types),
ObjectIdGetDatum(ag_catalog_namespace_id()));
if (!OidIsValid(func_oid))
{
ereport(ERROR, (errmsg_internal("ag function does not exist"),
errdetail_internal("%s(%d)", func_name, nargs)));
}
return func_oid;
}
Oid get_pg_func_oid(const char *func_name, const int nargs, ...)
{
Oid oids[FUNC_MAX_ARGS];
va_list ap;
int i;
oidvector *arg_types;
Oid func_oid;
AssertArg(func_name);
AssertArg(nargs >= 0 && nargs <= FUNC_MAX_ARGS);
va_start(ap, nargs);
for (i = 0; i < nargs; i++)
oids[i] = va_arg(ap, Oid);
va_end(ap);
arg_types = buildoidvector(oids, nargs);
func_oid = GetSysCacheOid3(PROCNAMEARGSNSP, Anum_pg_proc_oid,
CStringGetDatum(func_name),
PointerGetDatum(arg_types),
ObjectIdGetDatum(pg_catalog_namespace_id()));
if (!OidIsValid(func_oid))
{
ereport(ERROR, (errmsg_internal("pg function does not exist"),
errdetail_internal("%s(%d)", func_name, nargs)));
}
return func_oid;
}