Fix getTypeIOParam to support type record[].
authorTom Lane
Thu, 1 Dec 2011 17:44:28 +0000 (12:44 -0500)
committerTom Lane
Thu, 1 Dec 2011 17:44:28 +0000 (12:44 -0500)
Since record[] uses array_in, it needs to have its element type passed
as typioparam.  In HEAD and 9.1, this fix essentially reverts commit
9bc933b2125a5358722490acbc50889887bf7680, which was a hack that is no
longer needed since domains don't set their typelem anymore.  Before
that, adjust the logic so that only domains are excluded from being
treated like arrays, rather than assuming that only base types should
be included.  Add a regression test to demonstrate the need for this.
Per report from Maxim Boguk.

Back-patch to 8.4, where type record[] was added.

src/backend/utils/cache/lsyscache.c
src/test/regress/expected/polymorphism.out
src/test/regress/sql/polymorphism.sql

index db5b3c75968a1b340b525fd9d230825cdc75c170..b49ca89bd98f19befc004e72967efd8aee778870 100644 (file)
@@ -1758,7 +1758,7 @@ getTypeIOParam(HeapTuple typeTuple)
     * own type OID as parameter.  (As of 8.2, domains must get their own OID
     * even if their base type is an array.)
     */
-   if (typeStruct->typtype == TYPTYPE_BASE && OidIsValid(typeStruct->typelem))
+   if (typeStruct->typtype != TYPTYPE_DOMAIN && OidIsValid(typeStruct->typelem))
        return typeStruct->typelem;
    else
        return HeapTupleGetOid(typeTuple);
index bae04a2719b622cf4e7d3ebaab8c402ecc8aff86..0f81c5c10f88d7ec301a7292270ae434b3968a0a 100644 (file)
@@ -578,6 +578,27 @@ select q2, sql_if(q2 > 0, q2, q2 + 1) from int8_tbl;
  -4567890123456789 | -4567890123456788
 (5 rows)
 
+-- another sort of polymorphic aggregate
+CREATE AGGREGATE array_cat_accum (anyarray)
+(
+    sfunc = array_cat,
+    stype = anyarray,
+    initcond = '{}'
+);
+SELECT array_cat_accum(i)
+FROM (VALUES (ARRAY[1,2]), (ARRAY[3,4])) as t(i);
+ array_cat_accum 
+-----------------
+ {1,2,3,4}
+(1 row)
+
+SELECT array_cat_accum(i)
+FROM (VALUES (ARRAY[row(1,2),row(3,4)]), (ARRAY[row(5,6),row(7,8)])) as t(i);
+          array_cat_accum          
+-----------------------------------
+ {"(1,2)","(3,4)","(5,6)","(7,8)"}
+(1 row)
+
 -- another kind of polymorphic aggregate
 create function add_group(grp anyarray, ad anyelement, size integer)
   returns anyarray
index 2baebe93235109f2846386f7ce455fce06349004..67b3f336ae1c84c179f252b1472756b7ca2009a9 100644 (file)
@@ -392,6 +392,21 @@ select f1, sql_if(f1 > 0, bleat(f1), bleat(f1 + 1)) from int4_tbl;
 
 select q2, sql_if(q2 > 0, q2, q2 + 1) from int8_tbl;
 
+-- another sort of polymorphic aggregate
+
+CREATE AGGREGATE array_cat_accum (anyarray)
+(
+    sfunc = array_cat,
+    stype = anyarray,
+    initcond = '{}'
+);
+
+SELECT array_cat_accum(i)
+FROM (VALUES (ARRAY[1,2]), (ARRAY[3,4])) as t(i);
+
+SELECT array_cat_accum(i)
+FROM (VALUES (ARRAY[row(1,2),row(3,4)]), (ARRAY[row(5,6),row(7,8)])) as t(i);
+
 -- another kind of polymorphic aggregate
 
 create function add_group(grp anyarray, ad anyelement, size integer)