From a65a49429f1a6722a6be4a9784b4e08fab8ca380 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 1 May 2006 23:22:43 +0000 Subject: Provide a namespace.c function for lookup of an operator with exact input datatypes given, and use this before trying OpernameGetCandidates. This is faster than the old method when there's an exact match, and it does not seem materially slower when there's not. And it definitely makes some of the callers cleaner, because they didn't really want to know about a list of candidates anyway. Per discussion with Atsushi Ogawa. --- src/backend/utils/adt/regproc.c | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) (limited to 'src/backend/utils/adt/regproc.c') diff --git a/src/backend/utils/adt/regproc.c b/src/backend/utils/adt/regproc.c index f5b0e2ab0c7..37bb0d929c3 100644 --- a/src/backend/utils/adt/regproc.c +++ b/src/backend/utils/adt/regproc.c @@ -13,7 +13,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/regproc.c,v 1.97 2006/03/05 15:58:43 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/regproc.c,v 1.98 2006/05/01 23:22:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -598,12 +598,10 @@ Datum regoperatorin(PG_FUNCTION_ARGS) { char *opr_name_or_oid = PG_GETARG_CSTRING(0); - Oid result = InvalidOid; + Oid result; List *names; int nargs; Oid argtypes[FUNC_MAX_ARGS]; - char oprkind; - FuncCandidateList clist; /* '0' ? */ if (strcmp(opr_name_or_oid, "0") == 0) @@ -642,28 +640,13 @@ regoperatorin(PG_FUNCTION_ARGS) errmsg("too many arguments"), errhint("Provide two argument types for operator."))); - if (argtypes[0] == InvalidOid) - oprkind = 'l'; - else if (argtypes[1] == InvalidOid) - oprkind = 'r'; - else - oprkind = 'b'; + result = OpernameGetOprid(names, argtypes[0], argtypes[1]); - clist = OpernameGetCandidates(names, oprkind); - - for (; clist; clist = clist->next) - { - if (memcmp(clist->args, argtypes, 2 * sizeof(Oid)) == 0) - break; - } - - if (clist == NULL) + if (!OidIsValid(result)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_FUNCTION), errmsg("operator does not exist: %s", opr_name_or_oid))); - result = clist->oid; - PG_RETURN_OID(result); } -- cgit v1.2.3