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

Reply via email to