In RowDescription messages, report columns of domain datatypes as having
authorTom Lane
Tue, 13 May 2003 18:39:50 +0000 (18:39 +0000)
committerTom Lane
Tue, 13 May 2003 18:39:50 +0000 (18:39 +0000)
the type OID and typmod of the underlying base type.  Per discussions
a few weeks ago with Andreas Pflug and others.  Note that this behavioral
change affects both old- and new-protocol clients.

src/backend/access/common/printtup.c

index 6ad53ddb3ca2fdea5eb4338484fd8bbd2d3a6363..1d2c6cc4f0a4bb272bfecfcf6c604363ab9d26a6 100644 (file)
@@ -9,7 +9,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/access/common/printtup.c,v 1.72 2003/05/09 18:08:48 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/access/common/printtup.c,v 1.73 2003/05/13 18:39:50 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -181,6 +181,10 @@ SendRowDescriptionMessage(TupleDesc typeinfo, List *targetlist, int16 *formats)
 
    for (i = 0; i < natts; ++i)
    {
+       Oid     atttypid = attrs[i]->atttypid;
+       int32   atttypmod = attrs[i]->atttypmod;
+       Oid     basetype;
+
        pq_sendstring(&buf, NameStr(attrs[i]->attname));
        /* column ID info appears in protocol 3.0 and up */
        if (proto >= 3)
@@ -204,14 +208,18 @@ SendRowDescriptionMessage(TupleDesc typeinfo, List *targetlist, int16 *formats)
                pq_sendint(&buf, 0, 2);
            }
        }
-       pq_sendint(&buf, (int) attrs[i]->atttypid,
-                  sizeof(attrs[i]->atttypid));
-       pq_sendint(&buf, attrs[i]->attlen,
-                  sizeof(attrs[i]->attlen));
+       /* If column is a domain, send the base type and typmod instead */
+       basetype = getBaseType(atttypid);
+       if (basetype != atttypid)
+       {
+           atttypmod = get_typtypmod(atttypid);
+           atttypid = basetype;
+       }
+       pq_sendint(&buf, (int) atttypid, sizeof(atttypid));
+       pq_sendint(&buf, attrs[i]->attlen, sizeof(attrs[i]->attlen));
        /* typmod appears in protocol 2.0 and up */
        if (proto >= 2)
-           pq_sendint(&buf, attrs[i]->atttypmod,
-                      sizeof(attrs[i]->atttypmod));
+           pq_sendint(&buf, atttypmod, sizeof(atttypmod));
        /* format info appears in protocol 3.0 and up */
        if (proto >= 3)
        {