]> granicus.if.org Git - postgresql/commitdiff
Fix getTypeIOParam to support type record[].
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 1 Dec 2011 17:44:16 +0000 (12:44 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 1 Dec 2011 17:44:16 +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 ceca0e3ede0f1b5584ae290b4cb08cd369d8bd10..cb341b8db679382c3ab8de31ff7a0bb57bc8dc50 100644 (file)
@@ -1890,10 +1890,9 @@ getTypeIOParam(HeapTuple typeTuple)
 
        /*
         * Array types get their typelem as parameter; everybody else gets their
-        * own type OID as parameter.  (As of 8.2, domains must get their own OID
-        * even if their base type is an array.)
+        * own type OID as parameter.
         */
-       if (typeStruct->typtype == TYPTYPE_BASE && OidIsValid(typeStruct->typelem))
+       if (OidIsValid(typeStruct->typelem))
                return typeStruct->typelem;
        else
                return HeapTupleGetOid(typeTuple);
index 4d1fc2beb04e81cf913a7438995b579056b0980b..cb3d756290cf1157141c29d2657876a05a5014d4 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 50e6905d4cac3d663f03043c04eb35741c84fbb0..3d8dd1e55485d7f57ebb73017f8787e76bd4a5ad 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)