summaryrefslogtreecommitdiff
path: root/src/backend/nodes
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2022-12-02 15:20:30 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2022-12-02 15:20:30 -0500
commit4c689a69eef639caa881539ee546ff1a5b11f98f (patch)
treea17a548a7c2664439db8216e322c92fd55f02b75 /src/backend/nodes
parentb6bd5def3a6382995634d33f46d20e191a475914 (diff)
Remove gen_node_support.pl's special treatment of EquivalenceClasses.
It seems better to deal with this by explicit annotations on the fields in question, instead of magic knowledge embedded in the script. While that creates a risk-of-omission from failing to annotate fields, the preceding commit should catch any such oversights. Discussion: https://postgr.es/m/263413.1669513145@sss.pgh.pa.us
Diffstat (limited to 'src/backend/nodes')
-rw-r--r--src/backend/nodes/gen_node_support.pl40
1 files changed, 33 insertions, 7 deletions
diff --git a/src/backend/nodes/gen_node_support.pl b/src/backend/nodes/gen_node_support.pl
index 705b01bea31..7212bc486f3 100644
--- a/src/backend/nodes/gen_node_support.pl
+++ b/src/backend/nodes/gen_node_support.pl
@@ -171,9 +171,6 @@ my @custom_read_write;
# Track node types with manually assigned NodeTag numbers.
my %manual_nodetag_number;
-# EquivalenceClasses are never moved, so just shallow-copy the pointer
-push @scalar_types, qw(EquivalenceClass* EquivalenceMember*);
-
# This is a struct, so we can copy it by assignment. Equal support is
# currently not required.
push @scalar_types, qw(QualCost);
@@ -454,9 +451,14 @@ foreach my $infile (@ARGV)
&& $attr !~ /^copy_as\(\w+\)$/
&& $attr !~ /^read_as\(\w+\)$/
&& !elem $attr,
- qw(equal_ignore equal_ignore_if_zero read_write_ignore
- write_only_relids write_only_nondefault_pathtarget write_only_req_outer)
- )
+ qw(copy_as_scalar
+ equal_as_scalar
+ equal_ignore
+ equal_ignore_if_zero
+ read_write_ignore
+ write_only_relids
+ write_only_nondefault_pathtarget
+ write_only_req_outer))
{
die
"$infile:$lineno: unrecognized attribute \"$attr\"\n";
@@ -691,6 +693,8 @@ _equal${n}(const $n *a, const $n *b)
# extract per-field attributes
my $array_size_field;
my $copy_as_field;
+ my $copy_as_scalar = 0;
+ my $equal_as_scalar = 0;
foreach my $a (@a)
{
if ($a =~ /^array_size\(([\w.]+)\)$/)
@@ -705,19 +709,41 @@ _equal${n}(const $n *a, const $n *b)
{
$copy_as_field = $1;
}
+ elsif ($a eq 'copy_as_scalar')
+ {
+ $copy_as_scalar = 1;
+ }
+ elsif ($a eq 'equal_as_scalar')
+ {
+ $equal_as_scalar = 1;
+ }
elsif ($a eq 'equal_ignore')
{
$equal_ignore = 1;
}
}
- # override type-specific copy method if copy_as is specified
+ # override type-specific copy method if requested
if (defined $copy_as_field)
{
print $cff "\tnewnode->$f = $copy_as_field;\n"
unless $copy_ignore;
$copy_ignore = 1;
}
+ elsif ($copy_as_scalar)
+ {
+ print $cff "\tCOPY_SCALAR_FIELD($f);\n"
+ unless $copy_ignore;
+ $copy_ignore = 1;
+ }
+
+ # override type-specific equal method if requested
+ if ($equal_as_scalar)
+ {
+ print $eff "\tCOMPARE_SCALAR_FIELD($f);\n"
+ unless $equal_ignore;
+ $equal_ignore = 1;
+ }
# select instructions by field type
if ($t eq 'char*')