v8-0002-gen_node_support.pl-Mark-location-fields-as-type-.patch

application/octet-stream

Filename: v8-0002-gen_node_support.pl-Mark-location-fields-as-type-.patch
Type: application/octet-stream
Part: 4
Message: Re: Reducing output size of nodeToString

Patch

Format: format-patch
Series: patch v8-0002
Subject: gen_node_support.pl: Mark location fields as type alias ParseLoc
File+
src/backend/nodes/gen_node_support.pl 3 3
src/include/nodes/parsenodes.h 46 46
src/include/nodes/primnodes.h 37 35
src/tools/pgindent/typedefs.list 1 0
From 5d089d443ce5e6c92e164833a320895b6f473e9e Mon Sep 17 00:00:00 2001
From: Matthias van de Meent <boekewurm+postgres@gmail.com>
Date: Thu, 8 Feb 2024 17:15:22 +0100
Subject: [PATCH v8 2/8] gen_node_support.pl: Mark location fields as type
 alias ParseLoc

Instead of the rather ugly type=int + name ~= location$, we now have a
marker type for offset pointers or sizes that are only relevant when a
query text is included, which decreases the complexity required in
gen_node_support.pl for handling these values.
---
 src/backend/nodes/gen_node_support.pl |  6 +-
 src/include/nodes/parsenodes.h        | 92 +++++++++++++--------------
 src/include/nodes/primnodes.h         | 72 +++++++++++----------
 src/tools/pgindent/typedefs.list      |  1 +
 4 files changed, 87 insertions(+), 84 deletions(-)

diff --git a/src/backend/nodes/gen_node_support.pl b/src/backend/nodes/gen_node_support.pl
index 2f0a59bc87..d4244facbb 100644
--- a/src/backend/nodes/gen_node_support.pl
+++ b/src/backend/nodes/gen_node_support.pl
@@ -777,7 +777,7 @@ _equal${n}(const $n *a, const $n *b)
 			print $eff "\tCOMPARE_BITMAPSET_FIELD($f);\n"
 			  unless $equal_ignore;
 		}
-		elsif ($t eq 'int' && $f =~ 'location$')
+		elsif ($t eq 'ParseLoc')
 		{
 			print $cff "\tCOPY_LOCATION_FIELD($f);\n" unless $copy_ignore;
 			print $eff "\tCOMPARE_LOCATION_FIELD($f);\n" unless $equal_ignore;
@@ -1010,7 +1010,7 @@ _read${n}(void)
 			print $off "\tWRITE_BOOL_FIELD($f);\n";
 			print $rff "\tREAD_BOOL_FIELD($f);\n" unless $no_read;
 		}
-		elsif ($t eq 'int' && $f =~ 'location$')
+		elsif ($t eq 'ParseLoc')
 		{
 			print $off "\tWRITE_LOCATION_FIELD($f);\n";
 			print $rff "\tREAD_LOCATION_FIELD($f);\n" unless $no_read;
@@ -1303,7 +1303,7 @@ _jumble${n}(JumbleState *jstate, Node *node)
 			print $jff "\tJUMBLE_NODE($f);\n"
 			  unless $query_jumble_ignore;
 		}
-		elsif ($t eq 'int' && $f =~ 'location$')
+		elsif ($t eq 'ParseLoc')
 		{
 			# Track the node's location only if directly requested.
 			if ($query_jumble_location)
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 2380821600..fe2b740fd9 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -233,9 +233,9 @@ typedef struct Query
 	 * both be -1 meaning "unknown".
 	 */
 	/* start location, or -1 if unknown */
-	int			stmt_location;
+	ParseLoc	stmt_location;
 	/* length in bytes; 0 means "rest of string" */
-	int			stmt_len pg_node_attr(query_jumble_ignore);
+	ParseLoc	stmt_len pg_node_attr(query_jumble_ignore);
 } Query;
 
 
