象と戯れ

 | 

2010-01-04

パースツリーを文字列で出力する

02:39 | パースツリーを文字列で出力する - 象と戯れ を含むブックマーク はてなブックマーク - パースツリーを文字列で出力する - 象と戯れ

PGSQL Development Hack #2

前回はTupleTableSlotを出力しました。より身近なデバッグの友という意味では、パースツリーやプランツリーの方が皆さんには馴染みが深いかもしれません。しかしこれらもまた複雑な形状をした内部データですので、視覚可して状況を把握するのは簡単ではありません。

そんなときは、pprint()。ソースはbackend/nodes/print.cです。

PostgreSQLのパースツリーやプランツリーは全てNodeという抽象データ型で表されています。そして多くのNodeについては出力関数が定義されており、構造体のメンバを文字列化する術を用意しているのです!例えばウィンドウ関数におけるウィンドウ定義の構文上の表現であるWindowDefならば、

static void
_outWindowDef(StringInfo str, WindowDef *node)
{
	WRITE_NODE_TYPE("WINDOWDEF");

	WRITE_STRING_FIELD(name);
	WRITE_STRING_FIELD(refname);
	WRITE_NODE_FIELD(partitionClause);
	WRITE_NODE_FIELD(orderClause);
	WRITE_NODE_FIELD(frame);
	WRITE_LOCATION_FIELD(location);
}

という感じで、用意されたマクロで簡便に記述されています。WRITE_NODE_FIELD()の場合はメンバがNodeになっているため、再帰的に呼び出されツリーが文字列に変換される、というわけです。

一点注意したいのは、Nodeの構造体を変更した場合はこれらのサポート関数をきちんと再定義しなければなりません。そうせずにうっかりパッチを送ると、後できっと痛い目を見ることになります。


勉強になりますね。


・・・(続く)

 |