Thread: actualised funcs typmod patch

actualised funcs typmod patch

From
Pavel Stehule
Date:
Hello

actualised version: enhance check inside sql function

Regards
Pavel Stehule

Attachment

Re: actualised funcs typmod patch

From
Alvaro Herrera
Date:
Pavel Stehule escribió:
> Hello
> 
> actualised version: enhance check inside sql function

What is this against?  It has a few suspicious chunks, such as

***************
*** 358,364 ****                funcexpr->funcid = funcid;               funcexpr->funcresulttype = rettype;
!               funcexpr->funcresulttypmod = -1;  // TODO STEHULE               funcexpr->funcretset = retset;
    funcexpr->funcformat = COERCE_EXPLICIT_CALL;               funcexpr->args = fargs;
 
--- 365,371 ----                funcexpr->funcid = funcid;               funcexpr->funcresulttype = rettype;
!               funcexpr->funcresulttypmod = rettypmod;               funcexpr->funcretset = retset;
funcexpr->funcformat= COERCE_EXPLICIT_CALL;               funcexpr->args = fargs;
 



This ended up in ./src/backend/parser/parse_func.c.rej

There are other rejects and I'm not sure if I should fix them (at least
the first couple look trivial, though it's against a bunch of code
that last changed in Aug. last year) or ask for a better version ...

-- 
Alvaro Herrera                                http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support


Re: actualised funcs typmod patch

From
Pavel Stehule
Date:
Hello

I am sorry. I'll send a actualised version today.

Pavel

2009/11/13 Alvaro Herrera <alvherre@commandprompt.com>:
> Pavel Stehule escribió:
>> Hello
>>
>> actualised version: enhance check inside sql function
>
> What is this against?  It has a few suspicious chunks, such as
>
> ***************
> *** 358,364 ****
>
>                funcexpr->funcid = funcid;
>                funcexpr->funcresulttype = rettype;
> !               funcexpr->funcresulttypmod = -1;  // TODO STEHULE
>                funcexpr->funcretset = retset;
>                funcexpr->funcformat = COERCE_EXPLICIT_CALL;
>                funcexpr->args = fargs;
> --- 365,371 ----
>
>                funcexpr->funcid = funcid;
>                funcexpr->funcresulttype = rettype;
> !               funcexpr->funcresulttypmod = rettypmod;
>                funcexpr->funcretset = retset;
>                funcexpr->funcformat = COERCE_EXPLICIT_CALL;
>                funcexpr->args = fargs;
>
>
>
> This ended up in ./src/backend/parser/parse_func.c.rej
>
> There are other rejects and I'm not sure if I should fix them (at least
> the first couple look trivial, though it's against a bunch of code
> that last changed in Aug. last year) or ask for a better version ...
>
> --
> Alvaro Herrera                                http://www.CommandPrompt.com/
> PostgreSQL Replication, Consulting, Custom Development, 24x7 support
>


Re: actualised funcs typmod patch

From
Pavel Stehule
Date:
Hello

I am sending actualised patch. Sorry - I am late, I am ill.

Regards
Pavel Stehule

2009/11/13 Alvaro Herrera <alvherre@commandprompt.com>:
> Pavel Stehule escribió:
>> Hello
>>
>> actualised version: enhance check inside sql function
>
> What is this against?  It has a few suspicious chunks, such as
>
> ***************
> *** 358,364 ****
>
>                funcexpr->funcid = funcid;
>                funcexpr->funcresulttype = rettype;
> !               funcexpr->funcresulttypmod = -1;  // TODO STEHULE
>                funcexpr->funcretset = retset;
>                funcexpr->funcformat = COERCE_EXPLICIT_CALL;
>                funcexpr->args = fargs;
> --- 365,371 ----
>
>                funcexpr->funcid = funcid;
>                funcexpr->funcresulttype = rettype;
> !               funcexpr->funcresulttypmod = rettypmod;
>                funcexpr->funcretset = retset;
>                funcexpr->funcformat = COERCE_EXPLICIT_CALL;
>                funcexpr->args = fargs;
>
>
>
> This ended up in ./src/backend/parser/parse_func.c.rej
>
> There are other rejects and I'm not sure if I should fix them (at least
> the first couple look trivial, though it's against a bunch of code
> that last changed in Aug. last year) or ask for a better version ...
>
> --
> Alvaro Herrera                                http://www.CommandPrompt.com/
> PostgreSQL Replication, Consulting, Custom Development, 24x7 support
>

