PostgreSQL/開発/フック/parser

更新日: 2020-05-10 (日) 00:08:46 (506d)

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 | 閉じる | ダブルクリックで閉じる