@@ -270,7 +270,7 @@ typedef struct TypeName
 	List	   *typmods;		/* type modifier expression(s) */
 	int32		typemod;		/* prespecified type modifier */
 	List	   *arrayBounds;	/* array bounds */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } TypeName;
 
 /*
@@ -290,7 +290,7 @@ typedef struct ColumnRef
 {
 	NodeTag		type;
 	List	   *fields;			/* field names (String nodes) or A_Star */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } ColumnRef;
 
 /*
@@ -300,7 +300,7 @@ typedef struct ParamRef
 {
 	NodeTag		type;
 	int			number;			/* the number of the parameter */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } ParamRef;
 
 /*
@@ -333,7 +333,7 @@ typedef struct A_Expr
 	List	   *name;			/* possibly-qualified name of operator */
 	Node	   *lexpr;			/* left argument, or NULL if none */
 	Node	   *rexpr;			/* right argument, or NULL if none */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } A_Expr;
 
 /*
@@ -359,7 +359,7 @@ typedef struct A_Const
 	NodeTag		type;
 	union ValUnion val;
 	bool		isnull;			/* SQL NULL constant */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } A_Const;
 
 /*
@@ -370,7 +370,7 @@ typedef struct TypeCast
 	NodeTag		type;
 	Node	   *arg;			/* the expression being casted */
 	TypeName   *typeName;		/* the target type */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } TypeCast;
 
 /*
@@ -381,7 +381,7 @@ typedef struct CollateClause
 	NodeTag		type;
 	Node	   *arg;			/* input expression */
 	List	   *collname;		/* possibly-qualified collation name */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } CollateClause;
 
 /*
@@ -401,7 +401,7 @@ typedef struct RoleSpec
 	NodeTag		type;
 	RoleSpecType roletype;		/* Type of this rolespec */
 	char	   *rolename;		/* filled only for ROLESPEC_CSTRING */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } RoleSpec;
 
 /*
@@ -431,7 +431,7 @@ typedef struct FuncCall
 	bool		agg_distinct;	/* arguments were labeled DISTINCT */
 	bool		func_variadic;	/* last argument was labeled VARIADIC */
 	CoercionForm funcformat;	/* how to display this node */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } FuncCall;
 
 /*
@@ -488,7 +488,7 @@ typedef struct A_ArrayExpr
 {
 	NodeTag		type;
 	List	   *elements;		/* array element expressions */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } A_ArrayExpr;
 
 /*
@@ -515,7 +515,7 @@ typedef struct ResTarget
 	char	   *name;			/* column name or NULL */
 	List	   *indirection;	/* subscripts, field names, and '*', or NIL */
 	Node	   *val;			/* the value expression to compute or assign */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } ResTarget;
 
 /*
@@ -545,7 +545,7 @@ typedef struct SortBy
 	SortByDir	sortby_dir;		/* ASC/DESC/USING/default */
 	SortByNulls sortby_nulls;	/* NULLS FIRST/LAST */
 	List	   *useOp;			/* name of op to use, if SORTBY_USING */
-	int			location;		/* operator location, or -1 if none/unknown */
+	ParseLoc	location;		/* operator location, or -1 if none/unknown */
 } SortBy;
 
 /*
@@ -566,7 +566,7 @@ typedef struct WindowDef
 	int			frameOptions;	/* frame_clause options, see below */
 	Node	   *startOffset;	/* expression for starting bound, if any */
 	Node	   *endOffset;		/* expression for ending bound, if any */
-	int			location;		/* parse location, or -1 if none/unknown */
+	ParseLoc	location;		/* parse location, or -1 if none/unknown */
 } WindowDef;
 
 /*
@@ -656,7 +656,7 @@ typedef struct RangeTableFunc
 	List	   *namespaces;		/* list of namespaces as ResTarget */
 	List	   *columns;		/* list of RangeTableFuncCol */
 	Alias	   *alias;			/* table alias & optional column aliases */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } RangeTableFunc;
 
 /*
@@ -674,7 +674,7 @@ typedef struct RangeTableFuncCol
 	bool		is_not_null;	/* does it have NOT NULL? */
 	Node	   *colexpr;		/* column filter expression */
 	Node	   *coldefexpr;		/* column default value expression */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } RangeTableFuncCol;
 
 /*
@@ -694,7 +694,7 @@ typedef struct RangeTableSample
 	List	   *method;			/* sampling method name (possibly qualified) */
 	List	   *args;			/* argument(s) for sampling method */
 	Node	   *repeatable;		/* REPEATABLE expression, or NULL if none */
-	int			location;		/* method name location, or -1 if unknown */
+	ParseLoc	location;		/* method name location, or -1 if unknown */
 } RangeTableSample;
 
 /*
@@ -737,7 +737,7 @@ typedef struct ColumnDef
 	Oid			collOid;		/* collation OID (InvalidOid if not set) */
 	List	   *constraints;	/* other constraints on column */
 	List	   *fdwoptions;		/* per-column FDW options */
