Re: automatically generating node support functions
Tom Lane <tgl@sss.pgh.pa.us>
Attachments
- v7-0001-Automatically-generate-node-support-functions.patch (text/x-diff) patch v7-0001
- v7-0002-toms-changes.patch (text/x-diff) patch v7-0002
Peter Eisentraut <peter.eisentraut@enterprisedb.com> writes:
> [ v7-0001-Automatically-generate-node-support-functions.patch ]
I have gone through this and made some proposed changes (attached),
and I think it is almost committable. There is one nasty problem
we need a solution to, which is that pgindent is not at all on board
with this idea of attaching node attrs to typedefs. It pushes them
to the next line, like this:
@@ -691,7 +709,8 @@
(rel)->reloptkind == RELOPT_OTHER_JOINREL || \
(rel)->reloptkind == RELOPT_OTHER_UPPER_REL)
-typedef struct RelOptInfo pg_node_attr(no_copy_equal, no_read)
+typedef struct RelOptInfo
+pg_node_attr(no_copy_equal, no_read)
{
NodeTag type;
which is already enough to break the simplistic parsing in
gen_node_support.pl. Now, we could fix that parsing logic to deal
with this layout, but this also seems to change pgindent's opinion
of whether the subsequent braced material is part of a typedef or a
function. That results in it injecting a lot of vertical space
that wasn't there before, which is annoying.
I experimented a bit and found that we could do it this way:
typedef struct RelOptInfo
{
+ pg_node_attr(no_copy_equal, no_read)
+
NodeTag type;
without (AFAICT) confusing pgindent, but I've not tried to adapt
the perl script or the code to that style.
Anyway, besides that, I have some comments that I've implemented
in the attached delta patch.
* After further thought I'm okay with your theory that attaching
special copy/equal rules to specific field types is appropriate.
We might at some point want the pg_node_attr(copy_as_scalar)
approach too, but we can always add that later. However, I thought
some more comments about it were needed in the *nodes.h files,
so I added those. (My general feeling about this is that if
anyone needs to look into gen_node_support.pl to understand how
the backend works, we've failed at documentation.)
* As written, the patch created equal() support for all Plan structs,
which is quite a bit of useless code bloat. I solved this by
separating no_copy and no_equal properties, so that we could mark
Plan as no_equal while still having copy support.
* I did not like the semantics of copy_ignore one bit: it was
relying on the pre-zeroing behavior of makeNode() to be sane at
all, and I don't want that to be a requirement. (I foresee
wanting to flat-copy node contents and turn COPY_SCALAR_FIELD
into a no-op.) I replaced it with copy_as(VALUE) to provide
better-defined semantics.
* Likewise, read_write_ignore left the contents of the field after
reading too squishy for me. I invented read_as(VALUE) parallel
to copy_as() to fix the semantics, and added a check that you
can only use read_write_ignore if the struct is no_read or
you provide read_as(). (This could be factored differently
of course.)
* I threw in a bunch more no_read markers to bring the readfuncs.c
contents into closer alignment with what we have today. Maybe
there is an argument for accepting that code bloat, but it's a
discussion to have later. In any case, most of the pathnodes.h
structs HAVE to be marked no_read because there's no sane way
to reconstruct them from outfuncs output.
* I got rid of the code that stripped underscores from outfuncs
struct labels. That seemed like an entirely unnecessary
behavioral change.
* FWIW, I'm okay with the question about
# XXX Previously, for subtyping, only the leaf field name is
# used. Ponder whether we want to keep it that way.
I thought that it might make the output too cluttered, but after
some study of the results from printing plans and planner data
structures, it's not a big addition, and indeed I kind of like it.
* Fixed a bug in write_only_req_outer code.
* Made Plan and Join into abstract nodes.
Anyway, if we can fix the impedance mismatch with pgindent,
I think this is committable. There is a lot of follow-on
work that could be considered, but I'd like to get the present
changes in place ASAP so that other patches can be rebased
onto something stable.
I've attached a delta patch, and also repeated v7 so as not
to confuse the cfbot.
regards, tom lane
Commits
-
Fix MSVC build script's check for obsolete node support functions.
- 9a9f25e21742 16.0 landed
-
Improve performance of ORDER BY / DISTINCT aggregates
- 1349d2790bf4 16.0 cited
-
doc: Fix typos in protocol.sgml
- a69959fab2f3 16.0 cited
-
Tighten up parsing logic in gen_node_support.pl.
- 7c0eb3c622eb 16.0 landed
-
Add defenses against unexpected changes in the NodeTag enum list.
- eea9fa9b250f 16.0 landed
-
Add copy/equal support for XID lists
- 5ca0fe5c8ad7 16.0 landed
-
Rationalize order of input files for gen_node_support.pl.
- bf022d337ef0 16.0 landed
-
Make assorted quality-of-life improvements in gen_node_support.pl.
- 8eccaf652542 16.0 landed
-
Doc: rearrange high-level commentary about node support coverage.
- 3cd0ac987819 16.0 landed
-
Automatically generate node support functions
- 964d01ae90c3 16.0 landed
-
Adjust node serialization tag of A_Expr for consistency
- bf1f4a364d6c 16.0 landed
-
Remove T_Join and T_Plan
- 251154bebe98 16.0 landed
-
Reformat some more node comments
- 3140f089855c 16.0 landed
-
Reformat some node comments
- 835d476fd21b 16.0 landed
-
Remove JsonPathSpec typedef
- dc2be6ed47e5 15.0 landed
-
Add missing enum tag in enum used in nodes
- d47a11da9e5c 15.0 landed
-
Add Cardinality typedef
- 6fe0eb963d38 15.0 landed
-
Make node output prefix match node structure name
- e58136069687 15.0 landed
-
Add WRITE_INDEX_ARRAY
- bdeb2c4ec270 15.0 landed
-
Add COPY_ARRAY_FIELD and COMPARE_ARRAY_FIELD
- 308da179e7c2 15.0 landed
-
Remove T_Expr
- 853992919773 15.0 landed
-
Change NestPath node to contain JoinPath node
- 18fea737b5e4 15.0 landed
-
Change SeqScan node to contain Scan node
- 2226b4189bb4 15.0 landed
-
Check the size in COPY_POINTER_FIELD
- c1132aae336c 15.0 landed
-
Remove T_MemoryContext
- 256909c6c167 15.0 landed
-
Add missing enum tags in enums used in nodes
- 983bdc4fac49 15.0 landed
-
Rename some node support functions for consistency
- 31360381f0a5 15.0 landed
-
Rename argument of _outValue()
- 3d25b4ea6e2c 15.0 landed
-
Rename NodeTag of ExprState
- d9a38c52cef3 15.0 landed