104 errmsg(
"SQL function cannot return shell type %s",
109 errmsg(
"return type %s is only a shell",
138 errmsg(
"type modifier cannot be specified for shell type \"%s\"",
145 errdetail(
"Creating a shell type definition.")));
223 foreach(
x, parameters)
246 errmsg(
"SQL function cannot accept shell type %s",
253 errmsg(
"aggregate cannot accept shell type %s",
259 errmsg(
"argument type %s is only a shell",
270 errmsg(
"type %s does not exist",
285 errmsg(
"aggregates cannot accept set arguments"),
290 errmsg(
"procedures cannot accept set arguments"),
295 errmsg(
"functions cannot accept set arguments"),
306 errmsg(
"VARIADIC parameter must be the last input parameter"),
327 errmsg(
"VARIADIC parameter must be the last parameter"),
332 else if (outCount == 0)
353 errmsg(
"VARIADIC parameter must be an array"),
373 foreach(
px, parameters)
399 errmsg(
"parameter name \"%s\" used more than once",
418 errmsg(
"only input parameters can have default values"),
434 errmsg(
"cannot use table references in parameter default value"),
459 errmsg(
"input parameters after one with a default value must also have defaults"),
470 errmsg(
"procedure OUT parameters cannot appear after one with a default value"),
613 errmsg(
"invalid attribute in procedure definition"),
651 errmsg(
"parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE")));
703 errmsg(
"function %s does not exist",
709 errmsg(
"support function %s must return type %s",
720 errmsg(
"must be superuser to specify a support function")));
792 errmsg(
"invalid attribute in procedure definition"),
813 elog(
ERROR,
"option \"%s\" not recognized",
841 errmsg(
"COST must be positive")));
849 errmsg(
"ROWS must be positive")));
873 const char *queryString)
878 errmsg(
"no function body specified")));
883 errmsg(
"duplicate function body specified")));
888 errmsg(
"inline SQL function body only valid for language SQL")));
930 errmsg(
"SQL function with unquoted function body cannot have polymorphic arguments")));
956 errmsg(
"%s is not yet supported in unquoted SQL function body",
975 errmsg(
"%s is not yet supported in unquoted SQL function body",
1003 errmsg(
"only one AS item needed for language \"%s\"",
1109 errmsg(
"no language specified")));
1119 errhint(
"Use CREATE EXTENSION to load the language into the database.") : 0)));
1152 errmsg(
"only superuser can define a leakproof function")));
1165 typeid =
elt ?
elt :
typeid;
1190 if (
stmt->is_procedure)
1196 else if (
stmt->returnType)
1200 &prorettype, &returnsSet);
1204 errmsg(
"function result type must be %s because of OUT parameters",
1217 errmsg(
"function result type must be specified")));
1267 else if (!returnsSet)
1270 errmsg(
"ROWS is not applicable when function does not return a set")));
1326 elog(
ERROR,
"cache lookup failed for function %u", funcOid);
1347 elog(
ERROR,
"cache lookup failed for pg_aggregate tuple for function %u", funcOid);
1390 elog(
ERROR,
"cache lookup failed for function %u", funcOid);
1402 errmsg(
"\"%s\" is an aggregate function",
1408 foreach(l,
stmt->actions)
1439 errmsg(
"only superuser can define a leakproof function")));
1447 errmsg(
"COST must be positive")));
1455 errmsg(
"ROWS must be positive")));
1459 errmsg(
"ROWS is not applicable when function does not return a set")));
1472 elog(
ERROR,
"could not change support dependency for function %s",
1566 errmsg(
"source data type %s is a pseudo-type",
1572 errmsg(
"target data type %s is a pseudo-type",
1580 errmsg(
"must be owner of type %s or type %s",
1596 errmsg(
"cast will be ignored because the source data type is a domain")));
1601 errmsg(
"cast will be ignored because the target data type is a domain")));
1606 else if (
stmt->inout)
1619 elog(
ERROR,
"cache lookup failed for function %u", funcid);
1626 errmsg(
"cast function must take one to three arguments")));
1632 errmsg(
"argument of cast function must match or be binary-coercible from source data type")));
1636 errmsg(
"second argument of cast function must be type %s",
1641 errmsg(
"third argument of cast function must be type %s",
1648 errmsg(
"return data type of cast function must match or be binary-coercible to target data type")));
1659 errmsg(
"cast function must not be volatile")));
1664 errmsg(
"cast function must be a normal function")));
1668 errmsg(
"cast function must not return a set")));
1694 errmsg(
"must be superuser to create a cast WITHOUT FUNCTION")));
1709 errmsg(
"source and target data types are not physically compatible")));
1729 errmsg(
"composite data types are not binary-compatible")));
1735 errmsg(
"array data types are not binary-compatible")));
1743 errmsg(
"range data types are not binary-compatible")));
1749 errmsg(
"enum data types are not binary-compatible")));
1766 errmsg(
"domain data types must not be marked binary-compatible")));
1776 errmsg(
"source data type and target data type are the same")));
1779 switch (
stmt->context)
1792 elog(
ERROR,
"unrecognized CoercionContext: %d",
stmt->context);
1809 errmsg(
"transform function must not be volatile")));
1813 errmsg(
"transform function must be a normal function")));
1817 errmsg(
"transform function must not return a set")));
1821 errmsg(
"transform function must take one argument")));
1825 errmsg(
"first argument of transform function must be type %s",
1864 errmsg(
"data type %s is a pseudo-type",
1870 errmsg(
"data type %s is a domain",
1910 errmsg(
"return data type of FROM SQL function must be %s",
1936 errmsg(
"return data type of TO SQL function must be the transform data type")));
1963 errmsg(
"transform for type %s language \"%s\" already exists",
2049 errmsg(
"transform for type %s language \"%s\" does not exist",
2073 errmsg(
"function %s already exists in schema \"%s\"",
2115 elog(
ERROR,
"option \"%s\" not recognized",
2124 errmsg(
"no inline code specified")));
2139 errhint(
"Use CREATE EXTENSION to load the language into the database.") : 0)));
2170 errmsg(
"language \"%s\" does not support inline code execution",
2238 elog(
ERROR,
"cache lookup failed for function %u",
fexpr->funcid);
2265 errmsg_plural(
"cannot pass more than %d argument to a procedure",
2266 "cannot pass more than %d arguments to a procedure",
2306 fcinfo->args[
i].value =
val;
2307 fcinfo->args[
i].isnull = isnull;
2338 elog(
ERROR,
"procedure returned null record");
2375 elog(
ERROR,
"unexpected result type for procedure: %u",
2376 fexpr->funcresulttype);
2395 elog(
ERROR,
"cache lookup failed for procedure %u",
fexpr->funcid);
2414 for (
int i = 0;
i < tupdesc->
natts;
i++)
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode)
bool object_ownercheck(Oid classid, Oid objectid, Oid roleid)
void aclcheck_error_type(AclResult aclerr, Oid typeOid)
#define DatumGetArrayTypeP(X)
ArrayType * construct_array_builtin(Datum *elems, int nelems, Oid elmtype)
static Datum values[MAXATTR]
#define CStringGetTextDatum(s)
#define Assert(condition)
#define OidIsValid(objectId)
Oid GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn)
const char * GetCommandTagName(CommandTag commandTag)
List * defGetQualifiedName(DefElem *def)
void errorConflictingDefElem(DefElem *defel, ParseState *pstate)
double defGetNumeric(DefElem *def)
void record_object_address_dependencies(const ObjectAddress *depender, ObjectAddresses *referenced, DependencyType behavior)
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
ObjectAddresses * new_object_addresses(void)
void free_object_addresses(ObjectAddresses *addrs)
int errmsg_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
ExprState * ExecPrepareExpr(Expr *node, EState *estate)
void end_tup_output(TupOutputState *tstate)
const TupleTableSlotOps TTSOpsHeapTuple
TupOutputState * begin_tup_output_tupdesc(DestReceiver *dest, TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
TupleTableSlot * ExecStoreHeapTuple(HeapTuple tuple, TupleTableSlot *slot, bool shouldFree)
ExprContext * CreateExprContext(EState *estate)
void FreeExecutorState(EState *estate)
EState * CreateExecutorState(void)
static Datum ExecEvalExprSwitchContext(ExprState *state, ExprContext *econtext, bool *isNull)
bool extension_file_exists(const char *extensionName)
#define palloc0_object(type)
void fmgr_info(Oid functionId, FmgrInfo *finfo)
#define OidFunctionCall1(functionId, arg1)
#define DatumGetHeapTupleHeader(X)
#define InitFunctionCallInfoData(Fcinfo, Flinfo, Nargs, Collation, Context, Resultinfo)
#define LOCAL_FCINFO(name, nargs)
#define FunctionCallInvoke(fcinfo)
#define fmgr_info_set_expr(expr, finfo)
TupleDesc build_function_result_tupdesc_t(HeapTuple procTuple)
void ExecuteCallStmt(CallStmt *stmt, ParamListInfo params, bool atomic, DestReceiver *dest)
ObjectAddress CreateCast(CreateCastStmt *stmt)
static void compute_return_type(TypeName *returnType, Oid languageOid, Oid *prorettype_p, bool *returnsSet_p)
static Oid interpret_func_support(DefElem *defel)
static void compute_function_attributes(ParseState *pstate, bool is_procedure, List *options, List **as, char **language, Node **transform, bool *windowfunc_p, char *volatility_p, bool *strict_p, bool *security_definer, bool *leakproof_p, ArrayType **proconfig, float4 *procost, float4 *prorows, Oid *prosupport, char *parallel_p)
void interpret_function_parameter_list(ParseState *pstate, List *parameters, Oid languageOid, ObjectType objtype, oidvector **parameterTypes, List **parameterTypes_list, ArrayType **allParameterTypes, ArrayType **parameterModes, ArrayType **parameterNames, List **inParameterNames_list, List **parameterDefaults, Oid *variadicArgType, Oid *requiredResultType)
static bool compute_common_attribute(ParseState *pstate, bool is_procedure, DefElem *defel, DefElem **volatility_item, DefElem **strict_item, DefElem **security_item, DefElem **leakproof_item, List **set_items, DefElem **cost_item, DefElem **rows_item, DefElem **support_item, DefElem **parallel_item)
static char interpret_func_volatility(DefElem *defel)
ObjectAddress CreateFunction(ParseState *pstate, CreateFunctionStmt *stmt)
void IsThereFunctionInNamespace(const char *proname, int pronargs, oidvector *proargtypes, Oid nspOid)
ObjectAddress AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt)
TupleDesc CallStmtResultDesc(CallStmt *stmt)
static void interpret_AS_clause(Oid languageOid, const char *languageName, char *funcname, List *as, Node *sql_body_in, List *parameterTypes, List *inParameterNames, char **prosrc_str_p, char **probin_str_p, Node **sql_body_out, const char *queryString)
Oid get_transform_oid(Oid type_id, Oid lang_id, bool missing_ok)
void ExecuteDoStmt(ParseState *pstate, DoStmt *stmt, bool atomic)
static void check_transform_function(Form_pg_proc procstruct)
ObjectAddress CreateTransform(CreateTransformStmt *stmt)
static ArrayType * update_proconfig_value(ArrayType *a, List *set_items)
void RemoveFunctionById(Oid funcOid)
static char interpret_func_parallel(DefElem *defel)
void sql_fn_parser_setup(struct ParseState *pstate, SQLFunctionParseInfoPtr pinfo)
void px(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table)
ArrayType * GUCArrayAdd(ArrayType *array, const char *name, const char *value)
ArrayType * GUCArrayDelete(ArrayType *array, const char *name)
char * ExtractSetVariableArgs(VariableSetStmt *stmt)
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, const Datum *replValues, const bool *replIsnull, const bool *doReplace)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
bool heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
static int32 HeapTupleHeaderGetTypMod(const HeapTupleHeaderData *tup)
static uint32 HeapTupleHeaderGetDatumLength(const HeapTupleHeaderData *tup)
static void * GETSTRUCT(const HeapTupleData *tuple)
static Oid HeapTupleHeaderGetTypeId(const HeapTupleHeaderData *tup)
void CatalogTupleUpdate(Relation heapRel, const ItemPointerData *otid, HeapTuple tup)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
void CatalogTupleDelete(Relation heapRel, const ItemPointerData *tid)
static void ItemPointerSetInvalid(ItemPointerData *pointer)
List * lappend(List *list, void *datum)
List * lappend_oid(List *list, Oid datum)
Oid get_element_type(Oid typid)
void get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval, char *typalign)
char * get_language_name(Oid langoid, bool missing_ok)
char * get_func_name(Oid funcid)
char get_typtype(Oid typid)
Oid get_base_element_type(Oid typid)
char * get_namespace_name(Oid nspid)
Oid get_func_rettype(Oid funcid)
char * pstrdup(const char *in)
void * palloc0(Size size)
char * NameListToString(const List *names)
Oid QualifiedNameGetCreationNamespace(const List *names, char **objname_p)
Oid exprType(const Node *expr)
#define IsA(nodeptr, _type_)
#define castNode(_type_, nodeptr)
#define InvokeObjectPostCreateHook(classId, objectId, subId)
#define InvokeObjectPostAlterHook(classId, objectId, subId)
#define InvokeFunctionExecuteHook(objectId)
#define ObjectAddressSet(addr, class_id, object_id)
oidvector * buildoidvector(const Oid *oids, int n)
Node * coerce_to_specific_type(ParseState *pstate, Node *node, Oid targetTypeId, const char *constructName)
bool IsBinaryCoercibleWithCast(Oid srctype, Oid targettype, Oid *castoid)
void assign_expr_collations(ParseState *pstate, Node *expr)
Node * transformExpr(ParseState *pstate, Node *expr, ParseExprKind exprKind)
const char * funcname_signature_string(const char *funcname, int nargs, List *argnames, const Oid *argtypes)
const char * func_signature_string(List *funcname, int nargs, List *argnames, const Oid *argtypes)
Oid LookupFuncWithArgs(ObjectType objtype, ObjectWithArgs *func, bool missing_ok)
Oid LookupFuncName(List *funcname, int nargs, const Oid *argtypes, bool missing_ok)
void free_parsestate(ParseState *pstate)
int parser_errposition(ParseState *pstate, int location)
ParseState * make_parsestate(ParseState *parentParseState)
@ EXPR_KIND_FUNCTION_DEFAULT
char * TypeNameToString(const TypeName *typeName)
Type LookupTypeName(ParseState *pstate, const TypeName *typeName, int32 *typmod_p, bool missing_ok)
Oid typenameTypeId(ParseState *pstate, const TypeName *typeName)
Query * transformStmt(ParseState *pstate, Node *parseTree)
FormData_pg_attribute * Form_pg_attribute
ObjectAddress CastCreate(Oid sourcetypeid, Oid targettypeid, Oid funcid, Oid incastid, Oid outcastid, char castcontext, char castmethod, DependencyType behavior)
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
long changeDependencyFor(Oid classId, Oid objectId, Oid refClassId, Oid oldRefObjectId, Oid newRefObjectId)
long deleteDependencyRecordsFor(Oid classId, Oid objectId, bool skipExtensionDeps)
void recordDependencyOnCurrentExtension(const ObjectAddress *object, bool isReplace)
FormData_pg_language * Form_pg_language
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define linitial_node(type, l)
static Oid list_nth_oid(const List *list, int n)
static void * list_nth(const List *list, int n)
ObjectAddress ProcedureCreate(const char *procedureName, Oid procNamespace, bool replace, bool returnsSet, Oid returnType, Oid proowner, Oid languageObjectId, Oid languageValidator, 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, List *trfoids, Datum proconfig, Oid prosupport, float4 procost, float4 prorows)
FormData_pg_proc * Form_pg_proc
ObjectAddress TypeShellMake(const char *typeName, Oid typeNamespace, Oid ownerId)
FormData_pg_type * Form_pg_type
void pgstat_drop_function(Oid proid)
void pgstat_init_function_usage(FunctionCallInfo fcinfo, PgStat_FunctionCallUsage *fcu)
void pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize)
static Datum PointerGetDatum(const void *X)
static Datum ObjectIdGetDatum(Oid X)
static Datum CStringGetDatum(const char *X)
static Datum CharGetDatum(char X)
void EnsurePortalSnapshotExists(void)
Oid get_language_oid(const char *langname, bool missing_ok)
#define RelationGetDescr(relation)
Snapshot GetTransactionSnapshot(void)
void PushActiveSnapshot(Snapshot snapshot)
void PopActiveSnapshot(void)
#define ERRCODE_DUPLICATE_OBJECT
ParamListInfo es_param_list_info
FunctionParameterMode mode
const char * p_sourcetext
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
HeapTuple SearchSysCache2(int cacheId, Datum key1, Datum key2)
#define SearchSysCacheCopy1(cacheId, key1)
#define SearchSysCacheExists3(cacheId, key1, key2, key3)
#define GetSysCacheOid2(cacheId, oidcol, key1, key2)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
#define ReleaseTupleDesc(tupdesc)
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod)
CommandTag CreateCommandTag(Node *parsetree)
String * makeString(char *str)
bool contain_var_clause(Node *node)
void CommandCounterIncrement(void)