-	int			location;		/* parse location, or -1 if none/unknown */
+	ParseLoc	location;		/* parse location, or -1 if none/unknown */
 } ColumnDef;
 
 /*
@@ -811,7 +811,7 @@ typedef struct DefElem
 	Node	   *arg;			/* typically Integer, Float, String, or
 								 * TypeName */
 	DefElemAction defaction;	/* unspecified action, or SET/ADD/DROP */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } DefElem;
 
 /*
@@ -841,7 +841,7 @@ typedef struct XmlSerialize
 	Node	   *expr;
 	TypeName   *typeName;
 	bool		indent;			/* [NO] INDENT */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } XmlSerialize;
 
 /* Partitioning related definitions */
@@ -859,7 +859,7 @@ typedef struct PartitionElem
 	Node	   *expr;			/* expression to partition on, or NULL */
 	List	   *collation;		/* name of collation; NIL = default */
 	List	   *opclass;		/* name of desired opclass; NIL = default */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } PartitionElem;
 
 typedef enum PartitionStrategy
@@ -879,7 +879,7 @@ typedef struct PartitionSpec
 	NodeTag		type;
 	PartitionStrategy strategy;
 	List	   *partParams;		/* List of PartitionElems */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } PartitionSpec;
 
 /*
@@ -906,7 +906,7 @@ struct PartitionBoundSpec
 	List	   *lowerdatums;	/* List of PartitionRangeDatums */
 	List	   *upperdatums;	/* List of PartitionRangeDatums */
 
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 };
 
 /*
@@ -929,7 +929,7 @@ typedef struct PartitionRangeDatum
 	Node	   *value;			/* Const (or A_Const in raw tree), if kind is
 								 * PARTITION_RANGE_DATUM_VALUE, else NULL */
 
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } PartitionRangeDatum;
 
 /*
@@ -1465,7 +1465,7 @@ typedef struct GroupingSet
 	NodeTag		type;
 	GroupingSetKind kind pg_node_attr(query_jumble_ignore);
 	List	   *content;
-	int			location;
+	ParseLoc	location;
 } GroupingSet;
 
 /*
@@ -1553,7 +1553,7 @@ typedef struct WithClause
 	NodeTag		type;
 	List	   *ctes;			/* list of CommonTableExprs */
 	bool		recursive;		/* true = WITH RECURSIVE */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } WithClause;
 
 /*
@@ -1568,7 +1568,7 @@ typedef struct InferClause
 	List	   *indexElems;		/* IndexElems to infer unique index */
 	Node	   *whereClause;	/* qualification (partial-index predicate) */
 	char	   *conname;		/* Constraint name, or NULL if unnamed */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } InferClause;
 
 /*
@@ -1584,7 +1584,7 @@ typedef struct OnConflictClause
 	InferClause *infer;			/* Optional index inference clause */
 	List	   *targetList;		/* the target list (of ResTarget) */
 	Node	   *whereClause;	/* qualifications */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } OnConflictClause;
 
 /*
@@ -1605,7 +1605,7 @@ typedef struct CTESearchClause
 	List	   *search_col_list;
 	bool		search_breadth_first;
 	char	   *search_seq_column;
-	int			location;
+	ParseLoc	location;
 } CTESearchClause;
 
 typedef struct CTECycleClause
@@ -1616,7 +1616,7 @@ typedef struct CTECycleClause
 	Node	   *cycle_mark_value;
 	Node	   *cycle_mark_default;
 	char	   *cycle_path_column;
-	int			location;
+	ParseLoc	location;
 	/* These fields are set during parse analysis: */
 	Oid			cycle_mark_type;	/* common type of _value and _default */
 	int			cycle_mark_typmod;
@@ -1640,7 +1640,7 @@ typedef struct CommonTableExpr
 	Node	   *ctequery;		/* the CTE's subquery */
 	CTESearchClause *search_clause pg_node_attr(query_jumble_ignore);
 	CTECycleClause *cycle_clause pg_node_attr(query_jumble_ignore);
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 	/* These fields are set during parse analysis: */
 	/* is this CTE actually recursive? */
 	bool		cterecursive pg_node_attr(query_jumble_ignore);
