| /*------------------------------------------------------------------------- |
| * |
| * pg_proc.h |
| * definition of the "procedure" system catalog (pg_proc) |
| * |
| * Portions Copyright (c) 2006-2010, Greenplum inc |
| * Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates. |
| * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group |
| * Portions Copyright (c) 1994, Regents of the University of California |
| * |
| * src/include/catalog/pg_proc.h |
| * |
| * NOTES |
| * The Catalog.pm module reads this file and derives schema |
| * information. |
| * |
| *------------------------------------------------------------------------- |
| */ |
| #ifndef PG_PROC_H |
| #define PG_PROC_H |
| |
| #include "catalog/genbki.h" |
| #include "catalog/objectaddress.h" |
| #include "catalog/pg_proc_d.h" |
| #include "nodes/pg_list.h" |
| |
| /* ---------------- |
| * pg_proc definition. cpp turns this into |
| * typedef struct FormData_pg_proc |
| * ---------------- |
| */ |
| CATALOG(pg_proc,1255,ProcedureRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81,ProcedureRelation_Rowtype_Id) BKI_SCHEMA_MACRO |
| { |
| Oid oid; /* oid */ |
| |
| /* procedure name */ |
| NameData proname; |
| |
| /* OID of namespace containing this proc */ |
| Oid pronamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); |
| |
| /* procedure owner */ |
| Oid proowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); |
| |
| /* OID of pg_language entry */ |
| Oid prolang BKI_DEFAULT(internal) BKI_LOOKUP(pg_language); |
| |
| /* estimated execution cost */ |
| float4 procost BKI_DEFAULT(1); |
| |
| /* estimated # of rows out (if proretset) */ |
| float4 prorows BKI_DEFAULT(0); |
| |
| /* element type of variadic array, or 0 if not variadic */ |
| Oid provariadic BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_type); |
| |
| /* planner support function for this function, or 0 if none */ |
| regproc prosupport BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_proc); |
| |
| /* see PROKIND_ categories below */ |
| char prokind BKI_DEFAULT(f); |
| |
| /* security definer */ |
| bool prosecdef BKI_DEFAULT(f); |
| |
| /* is it a leak-proof function? */ |
| bool proleakproof BKI_DEFAULT(f); |
| |
| /* strict with respect to NULLs? */ |
| bool proisstrict BKI_DEFAULT(t); |
| |
| /* returns a set? */ |
| bool proretset BKI_DEFAULT(f); |
| |
| /* see PROVOLATILE_ categories below */ |
| char provolatile BKI_DEFAULT(i); |
| |
| /* see PROPARALLEL_ categories below */ |
| char proparallel BKI_DEFAULT(s); |
| |
| /* number of arguments */ |
| /* Note: need not be given in pg_proc.dat; genbki.pl will compute it */ |
| int16 pronargs; |
| |
| /* number of arguments with defaults */ |
| int16 pronargdefaults BKI_DEFAULT(0); |
| |
| /* OID of result type */ |
| Oid prorettype BKI_LOOKUP(pg_type); |
| |
| /* |
| * variable-length fields start here, but we allow direct access to |
| * proargtypes |
| */ |
| |
| /* parameter types (excludes OUT params) */ |
| oidvector proargtypes BKI_LOOKUP(pg_type) BKI_FORCE_NOT_NULL; |
| |
| #ifdef CATALOG_VARLEN |
| |
| /* all param types (NULL if IN only) */ |
| Oid proallargtypes[1] BKI_DEFAULT(_null_) BKI_LOOKUP(pg_type); |
| |
| /* parameter modes (NULL if IN only) */ |
| char proargmodes[1] BKI_DEFAULT(_null_); |
| |
| /* parameter names (NULL if no names) */ |
| text proargnames[1] BKI_DEFAULT(_null_); |
| |
| /* list of expression trees for argument defaults (NULL if none) */ |
| pg_node_tree proargdefaults BKI_DEFAULT(_null_); |
| |
| /* types for which to apply transforms */ |
| Oid protrftypes[1] BKI_DEFAULT(_null_) BKI_LOOKUP(pg_type); |
| |
| /* procedure source text */ |
| text prosrc BKI_FORCE_NOT_NULL; |
| |
| /* secondary procedure info (can be NULL) */ |
| text probin BKI_DEFAULT(_null_); |
| |
| /* pre-parsed SQL function body */ |
| pg_node_tree prosqlbody BKI_DEFAULT(_null_); |
| |
| /* procedure-local GUC settings */ |
| text proconfig[1] BKI_DEFAULT(_null_); |
| |
| /* access permissions */ |
| aclitem proacl[1] BKI_DEFAULT(_null_); |
| |
| /* data access indicator (GPDB specific) */ |
| char prodataaccess BKI_DEFAULT(n); |
| |
| /* EXECUTE ON ANY or SEGMENTS (GPDB specific) */ |
| char proexeclocation BKI_DEFAULT(a); |
| |
| #endif |
| } FormData_pg_proc; |
| |
| /* GPDB added foreign key definitions for gpcheckcat. */ |
| FOREIGN_KEY(pronamespace REFERENCES pg_namespace(oid)); |
| FOREIGN_KEY(proowner REFERENCES pg_authid(oid)); |
| FOREIGN_KEY(prolang REFERENCES pg_language(oid)); |
| FOREIGN_KEY(prorettype REFERENCES pg_type(oid)); |
| /* alter table pg_proc add vector_fk proargtypes on pg_type(oid); */ |
| /* alter table pg_proc add vector_fk proallargtypes on pg_type(oid); */ |
| |
| /* ---------------- |
| * Form_pg_proc corresponds to a pointer to a tuple with |
| * the format of pg_proc relation. |
| * ---------------- |
| */ |
| typedef FormData_pg_proc *Form_pg_proc; |
| |
| DECLARE_TOAST(pg_proc, 2836, 2837); |
| |
| DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, on pg_proc using btree(oid oid_ops)); |
| #define ProcedureOidIndexId 2690 |
| DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, on pg_proc using btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops)); |
| #define ProcedureNameArgsNspIndexId 2691 |
| |
| /* |
| * TODO: It would be nice if we could default prodataaccess to 'c' for all |
| * SQL-language functions. But the process_col_defaults.pl script isn't |
| * currently smart enough for that. |
| */ |
| |
| #ifdef EXPOSE_TO_CLIENT_CODE |
| |
| /* |
| * Symbolic values for prokind column |
| */ |
| #define PROKIND_FUNCTION 'f' |
| #define PROKIND_AGGREGATE 'a' |
| #define PROKIND_WINDOW 'w' |
| #define PROKIND_PROCEDURE 'p' |
| |
| /* |
| * Symbolic values for provolatile column: these indicate whether the result |
| * of a function is dependent *only* on the values of its explicit arguments, |
| * or can change due to outside factors (such as parameter variables or |
| * table contents). NOTE: functions having side-effects, such as setval(), |
| * must be labeled volatile to ensure they will not get optimized away, |
| * even if the actual return value is not changeable. |
| */ |
| #define PROVOLATILE_IMMUTABLE 'i' /* never changes for given input */ |
| #define PROVOLATILE_STABLE 's' /* does not change within a scan */ |
| #define PROVOLATILE_VOLATILE 'v' /* can change even within a scan */ |
| |
| /* |
| * Symbolic values for proparallel column: these indicate whether a function |
| * can be safely be run in a parallel backend, during parallelism but |
| * necessarily in the leader, or only in non-parallel mode. |
| */ |
| #define PROPARALLEL_SAFE 's' /* can run in worker or leader */ |
| #define PROPARALLEL_RESTRICTED 'r' /* can run in parallel leader only */ |
| #define PROPARALLEL_UNSAFE 'u' /* banned while in parallel mode */ |
| |
| /* |
| * Symbolic values for proargmodes column. Note that these must agree with |
| * the FunctionParameterMode enum in parsenodes.h; we declare them here to |
| * be accessible from either header. |
| */ |
| #define PROARGMODE_IN 'i' |
| #define PROARGMODE_OUT 'o' |
| #define PROARGMODE_INOUT 'b' |
| #define PROARGMODE_VARIADIC 'v' |
| #define PROARGMODE_TABLE 't' |
| |
| /* |
| * Symbolic values for prodataaccess column: these provide a hint regarding |
| * what kind of statements are included in the function. |
| */ |
| #define PRODATAACCESS_NONE 'n' |
| #define PRODATAACCESS_CONTAINS 'c' |
| #define PRODATAACCESS_READS 'r' |
| #define PRODATAACCESS_MODIFIES 'm' |
| |
| #define PROEXECLOCATION_ANY 'a' |
| #define PROEXECLOCATION_COORDINATOR 'c' |
| #define PROEXECLOCATION_INITPLAN 'i' |
| #define PROEXECLOCATION_ALL_SEGMENTS 's' |
| |
| #endif /* EXPOSE_TO_CLIENT_CODE */ |
| |
| |
| extern ObjectAddress ProcedureCreate(const char *procedureName, |
| Oid procNamespace, |
| bool replace, |
| bool returnsSet, |
| Oid returnType, |
| Oid proowner, |
| Oid languageObjectId, |
| Oid languageValidator, |
| Oid describeFuncOid, |
| const char *prosrc, |
| const char *probin, |
| Node *prosqlbody, |
| char prokind, |
| bool security_definer, |
| bool isLeakProof, |
| bool isStrict, |
| char volatility, |
| char parallel, |
| oidvector *parameterTypes, |
| Datum allParameterTypes, |
| Datum parameterModes, |
| Datum parameterNames, |
| List *parameterDefaults, |
| Datum trftypes, |
| Datum proconfig, |
| Oid prosupport, |
| float4 procost, |
| float4 prorows, |
| char prodataaccess, |
| char proexeclocation); |
| |
| extern bool function_parse_error_transpose(const char *prosrc); |
| |
| extern List *oid_array_to_list(Datum datum); |
| |
| #define IS_MEDIAN_OID(x) ((x) == F_MEDIAN_FLOAT8_FLOAT8 || \ |
| (x) == F_MEDIAN_FLOAT8_INTERVAL || \ |
| (x) == F_MEDIAN_FLOAT8_TIMESTAMP || \ |
| (x) == F_MEDIAN_FLOAT8_TIMESTAMPTZ) |
| |
| |
| #endif /* PG_PROC_H */ |