Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitca187d7

Browse files
committed
Invent nodetag_only attribute for Nodes.
This allows explaining gen_node_support.pl's handling of execnodes.hand some other input files as being a shortcut for explicit markingof all their node declarations as pg_node_attr(nodetag_only).I foresee that someday we might need to be more fine-grained aboutthat, and this change provides the infrastructure needed to do so.For now, it just allows removal of the script's klugy special casefor CallContext and InlineCodeBlock.Discussion:https://postgr.es/m/75063.1657410615@sss.pgh.pa.us
1 parent09c5ace commitca187d7

File tree

3 files changed

+25
-11
lines changed

3 files changed

+25
-11
lines changed

‎src/backend/nodes/gen_node_support.pl‎

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ sub elem
5050
my@no_read;
5151
# node types we don't want read/write support for
5252
my@no_read_write;
53+
# node types we don't want any support functions for, just node tags
54+
my@nodetag_only;
5355

5456
# types that are copied by straight assignment
5557
my@scalar_types =qw(
@@ -95,7 +97,10 @@ sub elem
9597
# currently not required.
9698
push@scalar_types,qw(QualCost);
9799

98-
# Nodes from these input files don't need support functions, just node tags.
100+
# Nodes from these input files are automatically treated as nodetag_only.
101+
# In the future we might add explicit pg_node_attr labeling to some of these
102+
# files and remove them from this list, but for now this is the path of least
103+
# resistance.
99104
my@nodetag_only_files =qw(
100105
nodes/execnodes.h
101106
access/amapi.h
@@ -113,10 +118,8 @@ sub elem
113118

114119
# XXX various things we are not publishing right now to stay level
115120
# with the manual system
116-
push@no_copy,qw(CallContext InlineCodeBlock);
117-
push@no_equal,qw(CallContext InlineCodeBlock);
118121
push@no_read_write,
119-
qw(AccessPriv AlterTableCmdCallContextCreateOpClassItem FunctionParameter InferClause InlineCodeBlock ObjectWithArgs OnConflictClause PartitionCmd RoleSpec VacuumRelation);
122+
qw(AccessPriv AlterTableCmd CreateOpClassItem FunctionParameter InferClause ObjectWithArgs OnConflictClause PartitionCmd RoleSpec VacuumRelation);
120123
push@no_read,qw(A_ArrayExpr A_Indices A_Indirection AlterStatsStmt
121124
CollateClause ColumnDef ColumnRef CreateForeignTableStmt CreateStatsStmt
122125
CreateStmt FuncCall ImportForeignSchemaStmt IndexElem IndexStmt
@@ -254,6 +257,10 @@ sub elem
254257
{
255258
push@no_read,$in_struct;
256259
}
260+
elsif ($attreq'nodetag_only')
261+
{
262+
push@nodetag_only,$in_struct;
263+
}
257264
elsif ($attreq'special_read_write')
258265
{
259266
# This attribute is called
@@ -314,13 +321,9 @@ sub elem
314321
$node_type_info{$in_struct}->{field_types} = \%ft;
315322
$node_type_info{$in_struct}->{field_attrs} = \%fa;
316323

317-
# Exclude nodes in nodetag_only_files from support.
318-
if (elem$infile,@nodetag_only_files)
319-
{
320-
push@no_copy,$in_struct;
321-
push@no_equal,$in_struct;
322-
push@no_read_write,$in_struct;
323-
}
324+
# Propagate nodetag_only marking from files to nodes
325+
push@nodetag_only,$in_struct
326+
if (elem$infile,@nodetag_only_files);
324327

325328
# Propagate some node attributes from supertypes
326329
if ($supertype)
@@ -515,6 +518,7 @@ sub elem
515518
foreachmy$n (@node_types)
516519
{
517520
nextif elem$n,@abstract_types;
521+
nextif elem$n,@nodetag_only;
518522
my$struct_no_copy = (elem$n,@no_copy);
519523
my$struct_no_equal = (elem$n,@no_equal);
520524
nextif$struct_no_copy &&$struct_no_equal;
@@ -706,6 +710,7 @@ sub elem
706710
foreachmy$n (@node_types)
707711
{
708712
nextif elem$n,@abstract_types;
713+
nextif elem$n,@nodetag_only;
709714
nextif elem$n,@no_read_write;
710715

711716
# XXX For now, skip all "Stmt"s except that ones that were there before.

‎src/include/nodes/nodes.h‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,17 @@ typedef enum NodeTag
6161
*
6262
* - no_read: Does not support nodeRead() at all.
6363
*
64+
* - nodetag_only: Does not support copyObject(), equal(), outNode(),
65+
* or nodeRead().
66+
*
6467
* - special_read_write: Has special treatment in outNode() and nodeRead().
6568
*
6669
* Node types can be supertypes of other types whether or not they are marked
6770
* abstract: if a node struct appears as the first field of another struct
6871
* type, then it is the supertype of that type. The no_copy, no_equal, and
6972
* no_read node attributes are automatically inherited from the supertype.
73+
* (Notice that nodetag_only does not inherit, so it's not quite equivalent
74+
* to a combination of other attributes.)
7075
*
7176
* Valid node field attributes:
7277
*

‎src/include/nodes/parsenodes.h‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3382,6 +3382,8 @@ typedef struct DoStmt
33823382

33833383
typedefstructInlineCodeBlock
33843384
{
3385+
pg_node_attr(nodetag_only)/* this is not a member of parse trees */
3386+
33853387
NodeTagtype;
33863388
char*source_text;/* source text of anonymous code block */
33873389
OidlangOid;/* OID of selected language */
@@ -3408,6 +3410,8 @@ typedef struct CallStmt
34083410

34093411
typedefstructCallContext
34103412
{
3413+
pg_node_attr(nodetag_only)/* this is not a member of parse trees */
3414+
34113415
NodeTagtype;
34123416
boolatomic;
34133417
}CallContext;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp