> I think this explanation is wrong --- if you run the query with EXPLAIN > ANALYZE, you can see from the rowcounts that the writable CTE *does* get > run to completion, as indeed is stated to be the behavior in the fine > manual. > > However, for a case like this where the main query isn't reading from > the CTE, the CTE will get cycled to completion after the main query is > done. I think what is happening is that the main query is updating all > the rows in the table, and then when the CTE comes along it thinks the > rows are already updated in the current command, so it doesn't replace > 'em a second time. This is a consequence of the fact that the same > command-counter ID is used throughout the query. My recollection is > that that choice was intentional and that doing it differently would > break use-cases that are less outlandish than this one. I don't recall > specific examples though.
Cool. Now I understand it much better. > Why are you trying to update the same table in two different parts of > this query, anyway? The best you can really hope for with that is > unspecified behavior --- we will surely not promise that one of them > completes before the other starts, so in general there's no way to be > sure which one would process a particular row first. It was just my misuse of writable CTE thinking it would be more efficient than separate statements. Best regards, -Kong