Attachment

Re: actualised funcs typmod patch

From
Dimitri Fontaine
Date:
Hi,

Pavel Stehule <pavel.stehule@gmail.com> writes:
> I am sending actualised patch.

I've volunteered to review this patch, and before getting to read code
and documentation, then to test it, I have some more general question.

The idea to add support for typmods in function signatures came from the
need to have more than one anyelement at a time in a function, and Pavel
proposed that we spell that anyelement(0) and anyelement(1) e.g.

Is that how we want to solve it?

Now, whatever the answer to that is, I guess the patch still has
interest in itself for being able to have a function f(x numeric(10,4))
for example. Right?

Regards,
-- 
dim


Re: actualised funcs typmod patch

From
Tom Lane
Date:
Dimitri Fontaine <dfontaine@hi-media.com> writes:
> The idea to add support for typmods in function signatures came from the
> need to have more than one anyelement at a time in a function, and Pavel
> proposed that we spell that anyelement(0) and anyelement(1) e.g.

> Is that how we want to solve it?

TBD, really.  It was one possibility.

> Now, whatever the answer to that is, I guess the patch still has
> interest in itself for being able to have a function f(x numeric(10,4))
> for example. Right?

I think there are a large number of definitional details that would have
to be considered to determine exactly what that means or how things
should behave, and I'm quite distressed that Pavel seems to have taken a
code-first-think-later approach to this patch.

The main stumbling block that we've run into in previous discussions is
that it's not tremendously useful to propagate typmod unless you have
some method for determining the appropriate *output* typmod for a
function; and just declaring it with a fixed typmod doesn't cover
anywhere near enough use-cases.  A simple example is that concat'ing
varchar(20) and varchar(22) ought to yield varchar(42) --- in fact, that
is required by SQL spec --- but there's no possible way of determining
that without exceedingly type-specific and function-specific knowledge.
I recall some discussion of attaching parse-time "helper" functions to
every function that would embody such knowledge, but nobody particularly
wanted to follow through on that.

If the only immediate benefit we'd get is multiple anyelement types,
I think we'd be much better advised to just create a few separate
types for that.  Function typmods are a big can of worms and we should
not lock ourselves into a half-baked solution.
        regards, tom lane


Re: actualised funcs typmod patch

From
Pavel Stehule
Date:
2009/11/17 Tom Lane <tgl@sss.pgh.pa.us>:
> Dimitri Fontaine <dfontaine@hi-media.com> writes:
>> The idea to add support for typmods in function signatures came from the
>> need to have more than one anyelement at a time in a function, and Pavel
>> proposed that we spell that anyelement(0) and anyelement(1) e.g.
>
>> Is that how we want to solve it?
>
> TBD, really.  It was one possibility.
>
>> Now, whatever the answer to that is, I guess the patch still has
>> interest in itself for being able to have a function f(x numeric(10,4))
>> for example. Right?
>
> I think there are a large number of definitional details that would have
> to be considered to determine exactly what that means or how things
> should behave, and I'm quite distressed that Pavel seems to have taken a
> code-first-think-later approach to this patch.
>
> The main stumbling block that we've run into in previous discussions is
> that it's not tremendously useful to propagate typmod unless you have
> some method for determining the appropriate *output* typmod for a
> function; and just declaring it with a fixed typmod doesn't cover
> anywhere near enough use-cases.  A simple example is that concat'ing
> varchar(20) and varchar(22) ought to yield varchar(42) --- in fact, that
> is required by SQL spec --- but there's no possible way of determining
> that without exceedingly type-specific and function-specific knowledge.
> I recall some discussion of attaching parse-time "helper" functions to
> every function that would embody such knowledge, but nobody particularly
> wanted to follow through on that.

typmod is applying on input and output too. When I working with
varchar(20) inside some custom function, then using typmod in
definition (input, result) eliminate some useless typmod conversions.
Without typmods for result - non sql functions are blackbox - no body
knows, what will be result. Without typmodes for input function cannot
trust to outside, and have to recheck input. I thing so minimally for
plpgsql programming (typmod support has a benefit), sure, only when
people use typmode based types.