@@ -1736,7 +1736,7 @@ typedef struct JsonParseExpr
 	JsonValueExpr *expr;		/* string expression */
 	JsonOutput *output;			/* RETURNING clause, if specified */
 	bool		unique_keys;	/* WITH UNIQUE KEYS? */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } JsonParseExpr;
 
 /*
@@ -1748,7 +1748,7 @@ typedef struct JsonScalarExpr
 	NodeTag		type;
 	Expr	   *expr;			/* scalar expression */
 	JsonOutput *output;			/* RETURNING clause, if specified */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } JsonScalarExpr;
 
 /*
@@ -1760,7 +1760,7 @@ typedef struct JsonSerializeExpr
 	NodeTag		type;
 	JsonValueExpr *expr;		/* json value expression */
 	JsonOutput *output;			/* RETURNING clause, if specified  */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } JsonSerializeExpr;
 
 /*
@@ -1774,7 +1774,7 @@ typedef struct JsonObjectConstructor
 	JsonOutput *output;			/* RETURNING clause, if specified  */
 	bool		absent_on_null; /* skip NULL values? */
 	bool		unique;			/* check key uniqueness? */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } JsonObjectConstructor;
 
 /*
@@ -1787,7 +1787,7 @@ typedef struct JsonArrayConstructor
 	List	   *exprs;			/* list of JsonValueExpr elements */
 	JsonOutput *output;			/* RETURNING clause, if specified  */
 	bool		absent_on_null; /* skip NULL elements? */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } JsonArrayConstructor;
 
 /*
@@ -1801,7 +1801,7 @@ typedef struct JsonArrayQueryConstructor
 	JsonOutput *output;			/* RETURNING clause, if specified  */
 	JsonFormat *format;			/* FORMAT clause for subquery, if specified */
 	bool		absent_on_null; /* skip NULL elements? */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } JsonArrayQueryConstructor;
 
 /*
@@ -1816,7 +1816,7 @@ typedef struct JsonAggConstructor
 	Node	   *agg_filter;		/* FILTER clause, if any */
 	List	   *agg_order;		/* ORDER BY clause, if any */
 	struct WindowDef *over;		/* OVER clause, if any */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } JsonAggConstructor;
 
 /*
@@ -1870,8 +1870,8 @@ typedef struct RawStmt
 
 	NodeTag		type;
 	Node	   *stmt;			/* raw parse tree */
-	int			stmt_location;	/* start location, or -1 if unknown */
-	int			stmt_len;		/* length in bytes; 0 means "rest of string" */
+	ParseLoc	stmt_location;	/* start location, or -1 if unknown */
+	ParseLoc	stmt_len;		/* length in bytes; 0 means "rest of string" */
 } RawStmt;
 
 /*****************************************************************************
@@ -2078,7 +2078,7 @@ typedef struct PLAssignStmt
 	List	   *indirection;	/* subscripts and field names, if any */
 	int			nnames;			/* number of names to use in ColumnRef */
 	SelectStmt *val;			/* the PL/pgSQL expression to assign */
-	int			location;		/* name's token location, or -1 if unknown */
+	ParseLoc	location;		/* name's token location, or -1 if unknown */
 } PLAssignStmt;
 
 
@@ -2620,7 +2620,7 @@ typedef struct Constraint
 	Oid			old_pktable_oid;	/* pg_constraint.confrelid of my former
 									 * self */
 
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } Constraint;
 
 /* ----------------------
@@ -3527,7 +3527,7 @@ typedef struct TransactionStmt
 	char	   *gid pg_node_attr(query_jumble_ignore);
 	bool		chain;			/* AND CHAIN option */
 	/* token location, or -1 if unknown */
-	int			location pg_node_attr(query_jumble_location);
+	ParseLoc	location pg_node_attr(query_jumble_location);
 } TransactionStmt;
 
 /* ----------------------
@@ -3913,7 +3913,7 @@ typedef struct DeallocateStmt
 	/* true if DEALLOCATE ALL */
 	bool		isall;
 	/* token location, or -1 if unknown */
-	int			location pg_node_attr(query_jumble_location);
+	ParseLoc	location pg_node_attr(query_jumble_location);
 } DeallocateStmt;
 
 /*
@@ -4001,7 +4001,7 @@ typedef struct PublicationObjSpec
 	PublicationObjSpecType pubobjtype;	/* type of this publication object */
 	char	   *name;
 	PublicationTable *pubtable;
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } PublicationObjSpec;
 
 typedef struct CreatePublicationStmt
diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h
index 4a154606d2..ade7e09175 100644
--- a/src/include/nodes/primnodes.h
+++ b/src/include/nodes/primnodes.h
@@ -30,6 +30,8 @@ typedef enum OverridingKind
 } OverridingKind;
 
 
