Re: RFC: Logging plan of the running query - Mailing list pgsql-hackers

From torikoshia
Subject Re: RFC: Logging plan of the running query
Date
Msg-id c3cbd6ae775dff9603ce0d724bb7ea1b@oss.nttdata.com
Whole thread
In response to Re: RFC: Logging plan of the running query  (Andrei Lepikhov <lepihov@gmail.com>)
Responses Re: RFC: Logging plan of the running query
List pgsql-hackers
On 2026-07-06 22:05, Andrei Lepikhov wrote:
> On 06/07/2026 08:21, torikoshia wrote:
>> On Wed, Jul 1, 2026 at 7:42 PM Andrei Lepikhov <lepihov@gmail.com> 
>> wrote:
>> 
>>> I’d
>>> propose introducing a tiny hook (register callback?) into 
>>> ExecProcNode() and
>>> just setting it in ProcessLogQueryPlanInterrupt.
>> 
>> This approach would also be possible, but we are concerned that
>> checking the hook on every ExecProcNode() call would add too much
>> overhead and could have a significant performance impact.
> 
> I doubt the performance impact, but generally agree: having
> ExecSetExecProcNode/ExecProcNodeFirst trick with a one-time callback 
> inside
> (right now it is the only hard-wired LogQueryPlan call) may be enough 
> for the
> implementation.
> 
> So, the extendable part here may be an ExecProcNodeFirst callback that 
> an
> extension module can register once (for example, before the start of an 
> EXPLAIN
> ANALYZE) or re-arm on each call of such 'execution state probes'.
> 
>>> Maybe the next call to ExecProcNode() will be made
>>> from an external query (or from a deeper one).
>>> The current implementation will
>>> not produce any EXPLAIN in this case, but query still executes.
>> 
>> That said, I think a similar situation can still occur if execution
>> moves to an external or deeper queryDesc after the individual plan
>> nodes have been wrapped. In that case, the plan does not be logged
>> even though the query continues executing.
> 
> That's the problem.

Sorry, I misremembered the logic.
In this case, even if execution moves to an external or deeper
QueryDesc, LogQueryPlanPending flag remains set. Therefore, the plan
tree for that external or deeper QueryDesc will be wrapped, and
the plan will be logged.

For example, with the following query, ExecProcNode() is called four 
times:

CREATE OR REPLACE FUNCTION f1() RETURNS void AS $$
BEGIN
     PERFORM 1;
END;
$$ LANGUAGE plpgsql;

SELECT f1();

If pg_log_query_plan() is called just after the first
ExecProcNode() call reaches ExecProcNodeFirst(), the plan for PERFORM 1
is logged.


Thanks,

--
Atsushi Torikoshi
Seconded from NTT DATA CORPORATION to SRA OSS K.K.



pgsql-hackers by date:

Previous
From: Alexander Korotkov
Date:
Subject: Re: wait_event_type for WAIT FOR LSN
Next
From: Heikki Linnakangas
Date:
Subject: Re: Don't use the deprecated and insecure PQcancel in our frontend tools anymore