我的聚合不会在postgresql上保存状态

时间:2013-10-29 12:32:22

标签: postgresql plpgsql

我正在尝试对聚合函数进行编码,以便在存储为bytea的表的列之间执行bit_和beet。 用于执行此操作的函数使用二进制字符串的长度对bytea进行子串 %8(字节长度)并返回bit和satetfy所有bytea部分之间的位:

部分& binary_string = binary_string

我定义了聚合“testaggregate”来聚合来自查询的所有值,如

select testaggregate (bytea_field, binary_string_in_varchar) 
from tab1

这是汇总代码

create aggregate testaggregate (bytea, character varying) (
 sfunc =aggand($0, $1, $2),
 stype = bit varying<p> 
);

其中aggand是:

declare  
  ret bit varying; 
  begin 
    if suband($2,$3) is not null then 
      if $1 is null  then ret = suband($2,$3);
         else    
       ret =$1 & suband($2,$3); 
     end if;
     else
     ret =null;    
    end if;   
  return ret ;  
end;

和“suband”是计算每行的bit_and的函数。

我的第一个问题是,当我执行聚合函数时,它不会返回单行,而是返回与表一样多的行。 第二个问题也是最重要的是为什么聚合内部状态在执行aggand后总是为空。

对不起我的英文和代码的不良缩进这是我的第一个问题。感谢所有

1 个答案:

答案 0 :(得分:1)

看起来调用状态函数而不是聚合,但有一些错误的聚合定义

CREATE OR REPLACE FUNCTION s_func(int, int, int)
RETURNS int AS $$
BEGIN
  RETURN $1 + COALESCE($2,0) + COALESCE($3,0);
END
$$ LANGUAGE plpgsql;

CREATE AGGREGATE sgg(int, int) (sfunc = s_func, stype = int, INITCOND = 0);

postgres=# SELECT sgg(i, i+1) FROM generate_series(1,3) g(i);
 sgg 
-----
  15
(1 row)