v8-0004-gen_node_support.pl-Add-a-TypMod-type-for-signall.patch
application/octet-stream
Filename: v8-0004-gen_node_support.pl-Add-a-TypMod-type-for-signall.patch
Type: application/octet-stream
Part: 3
Patch
Format: format-patch
Series: patch v8-0004
Subject: gen_node_support.pl: Add a TypMod type for signalling TypMod behaviour
| File | + | − |
|---|---|---|
| src/backend/nodes/gen_node_support.pl | 7 | 1 |
| src/backend/nodes/outfuncs.c | 1 | 1 |
| src/backend/nodes/readfuncs.c | 1 | 1 |
| src/include/nodes/parsenodes.h | 2 | 2 |
| src/include/nodes/pathnodes.h | 1 | 1 |
| src/include/nodes/primnodes.h | 17 | 16 |
From 080ad9bdafea2056ea23830b9baa3cddae2c473d Mon Sep 17 00:00:00 2001
From: Matthias van de Meent <boekewurm+postgres@gmail.com>
Date: Thu, 8 Feb 2024 17:37:39 +0100
Subject: [PATCH v8 4/8] gen_node_support.pl: Add a TypMod type for signalling
TypMod behaviour
Like Location, TypMod has its own default (-1). By using a custom typedef,
we can omit adding pg_node_attribute(default(-1)) markers to every
typmod-valued field, whilst still getting the benefits of a smaller size
in serialization.
---
src/backend/nodes/gen_node_support.pl | 8 ++++++-
src/backend/nodes/outfuncs.c | 2 +-
src/backend/nodes/readfuncs.c | 2 +-
src/include/nodes/parsenodes.h | 4 ++--
src/include/nodes/pathnodes.h | 2 +-
src/include/nodes/primnodes.h | 33 ++++++++++++++-------------
6 files changed, 29 insertions(+), 22 deletions(-)
diff --git a/src/backend/nodes/gen_node_support.pl b/src/backend/nodes/gen_node_support.pl
index d4244facbb..13a3979469 100644
--- a/src/backend/nodes/gen_node_support.pl
+++ b/src/backend/nodes/gen_node_support.pl
@@ -135,7 +135,8 @@ my @nodetag_only;
# types that are copied by straight assignment
my @scalar_types = qw(
bits32 bool char double int int8 int16 int32 int64 long uint8 uint16 uint32 uint64
- AclMode AttrNumber Cardinality Cost Index Oid RelFileNumber Selectivity Size StrategyNumber SubTransactionId TimeLineID XLogRecPtr
+ AclMode AttrNumber Cardinality Cost Index Oid RelFileNumber Selectivity Size StrategyNumber
+ SubTransactionId TimeLineID XLogRecPtr TypMod
);
# collect enum types
@@ -1015,6 +1016,11 @@ _read${n}(void)
print $off "\tWRITE_LOCATION_FIELD($f);\n";
print $rff "\tREAD_LOCATION_FIELD($f);\n" unless $no_read;
}
+ elsif ($t eq 'TypMod')
+ {
+ print $off "\tWRITE_INT_FIELD_DEFAULT($f, -1);\n";
+ print $rff "\tREAD_INT_FIELD_DEFAULT($f, -1);\n" unless $no_read;
+ }
elsif ($t eq 'int'
|| $t eq 'int16'
|| $t eq 'int32'
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index b03773b7fe..3789e45c53 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -496,7 +496,7 @@ _outConst(StringInfo str, const Const *node)
WRITE_NODE_TYPE("CONST");
WRITE_OID_FIELD(consttype);
- WRITE_INT_FIELD(consttypmod);
+ WRITE_INT_FIELD_DEFAULT(consttypmod, -1);
WRITE_OID_FIELD(constcollid);
WRITE_INT_FIELD(constlen);
WRITE_BOOL_FIELD(constbyval);
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 7b727c168f..e56ab5d060 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -368,7 +368,7 @@ _readConst(void)
READ_LOCALS(Const);
READ_OID_FIELD(consttype);
- READ_INT_FIELD(consttypmod);
+ READ_INT_FIELD_DEFAULT(consttypmod, -1);
READ_OID_FIELD(constcollid);
READ_INT_FIELD(constlen);
READ_BOOL_FIELD(constbyval);
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index fe2b740fd9..80ba3cf31e 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -268,7 +268,7 @@ typedef struct TypeName
bool setof; /* is a set? */
bool pct_type; /* %TYPE specified? */
List *typmods; /* type modifier expression(s) */
- int32 typemod; /* prespecified type modifier */
+ TypMod typemod; /* prespecified type modifier */
List *arrayBounds; /* array bounds */
ParseLoc location; /* token location, or -1 if unknown */
} TypeName;
@@ -1619,7 +1619,7 @@ typedef struct CTECycleClause
ParseLoc location;
/* These fields are set during parse analysis: */
Oid cycle_mark_type; /* common type of _value and _default */
- int cycle_mark_typmod;
+ TypMod cycle_mark_typmod;
Oid cycle_mark_collation;
Oid cycle_mark_neop; /* <> operator for type */
} CTECycleClause;
diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h
index 534692bee1..f7c2496a7f 100644
--- a/src/include/nodes/pathnodes.h
+++ b/src/include/nodes/pathnodes.h
@@ -3394,7 +3394,7 @@ typedef struct AggTransInfo
Oid aggtranstype;
/* Additional data about transtype */
- int32 aggtranstypmod;
+ TypMod aggtranstypmod;
int transtypeLen;
bool transtypeByVal;
diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h
index ade7e09175..5fd4d54475 100644
--- a/src/include/nodes/primnodes.h
+++ b/src/include/nodes/primnodes.h
@@ -29,8 +29,9 @@ typedef enum OverridingKind
OVERRIDING_SYSTEM_VALUE,
} OverridingKind;
-
+/* Type aliases for gen_node_support */
typedef int ParseLoc;
+typedef int32 TypMod;
/* ----------------------------------------------------------------
* node definitions
@@ -250,7 +251,7 @@ typedef struct Var
/* pg_type OID for the type of this var */
Oid vartype pg_node_attr(query_jumble_ignore);
/* pg_attribute typmod value */
- int32 vartypmod pg_node_attr(query_jumble_ignore);
+ TypMod vartypmod pg_node_attr(query_jumble_ignore);
/* OID of collation, or InvalidOid if none */
Oid varcollid pg_node_attr(query_jumble_ignore);
@@ -299,7 +300,7 @@ typedef struct Const
/* pg_type OID of the constant's datatype */
Oid consttype;
/* typmod value, if any */
- int32 consttypmod pg_node_attr(query_jumble_ignore);
+ TypMod consttypmod pg_node_attr(query_jumble_ignore);
/* OID of collation, or InvalidOid if none */
Oid constcollid pg_node_attr(query_jumble_ignore);
/* typlen of the constant's datatype */
@@ -365,7 +366,7 @@ typedef struct Param
int paramid; /* numeric ID for parameter */
Oid paramtype; /* pg_type OID of parameter's datatype */
/* typmod value, if known */
- int32 paramtypmod pg_node_attr(query_jumble_ignore);
+ TypMod paramtypmod pg_node_attr(query_jumble_ignore);
/* OID of collation, or InvalidOid if none */
Oid paramcollid pg_node_attr(query_jumble_ignore);
/* token location, or -1 if unknown */
@@ -623,7 +624,7 @@ typedef struct SubscriptingRef
/* type of the SubscriptingRef's result */
Oid refrestype pg_node_attr(query_jumble_ignore);
/* typmod of the result */
- int32 reftypmod pg_node_attr(query_jumble_ignore);
+ TypMod reftypmod pg_node_attr(query_jumble_ignore);
/* collation of result, or InvalidOid if none */
Oid refcollid pg_node_attr(query_jumble_ignore);
/* expressions that evaluate to upper container indexes */
@@ -1009,7 +1010,7 @@ typedef struct SubPlan
char *plan_name; /* A name assigned during planning */
/* Extra data useful for determining subplan's output type: */
Oid firstColType; /* Type of first column of subplan result */
- int32 firstColTypmod; /* Typmod of first column of subplan result */
+ TypMod firstColTypmod; /* Typmod of first column of subplan result */
Oid firstColCollation; /* Collation of first column of subplan
* result */
/* Information about execution strategy: */
@@ -1067,7 +1068,7 @@ typedef struct FieldSelect
/* type of the field (result type of this node) */
Oid resulttype pg_node_attr(query_jumble_ignore);
/* output typmod (usually -1) */
- int32 resulttypmod pg_node_attr(query_jumble_ignore);
+ TypMod resulttypmod pg_node_attr(query_jumble_ignore);
/* OID of collation of the field */
Oid resultcollid pg_node_attr(query_jumble_ignore);
} FieldSelect;
@@ -1121,7 +1122,7 @@ typedef struct RelabelType
Expr *arg; /* input expression */
Oid resulttype; /* output type of coercion expression */
/* output typmod (usually -1) */
- int32 resulttypmod pg_node_attr(query_jumble_ignore);
+ TypMod resulttypmod pg_node_attr(query_jumble_ignore);
/* OID of collation, or InvalidOid if none */
Oid resultcollid pg_node_attr(query_jumble_ignore);
/* how to display this node */
@@ -1171,7 +1172,7 @@ typedef struct ArrayCoerceExpr
Expr *elemexpr; /* expression representing per-element work */
Oid resulttype; /* output type of coercion (an array type) */
/* output typmod (also element typmod) */
- int32 resulttypmod pg_node_attr(query_jumble_ignore);
+ TypMod resulttypmod pg_node_attr(query_jumble_ignore);
/* OID of collation, or InvalidOid if none */
Oid resultcollid pg_node_attr(query_jumble_ignore);
/* how to display this node */
@@ -1291,7 +1292,7 @@ typedef struct CaseTestExpr
Expr xpr;
Oid typeId; /* type for substituted value */
/* typemod for substituted value */
- int32 typeMod pg_node_attr(query_jumble_ignore);
+ TypMod typeMod pg_node_attr(query_jumble_ignore);
/* collation for the substituted value */
Oid collation pg_node_attr(query_jumble_ignore);
} CaseTestExpr;
@@ -1497,7 +1498,7 @@ typedef struct SQLValueFunction
* include this Oid in the query jumbling.
*/
Oid type pg_node_attr(query_jumble_ignore);
- int32 typmod;
+ TypMod typmod;
ParseLoc location; /* token location, or -1 if unknown */
} SQLValueFunction;
@@ -1549,7 +1550,7 @@ typedef struct XmlExpr
bool indent;
/* target type/typmod for XMLSERIALIZE */
Oid type pg_node_attr(query_jumble_ignore);
- int32 typmod pg_node_attr(query_jumble_ignore);
+ TypMod typmod pg_node_attr(query_jumble_ignore);
/* token location, or -1 if unknown */
ParseLoc location;
} XmlExpr;
@@ -1599,7 +1600,7 @@ typedef struct JsonReturning
NodeTag type;
JsonFormat *format; /* output JSON format */
Oid typid; /* target type Oid */
- int32 typmod; /* target type modifier */
+ TypMod typmod; /* target type modifier */
} JsonReturning;
/*
@@ -1762,7 +1763,7 @@ typedef struct CoerceToDomain
Expr *arg; /* input expression */
Oid resulttype; /* domain type ID (result type) */
/* output typmod (currently always -1) */
- int32 resulttypmod pg_node_attr(query_jumble_ignore);
+ TypMod resulttypmod pg_node_attr(query_jumble_ignore);
/* OID of collation, or InvalidOid if none */
Oid resultcollid pg_node_attr(query_jumble_ignore);
/* how to display this node */
@@ -1785,7 +1786,7 @@ typedef struct CoerceToDomainValue
/* type for substituted value */
Oid typeId;
/* typemod for substituted value */
- int32 typeMod pg_node_attr(query_jumble_ignore);
+ TypMod typeMod pg_node_attr(query_jumble_ignore);
/* collation for the substituted value */
Oid collation pg_node_attr(query_jumble_ignore);
/* token location, or -1 if unknown */
@@ -1805,7 +1806,7 @@ typedef struct SetToDefault
/* type for substituted value */
Oid typeId;
/* typemod for substituted value */
- int32 typeMod pg_node_attr(query_jumble_ignore);
+ TypMod typeMod pg_node_attr(query_jumble_ignore);
/* collation for the substituted value */
Oid collation pg_node_attr(query_jumble_ignore);
/* token location, or -1 if unknown */
--
2.40.1