Re: Which parts of src/backend/nodes/print.c are used?

From: Paul Jungwirth <pj(at)illuminatedcomputing(dot)com>
To: pgsql-hackers(at)lists(dot)postgresql(dot)org
Subject: Re: Which parts of src/backend/nodes/print.c are used?
Date: 2024-08-08 18:50:57
Message-ID: 7e5ddced-fad6-4295-9896-57b100ec17ab@illuminatedcomputing.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 12/4/23 05:50, Tom Lane wrote:
> Peter Eisentraut <peter(at)eisentraut(dot)org> writes:
>> src/backend/nodes/print.c contains a number of functions that print node
>> types, mostly to stdout. Most of these are not actually used anywhere
>> in the code. Are they meant to be inserted into the code ad hoc for
>> debugging? Is anyone using these?
>
> Personally, I use pprint() a lot. (I invoke it manually from gdb and
> then look into the postmaster log for results.) Its cousins such as
> format_node_dump look like they were added by people with slightly
> different tastes in output format, so they probably have a
> constituency somewhere.
>
> I tend to agree that print_rt() and the other tree-printing routines
> below it (down to, but not including, print_slot) are not as useful
> as invoking the outfuncs.c code; but others might think differently.
> Sometimes you don't want all the gory detail.

I've wondered about these functions for years. I use pprint a lot, and I've wanted to use
print_slot/print_rt/print_tl (especially print_slot), but they never seemed to do anything. For
instance debugging `SELECT 1;`:

(gdb) b ExecResult
Breakpoint 1 at 0x5fcc25f1ffcb: file nodeResult.c, line 68.
(gdb) c
Continuing.

Breakpoint 1, ExecResult (pstate=0x5fcc285272f8) at nodeResult.c:68
68 {
(gdb) call print_rt(((PlannedStmt *)pstate->plan)->rtable)
(gdb) call print_slot(pstate->ps_ResultTupleSlot)
(gdb)

Even with log_min_messages and client_min_messages set to DEBUG5, nothing appears in psql or the log
or gdb. How are you supposed to use these functions?

Or if you want a real table, I still see no output after `ExecScanFetch` with:

create table s(i) as select generate_series(1,10);
select i from s;

I even tried dup'ing the backend's stdout to a file, but still got nothing:

(gdb) call creat("/tmp/pgout", 0600)
$1 = 103
(gdb) call dup2(103, 1)
'dup2' has unknown return type; cast the call to its declared return type
(gdb) call (int)dup2(103, 1)
$2 = 1
(gdb) b ExecScanFetch
Breakpoint 1 at 0x5fcc25ef026e: file execScan.c, line 37.
(gdb) c
Continuing.

Breakpoint 1, ExecScanFetch (node=node(at)entry=0x5fcc2852d348,
accessMtd=accessMtd(at)entry=0x5fcc25f20b74 <SeqNext>, recheckMtd=recheckMtd(at)entry=0x5fcc25f20b28
<SeqRecheck>) at execScan.c:37
37 {
(gdb) fin
Run till exit from #0 ExecScanFetch (node=node(at)entry=0x5fcc2852d348,
accessMtd=accessMtd(at)entry=0x5fcc25f20b74 <SeqNext>, recheckMtd=recheckMtd(at)entry=0x5fcc25f20b28
<SeqRecheck>) at execScan.c:37
0x00005fcc25ef044a in ExecScan (node=0x5fcc2852d348, accessMtd=accessMtd(at)entry=0x5fcc25f20b74
<SeqNext>, recheckMtd=recheckMtd(at)entry=0x5fcc25f20b28 <SeqRecheck>) at execScan.c:180
180 return ExecScanFetch(node, accessMtd, recheckMtd);
Value returned is $3 = (TupleTableSlot *) 0x5fcc2852d538
(gdb) call print_slot($3)
(gdb)

Yours,

--
Paul ~{:-)
pj(at)illuminatedcomputing(dot)com

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Robert Haas 2024-08-08 18:59:54 Re: Add LSN <-> time conversion functionality
Previous Message Tomas Vondra 2024-08-08 18:49:36 Re: Enable data checksums by default