src/backend/tcop/postgres.c

static List *pg_rewrite_query(Query *query) {
List *querytree_list;

if (log_parser_stats) ResetUsage();
if (query->commandType == CMD_UTILITY) {
/* don't rewrite utilities, just dump 'em into result list */
querytree_list = list_make1(query);
} else {
/* rewrite regular queries */
querytree_list = QueryRewrite(query);
}
if (log_parser_stats) ShowUsage("REWRITER STATISTICS");

#ifdef COPY_PARSE_PLAN_TREES
/* Optional debugging check: pass querytree through copyObject() */
{
List *new_list;
new_list = copyObject(querytree_list);
/* This checks both copyObject() and the equal() routines... */
if (!equal(new_list, querytree_list))
elog(WARNING, "copyObject() failed to produce equal parse tree");
else
querytree_list = new_list;
}
#endif
#ifdef WRITE_READ_PARSE_PLAN_TREES
/* Optional debugging check: pass querytree through outfuncs/readfuncs */
{
List *new_list = NIL;
ListCell *lc;
/* We currently lack outfuncs/readfuncs support for most utility
* statement types, so only attempt to write/read non-utility queries. */
foreach(lc, querytree_list) {
Query *query = castNode(Query, lfirst(lc));
if (query->commandType != CMD_UTILITY) {
char *str = nodeToString(query);
Query *new_query = stringToNodeWithLocations(str);
/* queryId is not saved in stored rules, but we must preserve
* it here to avoid breaking pg_stat_statements. */
new_query->queryId = query->queryId;
new_list = lappend(new_list, new_query);
pfree(str);
}
else
new_list = lappend(new_list, query);
}
/* This checks both outfuncs/readfuncs and the equal() routines... */
if (!equal(new_list, querytree_list))
elog(WARNING, "outfuncs/readfuncs failed to produce equal parse tree");
else
querytree_list = new_list;
}
#endif

return querytree_list;
}

主要功能在于QueryRewrite函数接收一个Query结构体,返回列表组织的querytree_list。