diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2006-05-01 23:22:43 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2006-05-01 23:22:43 +0000 |
commit | a65a49429f1a6722a6be4a9784b4e08fab8ca380 (patch) | |
tree | fc407bfe62a483e5e738654feeb344e58c0f3f58 /src/backend/utils/adt/regproc.c | |
parent | 82a2881c5b230d62bc811a374503625226be02ae (diff) | |
download | postgresql-a65a49429f1a6722a6be4a9784b4e08fab8ca380.tar.gz postgresql-a65a49429f1a6722a6be4a9784b4e08fab8ca380.zip |
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.
Diffstat (limited to 'src/backend/utils/adt/regproc.c')
-rw-r--r-- | src/backend/utils/adt/regproc.c | 25 |
1 files changed, 4 insertions, 21 deletions
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); } |