Postgresql Postgres描述为用户定义的类型返回类型修改值-1的聚合函数
我创建了一个聚合函数,其中包含以下内容:Postgresql Postgres描述为用户定义的类型返回类型修改值-1的聚合函数,postgresql,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 '$lib
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 = <
);
create table t1 (c1 mychar(20, 1208), c2 char(20));
在我的C代码中,我尝试对以下语句进行描述:
select c1, max(c1), max(c2) from t1 group by c1;
但是,当我尝试使用以下代码从descripe中检索数据时,descripe返回的结果很好:
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或聚合函数的实现没有正确返回类型修改值。我不是100%确定,但我非常确定聚合函数的结果没有类型修改器 我用定义为
numeric(7,2)
的列尝试了您的实验,与您一样,当我查询最大值时,PQfmod
得到了-1
numeric
的max
聚合使用numeric\u larger
定义,其定义如下:
因此,它尽可能简单地获取并返回一个输入值
如果类型修饰符没有保存在那里,我猜它们永远不会保存在聚合中。Thx,用于响应Laurenz。周末我得核实一下。我想我之前看到的是,typmod或size至少对于(var)字符类型是正确的。我还要再检查一下,看看数字会发生什么。
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);
}