Tom Lane <t...@sss.pgh.pa.us> wrote:
 
> regression=# select array[1,2] || 3::myi;
> ERROR:  operator does not exist: integer[] || myi
> 
> In this case, one might expect myi to be automatically downcast to
< int so that it could be matched up with the int array, but that's
> not happening.
 
I guess it should allow that, although for my uses of domains it's
hard to see a reasonable use case for it, so that part doesn't
bother me too much.
 
> regression=# create domain myia as int[];
> CREATE DOMAIN
> regression=# select array[1,2]::myia || 3;
>  ?column? 
> ----------
>  {1,2,3}
> (1 row)
> 
> So we will downcast myia to int[], or at least one might assume
> that's what's happening.  But actually it's worse than that: the
> result of this operation is thought to be myia not int[], because
> myia itself is taken as matching ANYARRAY, and the operator result
> is the same ANYARRAY type.
 
That is actually what I would want and expect.  Let's say I have an
array of attorney bar numbers, and I add one more as a literal. 
While an argument could be made that the integer should be cast to
a bar number before being added to the array, we don't require that
for an assignment to a simple variable in the domain, so it would be
surprising to require a cast here, and even more surprising for the
concatenation to result in an array of primitive integers rather
than a array of attorney bar numbers.
 
> regression=# create domain myia2 as int[]
> check(array_length(value,1) = 2);
> CREATE DOMAIN
 
> regression=# select array[1,2]::myia2 || 3;
>  ?column? 
> ----------
>  {1,2,3}
> (1 row)
 
> So we have a value that's claimed to belong to the domain, but it
> doesn't meet the domain's constraints.
 
Yeah, that's obviously wrong.
 
-Kevin

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to