Ok,  I really want to get the TypeInfo structure more or less &quot;correct&quot; before we release this work.<br><br>After reviewing the documentation regarding the pg_type table,  I think it would be a mistake to &quot;mandate&quot; an interpretation of the table in the new TypeInfo structure,  as my suggested TypeInfo would do.   Rather, I think it would be better to represent (part of) the pg_type table faithfully,  closer to what Bas originally did.   However,  I do think it should be a properly recursive type.<br>

<br>So my new suggestion for the TypeInfo structure is this:<br><br><div>data TypeInfo = TypeInfo </div><div>    { typoid      :: {-# UNPACK #-} !PQ.Oid</div><div>    , typcategory :: {-# UNPACK #-} !Char</div><div>    , typdelim    :: {-# UNPACK #-} !Char</div>
<div>    , typname     :: !ByteString</div><div>    , typelem     :: Maybe TypeInfo</div><div>    }</div><br>Best,<br>Leon<br><br><br><div class="gmail_quote">On Thu, Aug 16, 2012 at 9:22 AM, Jason Dusek <span dir="ltr">&lt;<a href="mailto:jason.dusek@gmail.com" target="_blank">jason.dusek@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">I have integrated Bas&#39;s type cache modifications with a more<br>
robust parser and pretty printer, which handle quoted strings<br>
and nested arrays.<br>
<br>
  <a href="https://github.com/solidsnack/postgresql-simple/tree/arrays" target="_blank">https://github.com/solidsnack/postgresql-simple/tree/arrays</a><br>
<br>
In an earlier email, Leon P. Smith raised some concerns about<br>
the types of arrays of arrays.<br>
<br>
2012-07-30 21:00:34 UTC, <a href="mailto:leon.p.smith@gmail.com" target="_blank">leon.p.smith@gmail.com</a>:<br>
&gt; Now, presumably, postgresql does actually support arrays of<br>
&gt; arrays, but I&#39;m guessing that you need to create the array of<br>
&gt; array of string type before you can actually run this query...<br>
&gt;<br>
&gt; The reason I ask is that Bas van Dijk has done some work on<br>
&gt; adding support for arrays to postgresql-simple. And he&#39;s<br>
&gt; modified the type cache from TypeOID -&gt; IO TypeName to become<br>
&gt; a TypeOID -&gt; IO TypeInfo, where the TypeInfo type is defined<br>
&gt; as follows:<br>
&gt;<br>
&gt; data NamedOid = NamedOid { typoid  :: !PQ.Oid<br>
&gt;                          , typname :: !ByteString<br>
&gt;                          } deriving Show<br>
&gt;<br>
&gt; data TypeInfo = TypeInfo { typ     :: !NamedOid<br>
&gt;                          , typelem :: !(Maybe NamedOid)<br>
&gt;                          } deriving Show<br>
&gt;<br>
&gt; I think this is a perfectly reasonable first attempt, but I<br>
&gt; don&#39;t think it&#39;s correct, because I&#39;m pretty sure that<br>
&gt; PostgreSQL does actually support arrays of arrays if you know<br>
&gt; what you are doing. So I think that TypeInfo needs to look<br>
&gt; something more like<br>
&gt;<br>
&gt; data TypeInfo = Plain { typ     :: !NamedOid }<br>
&gt;               | Array { typ     :: !NamedOid<br>
&gt;                       , typelem :: !TypeInfo }<br>
&gt;                 deriving Show<br>
&gt;<br>
&gt; The real issue here is one dealing with purity and effects: In<br>
&gt; some sense, Bas&#39;s first attempt carries the same information,<br>
&gt; but you might need to do some IO in order to retrieve it.<br>
&gt; (Though this assumes that one can query the type cache<br>
&gt; directly, which is something I should probably add anyway...)<br>
&gt; But the fromField method, which is is the most likely consumer<br>
&gt; of this information, isn&#39;t allowed to do IO. So I think we<br>
&gt; really want to change this type.<br>
<br>
Because a Postgres array is multi-dimensional, it would stand to<br>
reason that the Haskell types [Int4], [[Int4]] and [[[Int4]]]<br>
would all map to _int4 in Postgres. The array parsing code<br>
linked to above relies on that assumption.<br>
<br>
--<br>
Jason Dusek<br>
pgp // solidsnack // C1EBC57DC55144F35460C8DF1FD4C6C1FED18A2B<br>
<br>
_______________________________________________<br>
database-devel mailing list<br>
<a href="mailto:database-devel@haskell.org" target="_blank">database-devel@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/database-devel" target="_blank">http://www.haskell.org/mailman/listinfo/database-devel</a><br>
</blockquote></div><br>