PostgreSQL與Rust的聚合實現比較

banq發表於2022-02-18

在使用PostgreSQL時,使用SUM(vals)或AVG(vals)這樣的函式是一種常見的習慣。這些聚合函式為使用者提供了一種簡單、有效的方法來計算一組輸入的結果。
定義一個聚合是透過CREATE AGGREGATE和CREATE FUNCTION,這裡是一個只針對整數的sum的重新實現:

CREATE FUNCTION example_sum_state(
    state integer,
    next  integer
) RETURNS integer
LANGUAGE SQL
STRICT
AS $$
    SELECT $1 + $2;
$$;

CREATE AGGREGATE example_sum(integer)
(
    SFUNC    = example_sum_state, -- State function
    STYPE    = integer,           -- State type
    INITCOND = '0'                -- Must be a string or null
);

SELECT example_sum(value) FROM UNNEST(ARRAY [1, 2, 3]) as value;
--  example_sum 
-- -------------
--            6
-- (1 row)


從概念上講,聚合迴圈了輸入中的每個專案,並對當前狀態以及每個值執行SFUNC函式。這段程式碼類似於:

fn example_sum(values: Vec<isize>) -> isize {
    let mut sum = 0;
    for value in values {
        sum += value;
    }
    sum
}


更多點選標題

相關文章