On Sun, Feb 22, 2015 at 12:56 PM, Tom Lane <t...@sss.pgh.pa.us> wrote:

> Well, it's an unimplemented feature anyway.  I poked into it and noticed
> that the equivalent case for arrays works, because that operator is
> "anyarray = anyarray".  enforce_generic_type_consistency() observes that
> we have an unknown literal that's going to be passed to an anyarray
> function argument, so it resolves "anyarray" as the actual array type
> determined from the other anyarray argument position.
>
> There's no corresponding behavior for RECORD, because RECORD is not
> treated as a polymorphic type for this purpose -- in particular, there is
> no built-in assumption that the two arguments passed to record_eq(record,
> record) should be the same record type.  (And, indeed, it looks like
> record_eq goes to some effort to cope with them not being identical;
> this may be essential to make dropped-column cases work desirably.)
>
> Conceivably we could invent an ANYRECORD polymorphic type, extend the
> polymorphic type logic to deal with that, and redefine record_eq as taking
> (anyrecord, anyrecord).  However that'd likely break some scenarios along
> with fixing this one.  It'd require some research to figure out what's
> the least painful fix.  In any case, anything involving a new datatype is
> certainly not going to be a back-patchable bug fix.
>
> Given that it's worked like this pretty much forever, and there have been
> few complaints, it's probably not going to get to the front of anyone's
> to-do list real soon ...
>

Ok.  Thanks for the info.  I like the ANYRECORD idea.

As for the behavior, consider me logging one complaint. :)  The consequence
is that you can't use composite types in a REST interface or any other
string-based interface, unless the POST handler look up the type of all
columns and checks for the special case, to add the explicit cast.  It adds
a lot of overhead that is 99% unnecessary.

Thanks,
Eric

Reply via email to