/*
|
* 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;
|
}
|