+typedef int ParseLoc;
+
 /* ----------------------------------------------------------------
  *						node definitions
  * ----------------------------------------------------------------
@@ -91,7 +93,7 @@ typedef struct RangeVar
 	Alias	   *alias;
 
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } RangeVar;
 
 /*
@@ -128,7 +130,7 @@ typedef struct TableFunc
 	/* counts from 0; -1 if none specified */
 	int			ordinalitycol pg_node_attr(query_jumble_ignore);
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } TableFunc;
 
 /*
@@ -276,7 +278,7 @@ typedef struct Var
 	AttrNumber	varattnosyn pg_node_attr(equal_ignore, query_jumble_ignore);
 
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } Var;
 
 /*
@@ -318,7 +320,7 @@ typedef struct Const
 	 * token location, or -1 if unknown.  All constants are tracked as
 	 * locations in query jumbling, to be marked as parameters.
 	 */
-	int			location pg_node_attr(query_jumble_location);
+	ParseLoc	location pg_node_attr(query_jumble_location);
 } Const;
 
 /*
@@ -367,7 +369,7 @@ typedef struct Param
 	/* OID of collation, or InvalidOid if none */
 	Oid			paramcollid pg_node_attr(query_jumble_ignore);
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } Param;
 
 /*
@@ -490,7 +492,7 @@ typedef struct Aggref
 	int			aggtransno pg_node_attr(query_jumble_ignore);
 
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } Aggref;
 
 /*
@@ -537,7 +539,7 @@ typedef struct GroupingFunc
 	Index		agglevelsup;
 
 	/* token location */
-	int			location;
+	ParseLoc	location;
 } GroupingFunc;
 
 /*
@@ -568,7 +570,7 @@ typedef struct WindowFunc
 	/* is function a simple aggregate? */
 	bool		winagg pg_node_attr(query_jumble_ignore);
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } WindowFunc;
 
 /*
@@ -702,7 +704,7 @@ typedef struct FuncExpr
 	/* arguments to the function */
 	List	   *args;
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } FuncExpr;
 
 /*
@@ -729,7 +731,7 @@ typedef struct NamedArgExpr
 	/* argument's number in positional notation */
 	int			argnumber;
 	/* argument name location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } NamedArgExpr;
 
 /*
@@ -771,7 +773,7 @@ typedef struct OpExpr
 	List	   *args;
 
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } OpExpr;
 
 /*
@@ -851,7 +853,7 @@ typedef struct ScalarArrayOpExpr
 	List	   *args;
 
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } ScalarArrayOpExpr;
 
 /*
@@ -873,7 +875,7 @@ typedef struct BoolExpr
 	Expr		xpr;
 	BoolExprType boolop;
 	List	   *args;			/* arguments to this expression */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } BoolExpr;
 
 /*
@@ -950,7 +952,7 @@ typedef struct SubLink
 	List	   *operName pg_node_attr(query_jumble_ignore);
 	/* subselect as Query* or raw parsetree */
 	Node	   *subselect;
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } SubLink;
 
 /*
@@ -1124,7 +1126,7 @@ typedef struct RelabelType
 	Oid			resultcollid pg_node_attr(query_jumble_ignore);
 	/* how to display this node */
 	CoercionForm relabelformat pg_node_attr(query_jumble_ignore);
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } RelabelType;
 
 /* ----------------
@@ -1146,7 +1148,7 @@ typedef struct CoerceViaIO
 	Oid			resultcollid pg_node_attr(query_jumble_ignore);
 	/* how to display this node */
 	CoercionForm coerceformat pg_node_attr(query_jumble_ignore);
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } CoerceViaIO;
 
 /* ----------------
@@ -1174,7 +1176,7 @@ typedef struct ArrayCoerceExpr
 	Oid			resultcollid pg_node_attr(query_jumble_ignore);
 	/* how to display this node */
 	CoercionForm coerceformat pg_node_attr(query_jumble_ignore);
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } ArrayCoerceExpr;
 
 /* ----------------
@@ -1198,7 +1200,7 @@ typedef struct ConvertRowtypeExpr
 	/* Like RowExpr, we deliberately omit a typmod and collation here */
 	/* how to display this node */
 	CoercionForm convertformat pg_node_attr(query_jumble_ignore);
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } ConvertRowtypeExpr;
 
 /*----------
@@ -1213,7 +1215,7 @@ typedef struct CollateExpr
 	Expr		xpr;
 	Expr	   *arg;			/* input expression */
 	Oid			collOid;		/* collation's OID */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } CollateExpr;
 
 /*----------
@@ -1248,7 +1250,7 @@ typedef struct CaseExpr
 	Expr	   *arg;			/* implicit equality comparison argument */
 	List	   *args;			/* the arguments (list of WHEN clauses) */
 	Expr	   *defresult;		/* the default result (ELSE clause) */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } CaseExpr;
 
 /*
@@ -1259,7 +1261,7 @@ typedef struct CaseWhen
 	Expr		xpr;
 	Expr	   *expr;			/* condition expression */
 	Expr	   *result;			/* substitution result */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } CaseWhen;
 
 /*
@@ -1316,7 +1318,7 @@ typedef struct ArrayExpr
 	/* true if elements are sub-arrays */
 	bool		multidims pg_node_attr(query_jumble_ignore);
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } ArrayExpr;
 
 /*
@@ -1367,7 +1369,7 @@ typedef struct RowExpr
 	/* list of String, or NIL */
 	List	   *colnames pg_node_attr(query_jumble_ignore);
 
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } RowExpr;
 
 /*
@@ -1426,7 +1428,7 @@ typedef struct CoalesceExpr
 	/* the arguments */
 	List	   *args;
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } CoalesceExpr;
 
 /*
@@ -1452,7 +1454,7 @@ typedef struct MinMaxExpr
 	/* the arguments */
 	List	   *args;
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } MinMaxExpr;
 
 /*
@@ -1496,7 +1498,7 @@ typedef struct SQLValueFunction
 	 */
 	Oid			type pg_node_attr(query_jumble_ignore);
 	int32		typmod;
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } SQLValueFunction;
 
 /*
@@ -1549,7 +1551,7 @@ typedef struct XmlExpr
 	Oid			type pg_node_attr(query_jumble_ignore);
 	int32		typmod pg_node_attr(query_jumble_ignore);
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } XmlExpr;
 
 /*
@@ -1585,7 +1587,7 @@ typedef struct JsonFormat
 	NodeTag		type;
 	JsonFormatType format_type; /* format type */
 	JsonEncoding encoding;		/* JSON encoding */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } JsonFormat;
 
 /*
@@ -1641,7 +1643,7 @@ typedef struct JsonConstructorExpr
 	JsonReturning *returning;	/* RETURNING clause */
 	bool		absent_on_null; /* ABSENT ON NULL? */
 	bool		unique;			/* WITH UNIQUE KEYS? (JSON_OBJECT[AGG] only) */