>
> If the only immediate benefit we'd get is multiple anyelement types,
> I think we'd be much better advised to just create a few separate
> types for that.  Function typmods are a big can of worms and we should
> not lock ourselves into a half-baked solution.
>

When I started work on typmod support, my motivation was only a
multiple anyelement types. Now, I thing, so typmodes are more
important than parametrized polymorphic type. Now, PL are dynamic with
minimal static checks. Step by step the static checks are richer. I
could to imagine future warning like "declared varchar(40), but
potential content is varchar(50)". These controls are not possible
without using typmodes in function (explicitly declared).

>                        regards, tom lane
>


Re: actualised funcs typmod patch

From
Tom Lane
Date:
Pavel Stehule <pavel.stehule@gmail.com> writes:
> 2009/11/17 Tom Lane <tgl@sss.pgh.pa.us>:
>> If the only immediate benefit we'd get is multiple anyelement types,
>> I think we'd be much better advised to just create a few separate
>> types for that. Function typmods are a big can of worms and we should
>> not lock ourselves into a half-baked solution.

> When I started work on typmod support, my motivation was only a
> multiple anyelement types. Now, I thing, so typmodes are more
> important than parametrized polymorphic type. Now, PL are dynamic with
> minimal static checks. Step by step the static checks are richer. I
> could to imagine future warning like "declared varchar(40), but
> potential content is varchar(50)". These controls are not possible
> without using typmodes in function (explicitly declared).

Yeah, there are some potential advantages, but that's all the more
reason not to jump into it on the basis of a patch that was cranked
out in a few days with no design discussion.

Aside from the point I already made about needing non-constant output
typmods, I would want to see some serious discussion about exactly how
typmods fit into function signatures in the first place.  Are
f(numeric(2)) and f(numeric(3)) distinct signatures (ie, can you have
both of these functions at the same time)?  If so, what are the
overloading resolution rules that will let us figure out which one to
call?  If not, doesn't that put a rather serious crimp in the idea that
anyelement(0) and anyelement(1) can be used in the desired fashion?

For that matter, given f(numeric(2)), does an actual argument that
is numeric with some other typmod match it at all?  We generally avoid
setting up implicit coercions that are likely or certain to fail, so
you could argue that an actual argument that's numeric(100) should not
be thought to be implicitly coercible to numeric(2).  Again though
the degree of sanity of such things seems pretty type-specific ...
do we need per-type functions to determine coercibility of typmods?
How about a case like bigint -> numeric(2), is that supposed to be
implicitly coercible?  The reason these are issues now is that before
this patch there was never a case of wanting an implicit coercion to
a specific typmod --- only explicit or assignment coercions could
have a target typmod other than -1.  I am not sure that our API for
type coercion functions can even handle the case cleanly.

There are other issues but these are the ones I think we'd need to
resolve before not after putting in function typmods.  It'd be
extremely painful and non-backwards-compatible to change our minds
later about function identity or coercion rules.
        regards, tom lane


Re: actualised funcs typmod patch

From
Pavel Stehule
Date:
2009/11/17 Tom Lane <tgl@sss.pgh.pa.us>:
> Pavel Stehule <pavel.stehule@gmail.com> writes:
>> 2009/11/17 Tom Lane <tgl@sss.pgh.pa.us>:
>>> If the only immediate benefit we'd get is multiple anyelement types,
>>> I think we'd be much better advised to just create a few separate
>>> types for that. Function typmods are a big can of worms and we should
>>> not lock ourselves into a half-baked solution.
>
>> When I started work on typmod support, my motivation was only a
>> multiple anyelement types. Now, I thing, so typmodes are more
>> important than parametrized polymorphic type. Now, PL are dynamic with
>> minimal static checks. Step by step the static checks are richer. I
>> could to imagine future warning like "declared varchar(40), but
>> potential content is varchar(50)". These controls are not possible
>> without using typmodes in function (explicitly declared).
>
> Yeah, there are some potential advantages, but that's all the more
> reason not to jump into it on the basis of a patch that was cranked
> out in a few days with no design discussion.

I sent a proposal. Nobody replayed. But I invite any discussion.

