Right, I have seen the array types in the catalog,  so this much I understand.   (Though again, thanks for pointing out some of the subtleties here.)   But the question was whether or not it was possible to add array types to the catalog,  to store other array types for example. <div>
<br></div><div>The answer appears to be yes,  assuming I read this page correctly:</div><div><br></div><div><a href="http://www.postgresql.org/docs/9.1/interactive/sql-createtype.html">http://www.postgresql.org/docs/9.1/interactive/sql-createtype.html</a></div>
<div><br></div><div>Though doing so is sounds like it&#39;s a little involved.   (i.e.  more involved than something simple like &quot;CREATE ARRAY TYPE FOR int2vector[];&quot; which is kind of what I was hoping might exist... but I&#39;m not too upset that it doesn&#39;t either.)</div>
<div><br></div><div>Also, regarding the subtleties,  as far as postgresql-simple&#39;s code is concerned,  we really only care about subtleties of the format that PostgreSQL returns to us.   Though the syntactic subtleties may be of interest to users of postgresql-simple,  so it may be worthwhile putting some of them in the documentation. </div>
<div><br></div><div>Best,</div><div>Leon</div><div><br><br><div class="gmail_quote">On Tue, Jul 31, 2012 at 12:19 AM, Joey Adams <span dir="ltr">&lt;<a href="mailto:joeyadams3.14159@gmail.com" target="_blank">joeyadams3.14159@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On Mon, Jul 30, 2012 at 9:34 PM, Leon Smith &lt;<a href="mailto:leon.p.smith@gmail.com">leon.p.smith@gmail.com</a>&gt; wrote:<br>

&gt; So can the types that can be array elements be extended in any way,  or are<br>
&gt; these types set in stone? (without modifying the PostgreSQL source itself,<br>
&gt; of course...)    And if the array elements are set,  does 9.2 support arrays<br>
&gt; of range types?<br>
<br>
</div>(The following is tested with PostgreSQL 8.4.11)<br>
<br>
Take a look in the system catalog:<br>
<br>
&gt; SELECT oid, typname, typcategory, typarray FROM pg_type;<br>
  oid   |              typname              | typcategory | typarray<br>
--------+-----------------------------------+-------------+----------<br>
     16 | bool                              | B           |     1000<br>
     17 | bytea                             | U           |     1001<br>
     18 | char                              | S           |     1002<br>
     19 | name                              | S           |     1003<br>
     20 | int8                              | N           |     1016<br>
     21 | int2                              | N           |     1005<br>
     22 | int2vector                        | A           |     1006<br>
     23 | int4                              | N           |     1007<br>
--- snip ---<br>
   1000 | _bool                             | A           |        0<br>
   1001 | _bytea                            | A           |        0<br>
   1002 | _char                             | A           |        0<br>
   1003 | _name                             | A           |        0<br>
   1005 | _int2                             | A           |        0<br>
   1006 | _int2vector                       | A           |        0<br>
   1007 | _int4                             | A           |        0<br>
--- snip ---<br>
<br>
Every type has a corresponding array type.  When a new type is<br>
created, a corresponding array type is also created in pg_type.<br>
Tables are types, too, and have corresponding array types.<br>
<br>
It appears int2vector and oidvector are regular value types, but<br>
overload the ARRAY[] notation and try to act like arrays.  Read on for<br>
more details.<br>
<br>
Apparently, int2vector, which is an array-like type, has a<br>
corresponding type _int2vector.  This means you can have an array of<br>
int2vectors:<br>
<br>
    &gt; SELECT &#39;{1 2,3 4 5,6 7 8 9}&#39;::int2vector[];<br>
            int2vector<br>
    ---------------------------<br>
     {&quot;1 2&quot;,&quot;3 4 5&quot;,&quot;6 7 8 9&quot;}<br>
<br>
Notice that each int2vector is independent; no dimension constraining<br>
is happening.  However, the ARRAY syntax appears to be overloaded for<br>
int2vector:<br>
<br>
    &gt; SELECT ARRAY[1,2,3] :: int2vector;<br>
     array<br>
    -------<br>
     1 2 3<br>
    (1 row)<br>
<br>
But notice the following:<br>
<br>
    &gt; SELECT ARRAY[&#39;1 2&#39;, &#39;3 4 5&#39;, &#39;6 7 8&#39;]::int2vector[];<br>
              array<br>
    -------------------------<br>
     {&quot;1 2&quot;,&quot;3 4 5&quot;,&quot;6 7 8&quot;}<br>
    (1 row)<br>
<br>
    &gt; SELECT ARRAY[&#39;23 45&#39; :: int2vector, &#39;67 89&#39; :: int2vector];<br>
     array<br>
    -------<br>
     1 0<br>
    (1 row)<br>
<br>
The first example works as expected (under our assumption that<br>
int2vector is a regular type and not an array type), but the last<br>
example yields<br>
the wrong type (int2vector instead of int2vector[]) and produces<br>
garbage.  This appears to be the case even with recent Postgres.<br>
<br>
If you want to support an array of int2vectors, leave off the<br>
signatures to work around the bug described above.<br>
<span class="HOEnZb"><font color="#888888"><br>
-Joey<br>
</font></span></blockquote></div><br></div>