-	int			location;
+	ParseLoc	location;
 } JsonConstructorExpr;
 
 /*
@@ -1667,7 +1669,7 @@ typedef struct JsonIsPredicate
 	JsonFormat *format;			/* FORMAT clause, if specified */
 	JsonValueType item_type;	/* JSON item type */
 	bool		unique_keys;	/* check key uniqueness? */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } JsonIsPredicate;
 
 /* ----------------
@@ -1701,7 +1703,7 @@ typedef struct NullTest
 	NullTestType nulltesttype;	/* IS NULL, IS NOT NULL */
 	/* T to perform field-by-field null checks */
 	bool		argisrow pg_node_attr(query_jumble_ignore);
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } NullTest;
 
 /*
@@ -1723,7 +1725,7 @@ typedef struct BooleanTest
 	Expr		xpr;
 	Expr	   *arg;			/* input expression */
 	BoolTestType booltesttype;	/* test type */
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } BooleanTest;
 
 
@@ -1765,7 +1767,7 @@ typedef struct CoerceToDomain
 	Oid			resultcollid pg_node_attr(query_jumble_ignore);
 	/* how to display this node */
 	CoercionForm coercionformat pg_node_attr(query_jumble_ignore);
-	int			location;		/* token location, or -1 if unknown */
+	ParseLoc	location;		/* token location, or -1 if unknown */
 } CoerceToDomain;
 
 /*
@@ -1787,7 +1789,7 @@ typedef struct CoerceToDomainValue
 	/* collation for the substituted value */
 	Oid			collation pg_node_attr(query_jumble_ignore);
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } CoerceToDomainValue;
 
 /*
@@ -1807,7 +1809,7 @@ typedef struct SetToDefault
 	/* collation for the substituted value */
 	Oid			collation pg_node_attr(query_jumble_ignore);
 	/* token location, or -1 if unknown */
-	int			location;
+	ParseLoc	location;
 } SetToDefault;
 
 /*
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index d3a7f75b08..4aeba2a4ff 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -2218,6 +2218,7 @@ QueryEnvironment
 QueryInfo
 QueryItem
 QueryItemType
+QueryLoc
 QueryMode
 QueryOperand
 QueryOperator
-- 
2.40.1