>
> Aside from the point I already made about needing non-constant output
> typmods, I would want to see some serious discussion about exactly how
> typmods fit into function signatures in the first place.  Are
> f(numeric(2)) and f(numeric(3)) distinct signatures (ie, can you have
> both of these functions at the same time)?  If so, what are the
> overloading resolution rules that will let us figure out which one to
> call?  If not, doesn't that put a rather serious crimp in the idea that
> anyelement(0) and anyelement(1) can be used in the desired fashion?
>

a) I take typmod of argument similarly like name. It cannot be
altered, and it isn't used as part of function's signature. These
rules are similar like argname - from same reasons. So there cannot
exists functions f(numeric(2)) and f(numeric(3)) in same time.

b) polymorphic types are other - and are differently processed - now
(and in future). anyelement(0) and enyelement(1) dosn't mean so A0 is
different than A1 (it's my idea, should be different). It's mean, so
A0 should be processed independently on A1. Basically - multiple
enyelement type hasn't any bigger benefit to current situation. We
have "any". The big limit of "any" type is hard specification of
return type. I understand why and I would to create new tool for
arounding this limit.So I can to prepare a polymorphic signature:

FUNCTION foo(A0,A0, A1, A0, A1, ...) RETURNS A1,
FUNCTION foo(IN A0, IN A1, IN A2) RETURNS table(A1, A2)

I don't see an sense of parametrized types for input, for me - the
possibility better to specify result type(s) of polymorphic functions
is important. Sure - this feature should be implemented via real
types, - maybe via domains - or via typmode. We should to have two any
views on parametrised polymorphic types: a) A0, A1 are different
types, b) A0 means use real type on first position, A1 - use real type
on second position. I am inclined to b. For b. typmod is native.

> For that matter, given f(numeric(2)), does an actual argument that
> is numeric with some other typmod match it at all?  We generally avoid
> setting up implicit coercions that are likely or certain to fail, so
> you could argue that an actual argument that's numeric(100) should not
> be thought to be implicitly coercible to numeric(2).  Again though
> the degree of sanity of such things seems pretty type-specific ...
> do we need per-type functions to determine coercibility of typmods?
> How about a case like bigint -> numeric(2), is that supposed to be
> implicitly coercible?  The reason these are issues now is that before
> this patch there was never a case of wanting an implicit coercion to
> a specific typmod --- only explicit or assignment coercions could
> have a target typmod other than -1.  I am not sure that our API for
> type coercion functions can even handle the case cleanly.
>

Look to proposed code, please. These situation are solved (if I
understand well) and tested in regress tests.


> There are other issues but these are the ones I think we'd need to
> resolve before not after putting in function typmods.  It'd be
> extremely painful and non-backwards-compatible to change our minds
> later about function identity or coercion rules.
>

I am sure, so this patch cannot break any current code.

Why - current pg_dump ignore typmods in function signature - so older
code use -1 as typmod for function arguments/result everywhere, on 8.4
and older databases could not be stored typmod in pg_proc, so these
changes, cannot have impact on older code.

regards
Pavel Stehule


>                        regards, tom lane
>


Re: actualised funcs typmod patch

From
Tom Lane
Date:
Pavel Stehule <pavel.stehule@gmail.com> writes:
> 2009/11/17 Tom Lane <tgl@sss.pgh.pa.us>:
>> There are other issues but these are the ones I think we'd need to
>> resolve before not after putting in function typmods.  It'd be
>> extremely painful and non-backwards-compatible to change our minds
>> later about function identity or coercion rules.

> I am sure, so this patch cannot break any current code.

My point is that if we release 8.5 with these semantics (which as far
as I can tell were not designed, but just fell out of what made for the
shortest patch) then we'll be stuck with them thereafter.
        regards, tom lane


Re: actualised funcs typmod patch

From
Pavel Stehule
Date:
2009/11/17 Tom Lane <tgl@sss.pgh.pa.us>:
> Pavel Stehule <pavel.stehule@gmail.com> writes:
>> 2009/11/17 Tom Lane <tgl@sss.pgh.pa.us>:
>>> There are other issues but these are the ones I think we'd need to
>>> resolve before not after putting in function typmods.  It'd be
>>> extremely painful and non-backwards-compatible to change our minds
>>> later about function identity or coercion rules.
>
>> I am sure, so this patch cannot break any current code.
>
> My point is that if we release 8.5 with these semantics (which as far
> as I can tell were not designed, but just fell out of what made for the
> shortest patch) then we'll be stuck with them thereafter.

