diff options
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/nodes/nodes.h | 6 | ||||
-rw-r--r-- | src/include/nodes/pathnodes.h | 17 |
2 files changed, 16 insertions, 7 deletions
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index a80f43e540a..1f339029474 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -86,6 +86,12 @@ typedef enum NodeTag * * - copy_as(VALUE): In copyObject(), replace the field's value with VALUE. * + * - copy_as_scalar: In copyObject(), copy the field as a scalar value + * (e.g. a pointer) even if it is a node-type pointer. + * + * - equal_as_scalar: In equal(), compare the field as a scalar value + * even if it is a node-type pointer. + * * - equal_ignore: Ignore the field for equality. * * - equal_ignore_if_zero: Ignore the field for equality if it is zero. diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h index dd4eb8679df..dbaa9bb54dc 100644 --- a/src/include/nodes/pathnodes.h +++ b/src/include/nodes/pathnodes.h @@ -1279,7 +1279,9 @@ typedef struct StatisticExtInfo * * NB: EquivalenceClasses are never copied after creation. Therefore, * copyObject() copies pointers to them as pointers, and equal() compares - * pointers to EquivalenceClasses via pointer equality. + * pointers to EquivalenceClasses via pointer equality. This is implemented + * by putting copy_as_scalar and equal_as_scalar attributes on fields that + * are pointers to EquivalenceClasses. The same goes for EquivalenceMembers. */ typedef struct EquivalenceClass { @@ -1370,7 +1372,8 @@ typedef struct PathKey NodeTag type; - EquivalenceClass *pk_eclass; /* the value that is ordered */ + /* the value that is ordered */ + EquivalenceClass *pk_eclass pg_node_attr(copy_as_scalar, equal_as_scalar); Oid pk_opfamily; /* btree opfamily defining the ordering */ int pk_strategy; /* sort direction (ASC or DESC) */ bool pk_nulls_first; /* do NULLs come before normal values? */ @@ -2478,7 +2481,7 @@ typedef struct RestrictInfo * Generating EquivalenceClass. This field is NULL unless clause is * potentially redundant. */ - EquivalenceClass *parent_ec pg_node_attr(equal_ignore, read_write_ignore); + EquivalenceClass *parent_ec pg_node_attr(copy_as_scalar, equal_ignore, read_write_ignore); /* * cache space for cost and selectivity @@ -2506,13 +2509,13 @@ typedef struct RestrictInfo */ /* EquivalenceClass containing lefthand */ - EquivalenceClass *left_ec pg_node_attr(equal_ignore, read_write_ignore); + EquivalenceClass *left_ec pg_node_attr(copy_as_scalar, equal_ignore, read_write_ignore); /* EquivalenceClass containing righthand */ - EquivalenceClass *right_ec pg_node_attr(equal_ignore, read_write_ignore); + EquivalenceClass *right_ec pg_node_attr(copy_as_scalar, equal_ignore, read_write_ignore); /* EquivalenceMember for lefthand */ - EquivalenceMember *left_em pg_node_attr(equal_ignore); + EquivalenceMember *left_em pg_node_attr(copy_as_scalar, equal_ignore); /* EquivalenceMember for righthand */ - EquivalenceMember *right_em pg_node_attr(equal_ignore); + EquivalenceMember *right_em pg_node_attr(copy_as_scalar, equal_ignore); /* * List of MergeScanSelCache structs. Those aren't Nodes, so hard to |