Re: Lack of RelabelType is causing me pain - Mailing list pgsql-hackers

From Joe Conway
Subject Re: Lack of RelabelType is causing me pain
Date
Msg-id 3FB00251.8090702@joeconway.com
Whole thread Raw
In response to Lack of RelabelType is causing me pain  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: Lack of RelabelType is causing me pain  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Tom Lane wrote:
> Joe, do you recall the reasoning for this code in parse_coerce.c?
> 
>     if (targetTypeId == ANYOID ||
>         targetTypeId == ANYARRAYOID ||
>         targetTypeId == ANYELEMENTOID)
>     {
>         /* assume can_coerce_type verified that implicit coercion is okay */
>         /* NB: we do NOT want a RelabelType here */
>         return node;
>     }

I see this in REL7_3_STABLE
     else if (targetTypeId == ANYOID ||              targetTypeId == ANYARRAYOID)    {    /* assume can_coerce_type
verifiedthat implicit coercion is okay */        /* NB: we do NOT want a RelabelType here */        result = node;
}

This was introduced here:
------------------------------------------
Revision 2.80 / (download) - annotate - [select for diffs] , Thu Aug 22 
00:01:42 2002 UTC (14 months, 2 weeks ago) by tgl
Changes since 2.79: +42 -19 lines
Diff to previous 2.79

Add a bunch of pseudo-types to replace the behavior formerly associated
with OPAQUE, as per recent pghackers discussion.  I still want to do 
some more work on the 'cstring' pseudo-type, but I'm going to commit the 
bulk of the changes now before the tree starts shifting under me ...
------------------------------------------

I think I just followed suit when adding ANYELEMENTOID.

> This is AFAICT the only case where the parser will generate an
> expression tree that is not labeled with the same datatype expected
> by the next-higher operator.  That is precisely the sort of mismatch
> that RelabelType was invented to avoid, and I'm afraid that we have
> broken some things by regressing on the explicit representation of
> type coercions.
> 
> The particular case that is causing me pain right now is that in my
> modified tree with support for cross-datatype index operations, cases
> involving anyarray_ops indexes are blowing up.  That's because the
> visible input type of an indexed comparison isn't matching the declared
> righthand input type of any operator in the opclass.  But RelabelType
> was put in to avoid a number of other problems that I can't recall in
> detail, so I am suspicious that this shortcut breaks other things too.
> 
> I think that the reason we did this was to allow get_fn_expr_argtype()
> to see the unrelabeled datatype of the input to an anyarray/anyelement-
> accepting function.  Couldn't we fix that locally in that function
> instead of breaking a system-wide convention?  I'm thinking that we
> could simply make that function "burrow down" through any RelabelTypes
> for any/anyarray/anyelement.

Does the RelabelType keep a record of what was relabeled (I presume from 
your description above it does)? The original code above predates 
get_fn_expr_argtype() I think, but it sounds like a reasonable approach 
to me.

Joe



pgsql-hackers by date:

Previous
From: Jan Wieck
Date:
Subject: Re: Experimental patch for inter-page delay in VACUUM
Next
From: strk
Date:
Subject: pgsql CVS build failure on Debian GNU/Linux 3.0