]> granicus.if.org Git - postgresql/commitdiff
Allow implicit cast from any named composite type to RECORD. At the
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 5 May 2005 00:19:47 +0000 (00:19 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 5 May 2005 00:19:47 +0000 (00:19 +0000)
moment this has no particular use except to allow table rows to be
passed to record_out(), but that case seems to be useful in itself
per recent example from Elein.  Further down the road we could look
at letting PL functions be declared to accept RECORD parameters.

src/backend/parser/parse_coerce.c

index 32455785a468d75b36431f33ff2d21d2b074e81b..287e496570bc280e429c5733048c684b3c21ed8a 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.127 2005/03/29 00:17:04 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.128 2005/05/05 00:19:47 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -318,6 +318,13 @@ coerce_type(ParseState *pstate, Node *node,
                return coerce_record_to_complex(pstate, node, targetTypeId,
                                                                                ccontext, cformat);
        }
+       if (targetTypeId == RECORDOID &&
+               ISCOMPLEX(inputTypeId))
+       {
+               /* Coerce a specific complex type to RECORD */
+               /* NB: we do NOT want a RelabelType here */
+               return node;
+       }
        if (typeInheritsFrom(inputTypeId, targetTypeId))
        {
                /*
@@ -405,6 +412,13 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *target_typeids,
                        ISCOMPLEX(targetTypeId))
                        continue;
 
+               /*
+                * If input is a composite type and target is RECORD, accept
+                */
+               if (targetTypeId == RECORDOID &&
+                       ISCOMPLEX(inputTypeId))
+                       continue;
+
                /*
                 * If input is a class type that inherits from target, accept
                 */