フック †
Hookインターフェース | 説明 |
---|---|
void ExecutorStart_hook(QueryDesc *queryDesc, int flags) | Executorの開始時に呼ばれる。通常は、standard_ExecutorStart関数がプロセスを実行する。 |
void ExecutorRun_hook(ScanDirection direction, uint64 count) | Executor実行時に呼ばれる。通常は、standard_ExecutorRun関数がプロセスを実行する。 |
void ExecutorFinish_hook(QueryDesc *queryDesc) | 最後のExecutorRunコールの後に呼ばれる。通常は、standard_ExecutorFinish関数がプロセスを処理する。 |
void ExecutorEnd_hook(QueryDesc *queryDesc) | Executorの終了時に呼ばれる。通常は、standard_ExecutorEnd関数がプロセスを実行する。 |
bool ExecutorCheckPerms_hook(List *rangeTable, bool ereport_on_violation) | リレーションへのアクセス権限チェック時に呼ばれる。Row Level Securityとは別である。 |
参考 execMain.c - on doxygen.postgresql.org
サンプル †
実験
myext.c
#include "postgres.h" #include "fmgr.h" #include "executor/executor.h" PG_MODULE_MAGIC; extern void _PG_init(void); extern ExecutorStart_hook_type ExecutorStart_hook; extern ExecutorRun_hook_type ExecutorRun_hook; extern ExecutorFinish_hook_type ExecutorFinish_hook; extern ExecutorEnd_hook_type ExecutorEnd_hook; static void my_ExecutorStart(QueryDesc *queryDesc, int eflags); static void my_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count); static void my_ExecutorFinish(QueryDesc *queryDesc); static void my_ExecutorEnd(QueryDesc *queryDesc); void _PG_init(void) { // Executor ExecutorStart_hook = my_ExecutorStart; ExecutorRun_hook = my_ExecutorRun; ExecutorFinish_hook = my_ExecutorFinish; ExecutorEnd_hook = my_ExecutorEnd; } static void my_ExecutorStart(QueryDesc *queryDesc, int eflags) { elog(INFO, "my_ExecutorStart"); standard_ExecutorStart(queryDesc, eflags); } static void my_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count) { elog(INFO, "my_ExecutorRun"); standard_ExecutorRun(queryDesc, direction, count); } static void my_ExecutorFinish(QueryDesc *queryDesc) { elog(INFO, "my_ExecutorFinish"); standard_ExecutorFinish(queryDesc); } static void my_ExecutorEnd(QueryDesc *queryDesc) { elog(INFO, "my_ExecutorEnd"); standard_ExecutorEnd(queryDesc); }
postgresql.conf
shared_preload_libraries = 'my ext'
実行例
$psql postgres postgres=# \d INFO: my_ExecutorStart INFO: my_ExecutorRun INFO: my_ExecutorFinish INFO: my_ExecutorEnd List OF relations Schema | Name | TYPE | Owner --------+------+-------+------------ public | hoge | TABLE | guest (1 ROW)