Postgres描述了用户定义类型的聚合函数返回类型修改值-1

时间:2016-12-07 15:56:18

标签: postgresql

我已经使用以下内容创建了一个聚合函数:

CREATE FUNCTION rtrim(mychar) RETURNS mychar
            AS '$libdir/libmy_pgmod', 'mycharrtrim'
            LANGUAGE C IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION mychar_max( mychar, mychar ) RETURNS mychar
            AS '$libdir/libmy_pgmod', 'mychar_max'
            LANGUAGE C IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION mychar_min( mychar, mychar ) RETURNS mychar
            AS '$libdir/libmy_pgmod', 'mychar_min'
            LANGUAGE C IMMUTABLE STRICT;
CREATE AGGREGATE MAX( lzchar ) ( 
    SFUNC  = mychar_max,
    STYPE  = mychar,
    SORTOP = > 
);
CREATE AGGREGATE MIN( mychar ) ( 
    SFUNC  = mychar_min,
    STYPE  = mychar,
    SORTOP = < 
);

mychar 是使用2个类型修饰符定义的类型。第一个类型修饰符是字符串的长度,第二个是字符串的CCSID,因为我们想要模拟一个zOS字符串。然后我在表格中创建如下:

create table t1 (c1 mychar(20, 1208), c2 char(20));

在我的C代码中,我尝试描述以下语句:

select c1, max(c1), max(c2) from t1 group by c1;

然后,当我尝试使用以下代码从describe中检索数据时,describe返回正常:

char *colName = PQfname( result, hvNum );
int   colTmod = PQfmod( result, hvNum );
int   colSize = PQfsize( result, hvNum );
Oid   oid     = PQftype( result, hvNum );
Oid   tblOid  = PQftable( result, hvNum );

对于第一列,我得到了期望值(colName,colTmod,oid和tblOid)。对于第二列(max(c1)),它返回 max 作为colName(我预期的),它也正确地返回正确的 oid 。但是,对于 colTmod ,它会返回 -1 。在这种情况下,我需要做些什么才能获得正确的colTmod值吗?对于作为本机字符的max(c2)列,它正确返回所有内容,包括 colTmod 24 。必须有一些我做错误导致我的char或聚合函数的实现没有正确返回类型修改值。

1 个答案:

答案 0 :(得分:0)

我不是100%肯定,但我很确定聚合函数的结果没有类型修饰符。

我尝试使用定义为numeric(7,2)的列进行实验,和我一样,当我查询最大值时,PQfmod得到-1。

numeric&#39; max聚合是使用numeric_larger定义的,其定义为:

Datum
numeric_larger(PG_FUNCTION_ARGS)
{
    Numeric     num1 = PG_GETARG_NUMERIC(0);
    Numeric     num2 = PG_GETARG_NUMERIC(1);

    /*
     * Use cmp_numerics so that this will agree with the comparison operators,
     * particularly as regards comparisons involving NaN.
     */
    if (cmp_numerics(num1, num2) > 0)
        PG_RETURN_NUMERIC(num1);
    else
        PG_RETURN_NUMERIC(num2);
}

因此它可以获得并返回其中一个输入值。

如果没有保留类型修饰符,我猜它们永远不会保存在聚合中。