Hi, There's a few cases where by the time ExecutorFinish() is called, ExecShutdownNode() has not yet been called. As, among other reasons, ExecShutdownNode() also collects instrumentation, I think that's problematic.
In ExplainOnePlan() we call /* run cleanup too */ ExecutorFinish(queryDesc); and then print the majority of the explain data: /* Create textual dump of plan tree */ ExplainPrintPlan(es, queryDesc); and only then shut down the entire query: ExecutorEnd(queryDesc); which seems to mean that if a node hasn't yet been shut down for some reason, we'll not have information that's normally collected in ExecShutdownNode(). ISTM, we should have a new EState member that runs ExecShutdownNode() if in standard_ExecutorEnd() if not already done. Am I missing something? Greetings, Andres Freund