- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- PostgreSQL/開発/フック/parser へ行く。
- 1 (2017-08-16 (水) 21:52:18)
- 2 (2017-08-16 (水) 21:52:49)
フック †
Hookインターフェース | 説明 |
---|---|
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)