Thread: Add Optional Variadic Invocation Explanation to 35.4.5 (xfunc-sql)

Add Optional Variadic Invocation Explanation to 35.4.5 (xfunc-sql)

From
David Johnston
Date:
CREATE FUNCTION varfunc (fixed1 text, VARIADIC vars text[]) [...]

SELECT varfunc('text fixed 1'); -- error: function signature not found; thus the number of supplied variadic values must be >= 1

Describes how to invoke a function defined with VARIADIC with an actual array as input instead of supplying ONE-or-more individual arguments to the call.

AFAICS the only way to get the called function to see an empty array is to call it like:

SELECT varchar('text fixed 1', VARIADIC ARRAY[]::text[])

While this is a logical solution to the problem, given the above knowledge, it would be nice if both points were made explicitly in the documentation in the section linked above.

Existing: "Sometimes it is useful to be able to pass an already-constructed array to a variadic function; this is particularly handy when one variadic function wants to pass on its array parameter to another one."

Change that to:

"Sometimes it is useful to be able to pass an already-constructed array to a variadic function."
<move existing sample to here>
"While this is particularly handy when one variadic function wants to pass on its array parameter to another[/cut] it is required if you wish to invoke the function without passing any optional arguments.  The following example's first attempt to omit the variadic argument fails since the planner looks for a different function signature.  By using the variadic invocation the second attempt succeeds. The alternative is to define an overloaded function without a VARIADIC parameter but with the same non-optional ones."
<better example maybe...but show/explain the two queries above>

Thoughts?  Am I missing something?

David J.

Re: Add Optional Variadic Invocation Explanation to 35.4.5 (xfunc-sql)

From
Tom Lane
Date:
David Johnston <david.g.johnston@gmail.com> writes:
> This:
> http://www.postgresql.org/docs/9.4/static/xfunc-sql.html
> Describes how to invoke a function defined with VARIADIC with an actual
> array as input instead of supplying ONE-or-more individual arguments to the
> call.

Right, and it does specifically say that there must be at least one
actual argument matching the VARIADIC parameter.  Still, an example
to clarify that isn't a bad idea.

> AFAICS the only way to get the called function to see an empty array is to
> call it like:
> SELECT varchar('text fixed 1', VARIADIC ARRAY[]::text[])
> While this is a logical solution to the problem, given the above knowledge,
> it would be nice if both points were made explicitly in the documentation
> in the section linked above.

I did not like your proposed wording, as it seemed to complicate matters
unduly by treating two independent points in the same para.  I went with
just adding a separate para instead:
http://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=699300a146c04e207a8fdec407538cdf5368fde5

            regards, tom lane