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
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 |