[pgsql-jp: 41243] Re: ユーザー定義関数の作り方

Tomoaki Sato sato @ sraoss.co.jp
2012年 10月 11日 (木) 02:20:44 JST


佐藤です。

From: 山田 明 <lennygcc @ infoseek.jp>
Date: Wed, 10 Oct 2012 19:53:18 +0900

> 戻り値ではなくて、anyarrayを引数としたC言語によるユーザー定義関数において、
> 引数の取り出し方がよく分からないのです。
> 
> マニュアルに記載された多様体の例の引数は、elementであって、anyarrayでは
> ありません。配列の引数は、C言語から、どのように取り出すのでしょう。

配列でも引数はマクロ PG_GETARG_* で取り出せます。配列の要素にアクセス
するには関数 deconstruct_array で一次元にばらすのが簡単だと思います。

  arg = PG_GETARG_ARRAYTYPE_P(0);
  elmtyp = ARR_ELEMTYPE(arg);

  get_typlenbyvalalign(elmtyp, &elmlen, &elmbyval, &elmalign);
  deconstruct_array(arg, elmtyp, elmlen, elmbyval, elmalign,
                    &elemsp, &nullsp, &nelemsp);
  result = 0;
  for (i = 0; i < nelemsp; i++)
  {
      // 配列の要素が NULL かどうか
      if (nullsp[i])
      {
          continue;
      }

      // 配列の要素の値を加える
      result += DatumGetInt32(elemsp[i]);
  }

上記では anyarray 型であることを考えていませんが、変数 elmtyp を見れば
データ型に応じて処理を分けれられます。

ほかにイテレータでもアクセスできるみたいです。

Web にもあまり情報がないようなので、ヘッダファイル utils/array.h やソー
スファイル src/backend/utils/adt/arrayfuncs.c あたりを読むのがいいです。

あるいは、C でないといけない理由がないなら、PL/pgSQL で書いたほうが簡
単だと思います。

>> 米林です。
>>
>> かなり昔にやったものですが
>>
>> http://d.hatena.ne.jp/yone098/20080729/1217300716
>>
>> ブログのように、まずは固定値を返すユーザ定義関数を作って動作させ
>> そのあとに、ブログにある引き数を取得をデバッグしながら試してみて下さい。
>> 固定値を返す関数が作成出来て
>> 引き数を取得する関数が作成出来れば
>> ゴールは近いはずです。


----
Tomoaki Sato <sato @ sraoss.co.jp>
SRA OSS, Inc. Japan


pgsql-jp メーリングリストの案内