We could to talk about it now. We are not hurry. But I would to see
some progress in this area in next two months. This patch is simple
and doesn't create any new rules or doesn't change behave. Simply
store explicitly defined typmod and use it. Nothing more. If you
thing, so this is poor or problematic - please, show samples and use
cases.

Best regards
Pavel Stehule

>
>                        regards, tom lane
>


Re: actualised funcs typmod patch

From
Tom Lane
Date:
Pavel Stehule <pavel.stehule@gmail.com> writes:
> 2009/11/17 Tom Lane <tgl@sss.pgh.pa.us>:
>> My point is that if we release 8.5 with these semantics (which as far
>> as I can tell were not designed, but just fell out of what made for the
>> shortest patch) then we'll be stuck with them thereafter.

> We could to talk about it now. We are not hurry. But I would to see
> some progress in this area in next two months. This patch is simple
> and doesn't create any new rules or doesn't change behave.

What do you mean it doesn't change the behavior?  It establishes a
specific set of behaviors for functions with non-default typmods in
their arguments.  If we just apply whatever was the easiest thing to
implement, without any discussion, we are very likely to regret it
later.

It might be that what you've done is all fine, but I'd like some
discussion and consensus on the issues.  Submitting an entirely
documentation-free patch is not the way to establish consensus.
        regards, tom lane


Re: actualised funcs typmod patch

From
Pavel Stehule
Date:
2009/11/17 Tom Lane <tgl@sss.pgh.pa.us>:
> Pavel Stehule <pavel.stehule@gmail.com> writes:
>> 2009/11/17 Tom Lane <tgl@sss.pgh.pa.us>:
>>> My point is that if we release 8.5 with these semantics (which as far
>>> as I can tell were not designed, but just fell out of what made for the
>>> shortest patch) then we'll be stuck with them thereafter.
>
>> We could to talk about it now. We are not hurry. But I would to see
>> some progress in this area in next two months. This patch is simple
>> and doesn't create any new rules or doesn't change behave.
>
> What do you mean it doesn't change the behavior?  It establishes a
> specific set of behaviors for functions with non-default typmods in
> their arguments.  If we just apply whatever was the easiest thing to
> implement, without any discussion, we are very likely to regret it
> later.

sorry, it's problem in my english - too simply language. This cannot
change an behave of older applications. Sure - if somebody use
explicit typmod in CREATE FUNCTION statement, then he get different
behave. But he have to do it explicitly in 8.5. It is only main
opinion - I thing, so nobody can expect surprise. In plpgsql the
behave is practically same. The difference is one - neighbourhood has
more informations about function interface.

one positive point. It fixes one small bug:

postgres=# create or replace function foo(a varchar(3))
returns varchar as $$
begin a := 'abcdef'; return a;
end;
$$ language plpgsql;
CREATE FUNCTION
postgres=# select foo('omega'); foo
────────abcdef
(1 row)

>
> It might be that what you've done is all fine, but I'd like some
> discussion and consensus on the issues.  Submitting an entirely
> documentation-free patch is not the way to establish consensus.
>

yes, I am sorry. I hope, so there will be some people who help with
creating documentation. What I know, it's need:

* drop notices about dropping typmod in CREATE FUNCTION statement
* enhancing documentation about pg_proc
* add note to ALTER FUNCTION about impossibility to change typmod -
the reason is same like impossibility to change defaults or names.

The new behave should be transparent for user.

Regards
Pavel Stehule
>                        regards, tom lane
>


Re: actualised funcs typmod patch

From
"Kevin Grittner"
Date:
Pavel Stehule <pavel.stehule@gmail.com> wrote:
> sorry, it's problem in my english
In hopes that it may help overcome the language barrier if someone
restates the issue in different words, I'll echo Tom's concerns, which
I share.
> This cannot change an behave of older applications.
Agreed.  That's not the problem.
> if somebody use explicit typmod in CREATE FUNCTION statement, then
> he get different behave. But he have to do it explicitly in 8.5.
The problem here is that we are then committed to supporting that
behavior forever.  There are many different options for what behavior
could and should be supported for this syntax, and we don't want to
get locked in to one of those options by happenstance.  We want the
options to be discussed by the community prior to getting locked in to
something.  It would be unusual for one individual to pick a direction
for something like this and to come up with a decision which is as
good, in the long run, as consensus coming out of the synergy of group
discussion could generate.
-Kevin


