PostgreSQL/開発/フック

フック

Hookインターフェース説明
void post_parse_analyze_hook(ParseState *pstate, Query *query)アナライズでパースツリーがクエリーツリーに変換された後に呼ばれる。

 参考  pg_analyze() - on doxygen.postgresql.org

サンプル

 実験 

myext.c

#include "postgres.h"
#include "fmgr.h"
#include "parser/analyze.h"
#include "lib/stringinfo.h"

PG_MODULE_MAGIC;

extern void _PG_init(void);

extern post_parse_analyze_hook_type post_parse_analyze_hook;

static void my_post_parse_analyze_hook(ParseState *pstate, Query *query);

void _PG_init(void)
{
  post_parse_analyze_hook = my_post_parse_analyze_hook;
}

static void my_post_parse_analyze_hook(ParseState *pstate, Query *query)
{
    Node *node = query->limitCount;
    if (!node) {
        return;
    }
    elog(INFO, "my_post_parse_analyze_hook always changes limit count to 1");

    // 決め打ちでlimitに定数指定されているとして値を上書きする
    // SELECT * FROM hoge LIMIT 10;
    // => SELECT * FROM hoge LIMIT 1;
    if (nodeTag(node) == T_FuncExpr) {
        FuncExpr *expr = (FuncExpr *)node;
        Const *con = (Const *)linitial(expr->args);
        con->constvalue = Int32GetDatum(1);
    }
}

postgresql.conf

shared_preload_libraries = 'myext'

実行例

postgres=# SELECT COUNT(*) FROM hoge LIMIT 100;
INFO:  my_post_parse_analyze_hook always changes LIMIT COUNT TO 1
 COUNT 
-------
   101
(1 ROW)

postgres=# SELECT * FROM hoge LIMIT 100;
INFO:  my_post_parse_analyze_hook always changes LIMIT COUNT TO 1
 id | name 
----+------
  0 | 
(1 ROW)

参考リンク


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP