Re: Implicit casts with generic arrays - Mailing list pgsql-hackers
From | Tom Lane |
---|---|
Subject | Re: Implicit casts with generic arrays |
Date | |
Msg-id | 7919.1181163832@sss.pgh.pa.us Whole thread Raw |
In response to | Re: Implicit casts with generic arrays (Alvaro Herrera <alvherre@commandprompt.com>) |
List | pgsql-hackers |
Alvaro Herrera <alvherre@commandprompt.com> writes: > Tom Lane wrote: >> It looks to me like we could eliminate the conflict if we invented a new >> polymorphic pseudotype called "anynonarray" or some such, which would >> act like anyelement *except* it would not match an array. > ... > On the contrary, I would think that it fits nicely to "close the loop" > on the anyarray/anyelement feature set. OK, I hacked this together and it seems to behave at least as reasonably as 8.2 does. "8.3" here means HEAD + anynonarray + capturing concat operators. I used integer as an example of a type for which 8.2 has an implicit cast to text, and point as an example of a type for which it doesn't: Expression 8.3 8.2 text || text text concat text concat text || 'unknown' text concat text concat text || text[] array concat array concat text || non-text array error error text || non-text scalar text concat text concat [1] integer || integer error text concat integer || 'unknown' text concat text concat integer || integer[] array concat array concat integer || non-integer array error error integer || non-integer scalar error text concat [1] point || point error error point || 'unknown' text concat 'array value must start ...' point || point[] array concat array concat point || non-point array error error point || non-point scalar error error text[] || text[] array concat array concat text[] || 'unknown' error error text[] || non-text array error error text[] || non-text scalar error error [1] for types for which 8.2 has an implicit cast to text, else it fails. These are:bigintsmallintintegeroidrealdouble precisionnumericdatetime without time zonetime with time zonetimestamp withouttime zonetimestamp with time zoneinterval (I was interested to find that there were cases where 8.2 would come out with the dreaded "array value must start with "{" or dimension information" error.) I think that the above chart is pretty defensible; the only cases that fail now where they worked before are concatenations where neither side is either text or an unadorned string literal. Frankly, I think this: catany=# select 3 || 0.4; ERROR: operator does not exist: integer || numeric is way preferable to this: regression=# select 3 || 0.4;?column? ----------30.4 (1 row) which is what 8.2 does --- if you want text concatenation you should make at least *some* effort to signal that, like casting one side to text or at least quoting it. Run-together concatenations like catany=# select 'sin(' || 2 || ')';?column? ----------sin(2) (1 row) will work as long as at least one of the first two concatenated items is textual or an unadorned string literal. Barring objections I'll clean this up and commit it. regards, tom lane
pgsql-hackers by date: