我已经使用以下内容创建了一个聚合函数:
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或聚合函数的实现没有正确返回类型修改值。
答案 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);
}
因此它可以获得并返回其中一个输入值。
如果没有保留类型修饰符,我猜它们永远不会保存在聚合中。