Hello
>
> The different-numbers-of-arguments bit is what I'm objecting to.
> Just register the function as foo(ANY), foo(ANY,ANY), foo(ANY,ANY,ANY),
> etc, and you're done without breaking anything else.
>
I found simple solution, it uses ANY, but number of necessary ANY
arguments is generated dynamically:
FuncCandidateList
FuncnameGetCandidates(List *names, int nargs)
{
FuncCandidateList resultList = NULL;
char *schemaname;
.... /* anyparams has unlimeted pronargs, we cannot check it */
if (pronargs == 1 && procform->proargtypes.values[0]
== ANYPARAMSOID)
generic_function = true;
/* Ignore if it doesn't match requested argument count */
else if (nargs >= 0 && pronargs != nargs)
continue;
....
/*
* Okay to add it to result list
*/
if (!generic_function)
{
newResult = (FuncCandidateList)
palloc(sizeof(struct
_FuncCandidateList) - sizeof(Oid)
+ pronargs * sizeof(Oid));
newResult->pathpos = pathpos;
newResult->oid = HeapTupleGetOid(proctup);
newResult->nargs = pronargs;
memcpy(newResult->args, procform->proargtypes.values,
pronargs * sizeof(Oid));
newResult->next = resultList;
resultList = newResult;
}
else
{
/* generic function hasn't own params, but we
know numbers and
* we can use ANY type.
*/
int i;
newResult = (FuncCandidateList)
palloc(sizeof(struct
_FuncCandidateList) - sizeof(Oid)
+ nargs * sizeof(Oid));
newResult->pathpos = pathpos;
newResult->oid = HeapTupleGetOid(proctup);
newResult->nargs = nargs;
for (i = 0; i < nargs; i++)
newResult->args[i] = ANYOID;
newResult->next = resultList;
resultList = newResult;
}
It is more simpler than I though and it works. With this technique I
don't need some mentioned restriction.
ANYPARAMS is only syntactic sugar for n x ANY
What do you thing about it, please?
Regards
Pavel Stehule
> > we can use partial unique index, if it is possible - I didn't test it.
>
> It's not --- partial indexes on system catalogs are not supported, and
> pg_proc is certainly one catalog that that restriction will never be
> relaxed for. (How you going to execute a predicate without doing
> function lookups?) I don't believe that the constraint could be
> expressed as a partial index predicate anyway --- how will you say
> that foo(...) and foo(int) conflict, but foo(int) and foo(int,int)
> don't?
>
> regards, tom lane
>
---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend