【发布时间】:2016-12-12 18:24:14
【问题描述】:
我创建了一个聚合函数,包含以下内容:
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;
但是,当我尝试使用以下代码从描述中检索数据时,描述返回正常:
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 或聚合函数的实现没有正确返回类型修改值。
【问题讨论】:
标签: postgresql