Here are the results of a couple more days' hacking on the CTE patch.
* I cleaned up the processing in the second part of parse_cte.c, where
we are trying to check for validity of a recursive query. The
conditions that it's checking for are not exactly the same as what was
being looked for previously, so this could do with a bit of review.
* I got rid of the kluges in the executor in favor of treating the
working table as a PARAM_EXEC Param. Also renamed the plan node
types to RecursiveUnion and WorkTableScan --- I'm not wedded to these
choices, but they seemed more transparent than the former names.
* I have not yet tackled the problem of ensuring single evaluation of
CTEs, but there's a few bits of infrastructure for it.
There are various small loose ends denoted by XXX in the patch, but
the main remaining issue is definitely the single-evaluation business.
regards, tom lane