地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【PostgreSQL】ユーザー定義関数を登録する

概要

ユーザー定義関数を実装してPostgreSQLで呼び出せるようにします。

準備

$ sudo apt install postgresql-server-dev-all

ソース

#include "postgres.h"
#include "fmgr.h"

PG_MODULE_MAGIC;

// INT4 (整数) 用関数
PG_FUNCTION_INFO_V1(multiply_by_ten_int);

Datum multiply_by_ten_int(PG_FUNCTION_ARGS) {
    int32 input = PG_GETARG_INT32(0);
    PG_RETURN_INT32(input * 10);
}

// FLOAT4 (単精度浮動小数点) 用関数
PG_FUNCTION_INFO_V1(multiply_by_ten_float4);

Datum multiply_by_ten_float4(PG_FUNCTION_ARGS) {
    float4 input = PG_GETARG_FLOAT4(0);
    PG_RETURN_FLOAT4(input * 10.0);
}

// FLOAT8 (倍精度浮動小数点) 用関数
PG_FUNCTION_INFO_V1(multiply_by_ten_float8);

Datum multiply_by_ten_float8(PG_FUNCTION_ARGS) {
    float8 input = PG_GETARG_FLOAT8(0);
    PG_RETURN_FLOAT8(input * 10.0);
}

読み込み

CREATE OR REPLACE FUNCTION multiply_by_ten(input int)
RETURNS int
AS '/usr/lib/postgresql/echo', 'multiply_by_ten_int'
LANGUAGE C STRICT;

CREATE OR REPLACE FUNCTION multiply_by_ten(input real)
RETURNS real
AS '/usr/lib/postgresql/echo', 'multiply_by_ten_float4'
LANGUAGE C STRICT;

CREATE OR REPLACE FUNCTION multiply_by_ten(input double precision)
RETURNS double precision
AS '/usr/lib/postgresql/echo', 'multiply_by_ten_float8'
LANGUAGE C STRICT;

これで受け取った数値を10倍して返すだけのユーザー定義関数の実装ができた。