/* * to_regoperator - converts "oprname(args)" to operator OID * * If the name is not found, we return NULL. */ Datum to_regoperator(PG_FUNCTION_ARGS) { char *opr_name_or_oid = PG_GETARG_CSTRING(0); Oid result; List *names; int nargs; Oid argtypes[FUNC_MAX_ARGS]; /* * Parse the name and arguments, look up potential matches in the current * namespace search list, and scan to see which one exactly matches the * given argument types. (There will not be more than one match.) */ parseNameAndArgTypes(opr_name_or_oid, true, &names, &nargs, argtypes); if (nargs == 1) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_PARAMETER), errmsg("missing argument"), errhint("Use NONE to denote the missing argument of a unary operator."))); if (nargs != 2) ereport(ERROR, (errcode(ERRCODE_TOO_MANY_ARGUMENTS), errmsg("too many arguments"), errhint("Provide two argument types for operator."))); result = OpernameGetOprid(names, argtypes[0], argtypes[1]); if (!OidIsValid(result)) PG_RETURN_NULL(); PG_RETURN_OID(result); }
/* * to_regprocedure - converts "proname(args)" to proc OID * * If the name is not found, we return NULL. */ Datum to_regprocedure(PG_FUNCTION_ARGS) { char *pro_name = PG_GETARG_CSTRING(0); List *names; int nargs; Oid argtypes[FUNC_MAX_ARGS]; FuncCandidateList clist; /* * Parse the name and arguments, look up potential matches in the current * namespace search list, and scan to see which one exactly matches the * given argument types. (There will not be more than one match.) */ parseNameAndArgTypes(pro_name, false, &names, &nargs, argtypes); clist = FuncnameGetCandidates(names, nargs, NIL, false, false, true); for (; clist; clist = clist->next) { if (memcmp(clist->args, argtypes, nargs * sizeof(Oid)) == 0) PG_RETURN_OID(clist->oid); } PG_RETURN_NULL(); }
/* * regoperatorin - converts "oprname(args)" to operator OID * * We also accept a numeric OID, for symmetry with the output routine. * * '0' signifies unknown (OID 0). In all other cases, the input must * match an existing pg_operator entry. */ Datum regoperatorin(PG_FUNCTION_ARGS) { char *opr_name_or_oid = PG_GETARG_CSTRING(0); Oid result; List *names; int nargs; Oid argtypes[FUNC_MAX_ARGS]; /* '0' ? */ if (strcmp(opr_name_or_oid, "0") == 0) PG_RETURN_OID(InvalidOid); /* Numeric OID? */ if (opr_name_or_oid[0] >= '0' && opr_name_or_oid[0] <= '9' && strspn(opr_name_or_oid, "0123456789") == strlen(opr_name_or_oid)) { result = DatumGetObjectId(DirectFunctionCall1(oidin, CStringGetDatum(opr_name_or_oid))); PG_RETURN_OID(result); } /* * Else it's a name and arguments. Parse the name and arguments, look up * potential matches in the current namespace search list, and scan to see * which one exactly matches the given argument types. (There will not be * more than one match.) * * XXX at present, this code will not work in bootstrap mode, hence this * datatype cannot be used for any system column that needs to receive * data during bootstrap. */ parseNameAndArgTypes(opr_name_or_oid, "regoperatorin", true, &names, &nargs, argtypes); if (nargs == 1) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_PARAMETER), errmsg("missing argument"), errhint("Use NONE to denote the missing argument of a unary operator."))); if (nargs != 2) ereport(ERROR, (errcode(ERRCODE_TOO_MANY_ARGUMENTS), errmsg("too many arguments"), errhint("Provide two argument types for operator."))); result = OpernameGetOprid(names, argtypes[0], argtypes[1]); if (!OidIsValid(result)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_FUNCTION), errmsg("operator does not exist: %s", opr_name_or_oid))); PG_RETURN_OID(result); }
/* * regprocedurein - converts "proname(args)" to proc OID * * We also accept a numeric OID, for symmetry with the output routine. * * '-' signifies unknown (OID 0). In all other cases, the input must * match an existing pg_proc entry. */ Datum regprocedurein(PG_FUNCTION_ARGS) { char *pro_name_or_oid = PG_GETARG_CSTRING(0); RegProcedure result = InvalidOid; List *names; int nargs; Oid argtypes[FUNC_MAX_ARGS]; FuncCandidateList clist; /* '-' ? */ if (strcmp(pro_name_or_oid, "-") == 0) PG_RETURN_OID(InvalidOid); /* Numeric OID? */ if (pro_name_or_oid[0] >= '0' && pro_name_or_oid[0] <= '9' && strspn(pro_name_or_oid, "0123456789") == strlen(pro_name_or_oid)) { result = DatumGetObjectId(DirectFunctionCall1(oidin, CStringGetDatum(pro_name_or_oid))); PG_RETURN_OID(result); } /* * Else it's a name and arguments. Parse the name and arguments, look up * potential matches in the current namespace search list, and scan to see * which one exactly matches the given argument types. (There will not be * more than one match.) * * XXX at present, this code will not work in bootstrap mode, hence this * datatype cannot be used for any system column that needs to receive * data during bootstrap. */ parseNameAndArgTypes(pro_name_or_oid, "regprocedurein", false, &names, &nargs, argtypes); clist = FuncnameGetCandidates(names, nargs); for (; clist; clist = clist->next) { if (memcmp(clist->args, argtypes, nargs * sizeof(Oid)) == 0) break; } if (clist == NULL) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_FUNCTION), errmsg("function \"%s\" does not exist", pro_name_or_oid))); result = clist->oid; PG_RETURN_OID(result); }