postgres.git / summary / log / commit / refs

commit    65d9aedb1b0e2c160cee3ef6cddb284b092f542e
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Thu Dec 01 17:44:16 2011 +0000
First released in: 9.2.0, 8.4.10, 9.0.6, 9.1.2

    Fix getTypeIOParam to support type record[].
    
    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 | 5 ++--- src/test/regress/expected/polymorphism.out | 21 +++++++++++++++++++++ src/test/regress/sql/polymorphism.sql | 15 +++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index ceca0e3ede0..cb341b8db67 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -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); diff --git a/src/test/regress/expected/polymorphism.out b/src/test/regress/expected/polymorphism.out index 4d1fc2beb04..cb3d756290c 100644 --- a/src/test/regress/expected/polymorphism.out +++ b/src/test/regress/expected/polymorphism.out @@ -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 diff --git a/src/test/regress/sql/polymorphism.sql b/src/test/regress/sql/polymorphism.sql index 50e6905d4ca..3d8dd1e5548 100644 --- a/src/test/regress/sql/polymorphism.sql +++ b/src/test/regress/sql/polymorphism.sql @@ -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) [parent: 1be6f9379287]