Re: actualised funcs typmod patch

From
Pavel Stehule
Date:
2009/11/17 Kevin Grittner <Kevin.Grittner@wicourts.gov>:
> Pavel Stehule <pavel.stehule@gmail.com> wrote:
>
>> sorry, it's problem in my english
>
> In hopes that it may help overcome the language barrier if someone
> restates the issue in different words, I'll echo Tom's concerns, which
> I share.
>
>> This cannot change an behave of older applications.
>
> Agreed.  That's not the problem.
>
>> if somebody use explicit typmod in CREATE FUNCTION statement, then
>> he get different behave. But he have to do it explicitly in 8.5.
>
> The problem here is that we are then committed to supporting that
> behavior forever.  There are many different options for what behavior
> could and should be supported for this syntax, and we don't want to
> get locked in to one of those options by happenstance.  We want the
> options to be discussed by the community prior to getting locked in to
> something.  It would be unusual for one individual to pick a direction
> for something like this and to come up with a decision which is as
> good, in the long run, as consensus coming out of the synergy of group
> discussion could generate.

I understand it well and I invite any discussion about this topic
(additing typmod to function's interface). So please, check it, test
it, write notes.

Pavel

>
> -Kevin
>


Re: actualised funcs typmod patch

From
Dimitri Fontaine
Date:
Le 17 nov. 2009 à 20:33, Tom Lane a écrit :
>> We could to talk about it now. We are not hurry. But I would to see
>> some progress in this area in next two months. This patch is simple
>> and doesn't create any new rules or doesn't change behave.
>
> What do you mean it doesn't change the behavior?  It establishes a
> specific set of behaviors for functions with non-default typmods in
> their arguments.  If we just apply whatever was the easiest thing to
> implement, without any discussion, we are very likely to regret it
> later.
>
> It might be that what you've done is all fine, but I'd like some
> discussion and consensus on the issues.  Submitting an entirely
> documentation-free patch is not the way to establish consensus.

I'll try to help there, it's not really a review any more, but still it seems needed. Here's what I gather the specs of
Pavel'swork are by quick-reading through his patch: 
         /*
+          * Don't allow change of input typmodes. Any change should break
+          * stored casts in prepared plans.
+          */

The return type now can have a non -1 typmod given.

[implementation details of parameterTypmodes and allParameterTypmodes left out, not well understood yet, does seem to
bedetails rather than spec level things] 

+         if (rettypmod != resttypmod && rettypmod != -1)
+             ereport(ERROR,
+                     (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
+              errmsg("return type mismatch in function declared to return %s",
+                     format_type_with_typemod(rettype, rettypmod)),
+                      errdetail("Actual return type is %s.",
+                                format_type_with_typemod(restype, resttypmod))));

So you need to return a decorated value I guess, or assign it to a retval which is of the right type, including typmod.
Declaringa retval text to handle a RETURNS varchar(15) won't do it. 


+         /* when typmodes are different, then foerce coercion too */
+         force_coerce = declared_typmod != -1 && declared_typmod != actual_typmod;

So if you declare typmods they are NOT part of the polymorphism (also per comment upthread) but you cannot change them
andthere's automatic coercion when only the typmod mismatches. I think that's what Tom wanted to avoid doing (because
itbreaks existing code assumptions and typmod coercion is not well defined). 

Here are some tests showing either the coercion of the argument (and failures to do it) or the return type typmod
invalidity:
+ ERROR:  cannot change parameter typmod of existing function

+ select typmodtest('a','bbbb');   -- outside plpgsql
+ ERROR:  value too long for type character varying(3)

+ select typmodtest('aaaa','bbb'); -- return value
+ ERROR:  value too long for type character varying(6)
+ CONTEXT:  PL/pgSQL function "typmodtest" while casting return value to function's return type


Then a great deal of changes that makes me cry in favor of having something human friendly around internal catalogs
representation,all this BKI stuff IIUC. 

So the bulk of it is supporting return typemod declaration. This expands to OUT types, which can be cool:

+ create or replace function typmodtest(out a numeric(5,2),out b numeric(5,2), out c numeric(5,2))


Hope this helps,
--
dim

PS: about the more than one anyelement type support in functions, I'd rather have a nice SQLish syntax around it. My
proposalwas sth like this: 

CREATE FUNCTION foo(a anyelement x, b anyelement x, c anyelement y)RETURNS anyelement y[]
AS $$
...
$$;

Re: actualised funcs typmod patch

From
Pavel Stehule
Date:
2009/11/17 Dimitri Fontaine <dfontaine@hi-media.com>:
> Le 17 nov. 2009 à 20:33, Tom Lane a écrit :
>>> We could to talk about it now. We are not hurry. But I would to see
>>> some progress in this area in next two months. This patch is simple
>>> and doesn't create any new rules or doesn't change behave.
>>
>> What do you mean it doesn't change the behavior?  It establishes a
>> specific set of behaviors for functions with non-default typmods in
>> their arguments.  If we just apply whatever was the easiest thing to
>> implement, without any discussion, we are very likely to regret it
>> later.
>>
>> It might be that what you've done is all fine, but I'd like some
>> discussion and consensus on the issues.  Submitting an entirely
>> documentation-free patch is not the way to establish consensus.
>
> I'll try to help there, it's not really a review any more, but still it seems needed. Here's what I gather the specs
ofPavel's work are by quick-reading through his patch: 
>
>                /*
> +                * Don't allow change of input typmodes. Any change should break
> +                * stored casts in prepared plans.
> +                */
>
> The return type now can have a non -1 typmod given.
>
> [implementation details of parameterTypmodes and allParameterTypmodes left out, not well understood yet, does seem to
bedetails rather than spec level things] 
>
> +               if (rettypmod != resttypmod && rettypmod != -1)
> +                       ereport(ERROR,
> +                                       (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
> +                        errmsg("return type mismatch in function declared to return %s",
> +                                       format_type_with_typemod(rettype, rettypmod)),
> +                                        errdetail("Actual return type is %s.",
> +                                                          format_type_with_typemod(restype, resttypmod))));
>
> So you need to return a decorated value I guess, or assign it to a retval which is of the right type, including
typmod.Declaring a retval text to handle a RETURNS varchar(15) won't do it. 
>
>
> +               /* when typmodes are different, then foerce coercion too */
> +               force_coerce = declared_typmod != -1 && declared_typmod != actual_typmod;
>
> So if you declare typmods they are NOT part of the polymorphism (also per comment upthread) but you cannot change
themand there's automatic coercion when only the typmod mismatches. I think that's what Tom wanted to avoid doing
(becauseit breaks existing code assumptions and typmod coercion is not well defined). 
>
> Here are some tests showing either the coercion of the argument (and failures to do it) or the return type typmod
invalidity:
> + ERROR:  cannot change parameter typmod of existing function
>
> + select typmodtest('a','bbbb');   -- outside plpgsql
> + ERROR:  value too long for type character varying(3)
>
> + select typmodtest('aaaa','bbb'); -- return value
> + ERROR:  value too long for type character varying(6)
> + CONTEXT:  PL/pgSQL function "typmodtest" while casting return value to function's return type
>
>
> Then a great deal of changes that makes me cry in favor of having something human friendly around internal catalogs
representation,all this BKI stuff IIUC. 
>
> So the bulk of it is supporting return typemod declaration. This expands to OUT types, which can be cool:
>
> + create or replace function typmodtest(out a numeric(5,2),out b numeric(5,2), out c numeric(5,2))
>
>
> Hope this helps,

Thank you very much

> --
> dim
>
> PS: about the more than one anyelement type support in functions, I'd rather have a nice SQLish syntax around it. My
proposalwas sth like this: 
>
> CREATE FUNCTION foo(a anyelement x, b anyelement x, c anyelement y)
>  RETURNS anyelement y[]
> AS $$
> ...
> $$;

I would to wait  with discussion about syntax. I am expecting similar
battle like about named parameters and I thing, so this can wait. But
I am sure, so We return to this and others ideas.

Regards
Pavel