89 Oid *prorettype_p,
bool *returnsSet_p)
101 if (languageOid == SQLlanguageId)
103 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
104 errmsg(
"SQL function cannot return shell type %s",
108 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
109 errmsg(
"return type %s is only a shell",
128 if (languageOid != INTERNALlanguageId &&
129 languageOid != ClanguageId)
131 (
errcode(ERRCODE_UNDEFINED_OBJECT),
132 errmsg(
"type \"%s\" does not exist", typnam)));
137 (
errcode(ERRCODE_SYNTAX_ERROR),
138 errmsg(
"type modifier cannot be specified for shell type \"%s\"",
143 (
errcode(ERRCODE_UNDEFINED_OBJECT),
144 errmsg(
"type \"%s\" is not yet defined", typnam),
145 errdetail(
"Creating a shell type definition.")));
164 *prorettype_p = rettype;
165 *returnsSet_p = returnType->
setof;
190 List **parameterTypes_list,
194 List **inParameterNames_list,
195 List **parameterDefaults,
196 Oid *variadicArgType,
197 Oid *requiredResultType)
207 bool have_names =
false;
208 bool have_defaults =
false;
219 *parameterDefaults =
NIL;
223 foreach(
x, parameters)
228 bool isinput =
false;
243 if (languageOid == SQLlanguageId)
245 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
246 errmsg(
"SQL function cannot accept shell type %s",
252 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
253 errmsg(
"aggregate cannot accept shell type %s",
258 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
259 errmsg(
"argument type %s is only a shell",
269 (
errcode(ERRCODE_UNDEFINED_OBJECT),
270 errmsg(
"type %s does not exist",
284 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
285 errmsg(
"aggregates cannot accept set arguments"),
289 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
290 errmsg(
"procedures cannot accept set arguments"),
294 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
295 errmsg(
"functions cannot accept set arguments"),
305 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
306 errmsg(
"VARIADIC parameter must be the last input parameter"),
308 inTypes[inCount++] = toid;
310 if (parameterTypes_list)
311 *parameterTypes_list =
lappend_oid(*parameterTypes_list, toid);
326 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
327 errmsg(
"VARIADIC parameter must be the last parameter"),
330 *requiredResultType = RECORDOID;
332 else if (outCount == 0)
333 *requiredResultType = toid;
339 *variadicArgType = toid;
345 case ANYCOMPATIBLEARRAYOID:
352 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
353 errmsg(
"VARIADIC parameter must be an array"),
373 foreach(
px, parameters)
381 prevfpmode = prevfp->
mode;
395 if (prevfp->
name && prevfp->
name[0] &&
396 strcmp(prevfp->
name, fp->
name) == 0)
398 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
399 errmsg(
"parameter name \"%s\" used more than once",
408 if (inParameterNames_list)
417 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
418 errmsg(
"only input parameters can have default values"),
433 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
434 errmsg(
"cannot use table references in parameter default value"),
451 *parameterDefaults =
lappend(*parameterDefaults, def);
452 have_defaults =
true;
456 if (isinput && have_defaults)
458 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
459 errmsg(
"input parameters after one with a default value must also have defaults"),
469 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
470 errmsg(
"procedure OUT parameters cannot appear after one with a default value"),
480 if (outCount > 0 || varCount > 0)
485 *requiredResultType = RECORDOID;
490 *allParameterTypes = NULL;
491 *parameterModes = NULL;
496 for (
i = 0;
i < parameterCount;
i++)
504 *parameterNames = NULL;
530 if (strcmp(defel->
defname,
"volatility") == 0)
533 goto procedure_error;
534 if (*volatility_item)
537 *volatility_item = defel;
539 else if (strcmp(defel->
defname,
"strict") == 0)
542 goto procedure_error;
546 *strict_item = defel;
548 else if (strcmp(defel->
defname,
"security") == 0)
553 *security_item = defel;
555 else if (strcmp(defel->
defname,
"leakproof") == 0)
558 goto procedure_error;
562 *leakproof_item = defel;
564 else if (strcmp(defel->
defname,
"set") == 0)
568 else if (strcmp(defel->
defname,
"cost") == 0)
571 goto procedure_error;
577 else if (strcmp(defel->
defname,
"rows") == 0)
580 goto procedure_error;
586 else if (strcmp(defel->
defname,
"support") == 0)
589 goto procedure_error;
593 *support_item = defel;
595 else if (strcmp(defel->
defname,
"parallel") == 0)
598 goto procedure_error;
602 *parallel_item = defel;
612 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
613 errmsg(
"invalid attribute in procedure definition"),
623 if (strcmp(
str,
"immutable") == 0)
624 return PROVOLATILE_IMMUTABLE;
625 else if (strcmp(
str,
"stable") == 0)
626 return PROVOLATILE_STABLE;
627 else if (strcmp(
str,
"volatile") == 0)
628 return PROVOLATILE_VOLATILE;
641 if (strcmp(
str,
"safe") == 0)
642 return PROPARALLEL_SAFE;
643 else if (strcmp(
str,
"unsafe") == 0)
644 return PROPARALLEL_UNSAFE;
645 else if (strcmp(
str,
"restricted") == 0)
646 return PROPARALLEL_RESTRICTED;
650 (
errcode(ERRCODE_SYNTAX_ERROR),
651 errmsg(
"parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE")));
652 return PROPARALLEL_UNSAFE;
666 foreach(l, set_items)
697 argList[0] = INTERNALOID;
702 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
703 errmsg(
"function %s does not exist",
708 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
709 errmsg(
"support function %s must return type %s",
719 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
720 errmsg(
"must be superuser to specify a support function")));
740 bool *security_definer,
751 DefElem *transform_item = NULL;
752 DefElem *windowfunc_item = NULL;
753 DefElem *volatility_item = NULL;
756 DefElem *leakproof_item = NULL;
767 if (strcmp(defel->
defname,
"as") == 0)
773 else if (strcmp(defel->
defname,
"language") == 0)
777 language_item = defel;
779 else if (strcmp(defel->
defname,
"transform") == 0)
783 transform_item = defel;
785 else if (strcmp(defel->
defname,
"window") == 0)
791 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
792 errmsg(
"invalid attribute in procedure definition"),
794 windowfunc_item = defel;
813 elog(
ERROR,
"option \"%s\" not recognized",
822 *transform = transform_item->
arg;
824 *windowfunc_p =
boolVal(windowfunc_item->
arg);
830 *security_definer =
boolVal(security_item->
arg);
840 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
841 errmsg(
"COST must be positive")));
848 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
849 errmsg(
"ROWS must be positive")));
870 List *parameterTypes,
List *inParameterNames,
871 char **prosrc_str_p,
char **probin_str_p,
873 const char *queryString)
875 if (!sql_body_in && !as)
877 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
878 errmsg(
"no function body specified")));
880 if (sql_body_in && as)
882 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
883 errmsg(
"duplicate function body specified")));
885 if (sql_body_in && languageOid != SQLlanguageId)
887 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
888 errmsg(
"inline SQL function body only valid for language SQL")));
890 *sql_body_out = NULL;
892 if (languageOid == ClanguageId)
908 if (strcmp(*prosrc_str_p,
"-") == 0)
912 else if (sql_body_in)
927 if (IsPolymorphicType(pinfo->
argtypes[
i]))
929 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
930 errmsg(
"SQL function with unquoted function body cannot have polymorphic arguments")));
955 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
956 errmsg(
"%s is not yet supported in unquoted SQL function body",
958 transformed_stmts =
lappend(transformed_stmts, q);
974 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
975 errmsg(
"%s is not yet supported in unquoted SQL function body",
979 *sql_body_out = (
Node *) q;
992 *probin_str_p = NULL;
998 *probin_str_p = NULL;
1002 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
1003 errmsg(
"only one AS item needed for language \"%s\"",
1006 if (languageOid == INTERNALlanguageId)
1016 if (strlen(*prosrc_str_p) == 0)
1037 Oid languageValidator;
1038 Node *transformDefElem = NULL;
1043 List *parameterTypes_list =
NIL;
1047 List *inParameterNames_list =
NIL;
1048 List *parameterDefaults;
1049 Oid variadicArgType;
1053 Oid requiredResultType;
1081 isWindowFunc =
false;
1084 isLeakProof =
false;
1085 volatility = PROVOLATILE_VOLATILE;
1090 parallel = PROPARALLEL_UNSAFE;
1096 &as_clause, &language, &transformDefElem,
1097 &isWindowFunc, &volatility,
1098 &isStrict, &security, &isLeakProof,
1099 &proconfig, &procost, &prorows,
1100 &prosupport, ¶llel);
1108 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
1109 errmsg(
"no language specified")));
1116 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1117 errmsg(
"language \"%s\" does not exist", language),
1119 errhint(
"Use CREATE EXTENSION to load the language into the database.") : 0)));
1122 languageOid = languageStruct->oid;
1124 if (languageStruct->lanpltrusted)
1130 NameStr(languageStruct->lanname));
1137 NameStr(languageStruct->lanname));
1140 languageValidator = languageStruct->lanvalidator;
1151 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
1152 errmsg(
"only superuser can define a leakproof function")));
1154 if (transformDefElem)
1165 typeid = elt ? elt :
typeid;
1167 trftypes_list =
lappend_oid(trftypes_list,
typeid);
1168 trfoids_list =
lappend_oid(trfoids_list, transformid);
1181 ¶meterTypes_list,
1185 &inParameterNames_list,
1188 &requiredResultType);
1190 if (
stmt->is_procedure)
1193 prorettype = requiredResultType ? requiredResultType : VOIDOID;
1196 else if (
stmt->returnType)
1200 &prorettype, &returnsSet);
1201 if (
OidIsValid(requiredResultType) && prorettype != requiredResultType)
1203 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
1204 errmsg(
"function result type must be %s because of OUT parameters",
1210 prorettype = requiredResultType;
1216 (
errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
1217 errmsg(
"function result type must be specified")));
1219 prorettype = VOIDOID;
1223 if (trftypes_list !=
NIL)
1231 foreach(lc, trftypes_list)
1242 parameterTypes_list, inParameterNames_list,
1243 &prosrc_str, &probin_str, &prosqlbody,
1254 if (languageOid == INTERNALlanguageId ||
1255 languageOid == ClanguageId)
1267 else if (!returnsSet)
1269 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1270 errmsg(
"ROWS is not applicable when function does not return a set")));
1287 stmt->is_procedure ? PROKIND_PROCEDURE : (isWindowFunc ? PROKIND_WINDOW : PROKIND_FUNCTION),
1326 elog(
ERROR,
"cache lookup failed for function %u", funcOid);
1341 if (prokind == PROKIND_AGGREGATE)
1347 elog(
ERROR,
"cache lookup failed for pg_aggregate tuple for function %u", funcOid);
1371 DefElem *volatility_item = NULL;
1373 DefElem *security_def_item = NULL;
1374 DefElem *leakproof_item = NULL;
1379 DefElem *parallel_item = NULL;
1390 elog(
ERROR,
"cache lookup failed for function %u", funcOid);
1399 if (procForm->prokind == PROKIND_AGGREGATE)
1401 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1402 errmsg(
"\"%s\" is an aggregate function",
1405 is_procedure = (procForm->prokind == PROKIND_PROCEDURE);
1408 foreach(l,
stmt->actions)
1423 ¶llel_item) ==
false)
1427 if (volatility_item)
1430 procForm->proisstrict =
boolVal(strict_item->
arg);
1431 if (security_def_item)
1432 procForm->prosecdef =
boolVal(security_def_item->
arg);
1435 procForm->proleakproof =
boolVal(leakproof_item->
arg);
1436 if (procForm->proleakproof && !
superuser())
1438 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
1439 errmsg(
"only superuser can define a leakproof function")));
1444 if (procForm->procost <= 0)
1446 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1447 errmsg(
"COST must be positive")));
1452 if (procForm->prorows <= 0)
1454 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1455 errmsg(
"ROWS must be positive")));
1456 if (!procForm->proretset)
1458 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1459 errmsg(
"ROWS is not applicable when function does not return a set")));
1470 ProcedureRelationId, procForm->prosupport,
1472 elog(
ERROR,
"could not change support dependency for function %s",
1479 referenced.
classId = ProcedureRelationId;
1485 procForm->prosupport = newsupport;
1494 Datum repl_val[Natts_pg_proc];
1495 bool repl_null[Natts_pg_proc];
1496 bool repl_repl[Natts_pg_proc];
1499 datum =
SysCacheGetAttr(PROCOID, tup, Anum_pg_proc_proconfig, &isnull);
1506 memset(repl_repl,
false,
sizeof(repl_repl));
1507 repl_repl[Anum_pg_proc_proconfig - 1] =
true;
1511 repl_val[Anum_pg_proc_proconfig - 1] = (
Datum) 0;
1512 repl_null[Anum_pg_proc_proconfig - 1] =
true;
1517 repl_null[Anum_pg_proc_proconfig - 1] =
false;
1521 repl_val, repl_null, repl_repl);
1563 if (sourcetyptype == TYPTYPE_PSEUDO)
1565 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1566 errmsg(
"source data type %s is a pseudo-type",
1569 if (targettyptype == TYPTYPE_PSEUDO)
1571 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1572 errmsg(
"target data type %s is a pseudo-type",
1579 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
1580 errmsg(
"must be owner of type %s or type %s",
1593 if (sourcetyptype == TYPTYPE_DOMAIN)
1595 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1596 errmsg(
"cast will be ignored because the source data type is a domain")));
1598 else if (targettyptype == TYPTYPE_DOMAIN)
1600 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1601 errmsg(
"cast will be ignored because the target data type is a domain")));
1604 if (
stmt->func != NULL)
1605 castmethod = COERCION_METHOD_FUNCTION;
1606 else if (
stmt->inout)
1607 castmethod = COERCION_METHOD_INOUT;
1609 castmethod = COERCION_METHOD_BINARY;
1611 if (castmethod == COERCION_METHOD_FUNCTION)
1619 elog(
ERROR,
"cache lookup failed for function %u", funcid);
1622 nargs = procstruct->pronargs;
1623 if (nargs < 1 || nargs > 3)
1625 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1626 errmsg(
"cast function must take one to three arguments")));
1628 procstruct->proargtypes.values[0],
1631 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1632 errmsg(
"argument of cast function must match or be binary-coercible from source data type")));
1633 if (nargs > 1 && procstruct->proargtypes.values[1] != INT4OID)
1635 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1636 errmsg(
"second argument of cast function must be type %s",
1638 if (nargs > 2 && procstruct->proargtypes.values[2] != BOOLOID)
1640 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1641 errmsg(
"third argument of cast function must be type %s",
1647 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1648 errmsg(
"return data type of cast function must match or be binary-coercible to target data type")));
1656 if (procstruct->provolatile == PROVOLATILE_VOLATILE)
1658 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1659 errmsg(
"cast function must not be volatile")));
1661 if (procstruct->prokind != PROKIND_FUNCTION)
1663 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1664 errmsg(
"cast function must be a normal function")));
1665 if (procstruct->proretset)
1667 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1668 errmsg(
"cast function must not return a set")));
1678 if (castmethod == COERCION_METHOD_BINARY)
1693 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
1694 errmsg(
"must be superuser to create a cast WITHOUT FUNCTION")));
1704 if (typ1len != typ2len ||
1705 typ1byval != typ2byval ||
1706 typ1align != typ2align)
1708 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1709 errmsg(
"source and target data types are not physically compatible")));
1725 if (sourcetyptype == TYPTYPE_COMPOSITE ||
1726 targettyptype == TYPTYPE_COMPOSITE)
1728 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1729 errmsg(
"composite data types are not binary-compatible")));
1734 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1735 errmsg(
"array data types are not binary-compatible")));
1737 if (sourcetyptype == TYPTYPE_RANGE ||
1738 targettyptype == TYPTYPE_RANGE ||
1739 sourcetyptype == TYPTYPE_MULTIRANGE ||
1740 targettyptype == TYPTYPE_MULTIRANGE)
1742 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1743 errmsg(
"range data types are not binary-compatible")));
1745 if (sourcetyptype == TYPTYPE_ENUM ||
1746 targettyptype == TYPTYPE_ENUM)
1748 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1749 errmsg(
"enum data types are not binary-compatible")));
1762 if (sourcetyptype == TYPTYPE_DOMAIN ||
1763 targettyptype == TYPTYPE_DOMAIN)
1765 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1766 errmsg(
"domain data types must not be marked binary-compatible")));
1773 if (sourcetypeid == targettypeid && nargs < 2)
1775 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1776 errmsg(
"source data type and target data type are the same")));
1779 switch (
stmt->context)
1782 castcontext = COERCION_CODE_IMPLICIT;
1785 castcontext = COERCION_CODE_ASSIGNMENT;
1789 castcontext = COERCION_CODE_EXPLICIT;
1792 elog(
ERROR,
"unrecognized CoercionContext: %d",
stmt->context);
1797 myself =
CastCreate(sourcetypeid, targettypeid, funcid, incastid, outcastid,
1806 if (procstruct->provolatile == PROVOLATILE_VOLATILE)
1808 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1809 errmsg(
"transform function must not be volatile")));
1810 if (procstruct->prokind != PROKIND_FUNCTION)
1812 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1813 errmsg(
"transform function must be a normal function")));
1814 if (procstruct->proretset)
1816 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1817 errmsg(
"transform function must not return a set")));
1818 if (procstruct->pronargs != 1)
1820 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1821 errmsg(
"transform function must take one argument")));
1822 if (procstruct->proargtypes.values[0] != INTERNALOID)
1824 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1825 errmsg(
"first argument of transform function must be type %s",
1844 bool nulls[Natts_pg_transform] = {0};
1845 bool replaces[Natts_pg_transform] = {0};
1861 if (typtype == TYPTYPE_PSEUDO)
1863 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1864 errmsg(
"data type %s is a pseudo-type",
1867 if (typtype == TYPTYPE_DOMAIN)
1869 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1870 errmsg(
"data type %s is a domain",
1905 elog(
ERROR,
"cache lookup failed for function %u", fromsqlfuncid);
1907 if (procstruct->prorettype != INTERNALOID)
1909 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1910 errmsg(
"return data type of FROM SQL function must be %s",
1931 elog(
ERROR,
"cache lookup failed for function %u", tosqlfuncid);
1933 if (procstruct->prorettype !=
typeid)
1935 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
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",
1967 replaces[Anum_pg_transform_trffromsql - 1] =
true;
1968 replaces[Anum_pg_transform_trftosql - 1] =
true;
1973 transformid = form->oid;
1980 Anum_pg_transform_oid);
2048 (
errcode(ERRCODE_UNDEFINED_OBJECT),
2049 errmsg(
"transform for type %s language \"%s\" does not exist",
2072 (
errcode(ERRCODE_DUPLICATE_FUNCTION),
2073 errmsg(
"function %s already exists in schema \"%s\"",
2091 DefElem *language_item = NULL;
2102 if (strcmp(defel->
defname,
"as") == 0)
2108 else if (strcmp(defel->
defname,
"language") == 0)
2112 language_item = defel;
2115 elog(
ERROR,
"option \"%s\" not recognized",
2123 (
errcode(ERRCODE_SYNTAX_ERROR),
2124 errmsg(
"no inline code specified")));
2130 language =
"plpgsql";
2136 (
errcode(ERRCODE_UNDEFINED_OBJECT),
2137 errmsg(
"language \"%s\" does not exist", language),
2139 errhint(
"Use CREATE EXTENSION to load the language into the database.") : 0)));
2142 codeblock->
langOid = languageStruct->oid;
2144 codeblock->
atomic = atomic;
2146 if (languageStruct->lanpltrusted)
2155 NameStr(languageStruct->lanname));
2162 NameStr(languageStruct->lanname));
2166 laninline = languageStruct->laninline;
2169 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2170 errmsg(
"language \"%s\" does not support inline code execution",
2171 NameStr(languageStruct->lanname))));
2224 fexpr =
stmt->funcexpr;
2234 callcontext->
atomic = atomic;
2247 callcontext->
atomic =
true;
2256 callcontext->
atomic =
true;
2264 (
errcode(ERRCODE_TOO_MANY_ARGUMENTS),
2265 errmsg_plural(
"cannot pass more than %d argument to a procedure",
2266 "cannot pass more than %d arguments to a procedure",
2275 (
Node *) callcontext, NULL);
2296 foreach(lc, fexpr->
args)
2306 fcinfo->args[
i].value =
val;
2307 fcinfo->args[
i].isnull = isnull;
2322 if (fexpr->funcresulttype == VOIDOID)
2326 else if (fexpr->funcresulttype == RECORDOID)
2338 elog(
ERROR,
"procedure returned null record");
2375 elog(
ERROR,
"unexpected result type for procedure: %u",
2376 fexpr->funcresulttype);
2391 fexpr =
stmt->funcexpr;
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 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)
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)
SQLFunctionParseInfo * SQLFunctionParseInfoPtr
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)
Assert(PointerIsAligned(start, uint64))
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)
if(TABLE==NULL||TABLE_index==NULL)
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
bool(* receiveSlot)(TupleTableSlot *slot, DestReceiver *self)
Oid values[FLEXIBLE_ARRAY_MEMBER]
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)