]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix getTypeIOParam to support type record[].
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 1 Dec 2011 17:44:34 +0000 (12:44 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 1 Dec 2011 17:44:34 +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 e71ac3fb62588d00d1812aa11bf98711cd02c14f..2250e854b9bde792b5697e62296ee095d6f87b89 100644 (file)
@@ -1821,7 +1821,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 77f693c2b14ba19a1c645b1a2984edb491aacb65..5c25e4d31cd75865801c548f330fcc18988853ce 100644 (file)
@@ -577,6 +577,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 c01871de007b0810d21fd8b96f5d545e323946a2..e7c28e8bafd5fbf07997928d7c6cf85b3fce37fb 100644 (file)
@@ -391,6 +391,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)