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