Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres描述为用户定义的类型返回类型修改值-1的聚合函数_Postgresql - Fatal编程技术网

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);
}