SUMSQ ユーザ定義集計関数は、各値を二乗し、これらの二乗値の合計を計算します。
x12 + x22 + ...
ここで、各 xi は 1 つの列値、つまり 1 つの集計関数引数です。データベース サーバから集計関数引数が渡されているため、ITER 関数はこの引数を使用できます。したがって、ITER にはこのステップを実行するために追加情報を必要としません。
二乗した引数を加算するため、集計関数がこれまでの二乗値の部分合計を維持する必要があります。ITER 関数がこれまでの反復の部分合計を使用するには、集計関数の状態に部分合計が含まれている必要があります。
単純状態の集計関数では、集計関数の状態の割当てと割当て解除を明示的に処理する必要がありません。代わりに、データベース サーバが自動的に集計関数の状態を割り当て、NULL に初期化します。したがって、INIT 関数では他の INIT 関数タスク (表 1を参照) は不要です。つまり、集計定義からこのサポート関数を安全に省略できます。
2 つの部分状態をマージするために必要な特別な処理はありません。ITER 関数によりこのマージが適切に実行されます。
反復開始前に、部分合計をゼロに初期化しておく必要があります。 ただし、状態管理に INIT 関数は必要ではないため、この集計関数は ITER 関数を初めて呼び出すときに状態を初期化できます。ITER 関数は次に 1 つの集計関数引数の二乗を計算し、この値を部分合計に加算します。最後の反復に達した時点での最終部分合計は、SUMSQ 集計関数から戻される値です。したがって SUMSQ アルゴリズムでは、反復後処理タスクのための FINAL 関数は不要です。
/* SUMSQ ITER support function on INTEGER */
mi_integer iter_sumsq(state, value, fparam)
mi_integer state;
mi_integer value;
MI_FPARAM *fparam;
{
/* If 'state' is NULL, this is the first invocation.
* Just return square of 'value'.
*/
if ( mi_fp_argisnull(fparam, 0) )
return (value * value);
else /* add 'state' and square of 'value' together */
return (state + (value * value));
}
/* SUMSQ COMBINE support function on INTEGER */
mi_integer combine_sumsq(state1, state2)
mi_integer state1, state2;
{
/* Return the new partial sum from two parallel partial
* sums
*/
return (iter_sumsq(state1, state2));
}
CREATE AGGREGATE sumsq
WITH (ITER = iter_sumsq,
COMBINE = combine_sumsq);
この CREATE AGGREGATE 文には、SUMSQ の実装に必要な集計サポート関数である ITER と COMBINE のみをリストします。
SUMSQ 集計関数の ITER および COMBINE 集計サポート関数はコンパイルされ、sumsq という名前の共有オブジェクト モジュールにリンクされるとします。
UNIX または Linux では、SUMSQ 集計サポート関数の実行可能コードは sumsq.so という共有ライブラリに格納されます。
CREATE FUNCTION iter_sumsq(state INTEGER, one_value INTEGER)
RETURNS INTEGER
WITH (HANDLESNULLS)
EXTERNAL NAME '/usr/udrs/aggs/sums/sumsq.so'
LANGUAGE C;
CREATE FUNCTION combine_sumsq(state1 INTEGER, state2 INTEGER)
RETURNS INTEGER
EXTERNAL NAME '/usr/udrs/aggs/sums/sumsq.so'
LANGUAGE C;
SELECT SUMSQ(col3) FROM tab1;
上記の問合せは、図 1 により挿入された行から、整数 (INTEGER) 型値 2173 を算出します。他のデータ型に対して SUMSQ を使用できるようにするには、そのデータ型に対して適切な集計サポート関数が存在していることを確認する必要があります。