フック †
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)