From fa3e4d157867935dc1c22a1132e9a4c3254acb26 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 v7 3/8] gen_node_support.pl: Mark location fields as type
 alias Location

Instead of the rather ugly type=int + name ~= location$, we now have a
special 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 +++++++++++----------
 3 files changed, 86 insertions(+), 84 deletions(-)

diff --git a/src/backend/nodes/gen_node_support.pl b/src/backend/nodes/gen_node_support.pl
index 487f6f7728..ec850c3484 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 'Location')
 		{
 			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 'Location')
 		{
 			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 'Location')
 		{
 			# 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 baa6a97c7e..37e4c53ebe 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -225,9 +225,9 @@ typedef struct Query
 	 * both be -1 meaning "unknown".
 	 */
 	/* start location, or -1 if unknown */
-	int			stmt_location;
+	Location	stmt_location;
 	/* length in bytes; 0 means "rest of string" */
-	int			stmt_len pg_node_attr(query_jumble_ignore);
+	Location	stmt_len pg_node_attr(query_jumble_ignore);
 } Query;
 
 
@@ -262,7 +262,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } TypeName;
 
 /*
@@ -282,7 +282,7 @@ typedef struct ColumnRef
 {
 	NodeTag		type;
 	List	   *fields;			/* field names (String nodes) or A_Star */
-	int			location;		/* token location, or -1 if unknown */
+	Location	location;		/* token location, or -1 if unknown */
 } ColumnRef;
 
 /*
@@ -292,7 +292,7 @@ typedef struct ParamRef
 {
 	NodeTag		type;
 	int			number;			/* the number of the parameter */
-	int			location;		/* token location, or -1 if unknown */
+	Location	location;		/* token location, or -1 if unknown */
 } ParamRef;
 
 /*
@@ -325,7 +325,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } A_Expr;
 
 /*
@@ -351,7 +351,7 @@ typedef struct A_Const
 	NodeTag		type;
 	union ValUnion val;
 	bool		isnull;			/* SQL NULL constant */
-	int			location;		/* token location, or -1 if unknown */
+	Location	location;		/* token location, or -1 if unknown */
 } A_Const;
 
 /*
@@ -362,7 +362,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } TypeCast;
 
 /*
@@ -373,7 +373,7 @@ typedef struct CollateClause
 	NodeTag		type;
 	Node	   *arg;			/* input expression */
 	List	   *collname;		/* possibly-qualified collation name */
-	int			location;		/* token location, or -1 if unknown */
+	Location	location;		/* token location, or -1 if unknown */
 } CollateClause;
 
 /*
@@ -393,7 +393,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } RoleSpec;
 
 /*
@@ -423,7 +423,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } FuncCall;
 
 /*
@@ -480,7 +480,7 @@ typedef struct A_ArrayExpr
 {
 	NodeTag		type;
 	List	   *elements;		/* array element expressions */
-	int			location;		/* token location, or -1 if unknown */
+	Location	location;		/* token location, or -1 if unknown */
 } A_ArrayExpr;
 
 /*
@@ -507,7 +507,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } ResTarget;
 
 /*
@@ -537,7 +537,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 */
+	Location	location;		/* operator location, or -1 if none/unknown */
 } SortBy;
 
 /*
@@ -558,7 +558,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 */
+	Location	location;		/* parse location, or -1 if none/unknown */
 } WindowDef;
 
 /*
@@ -648,7 +648,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } RangeTableFunc;
 
 /*
@@ -666,7 +666,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } RangeTableFuncCol;
 
 /*
@@ -686,7 +686,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 */
+	Location	location;		/* method name location, or -1 if unknown */
 } RangeTableSample;
 
 /*
@@ -729,7 +729,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 */
+	Location	location;		/* parse location, or -1 if none/unknown */
 } ColumnDef;
 
 /*
@@ -803,7 +803,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } DefElem;
 
 /*
@@ -833,7 +833,7 @@ typedef struct XmlSerialize
 	Node	   *expr;
 	TypeName   *typeName;
 	bool		indent;			/* [NO] INDENT */
-	int			location;		/* token location, or -1 if unknown */
+	Location	location;		/* token location, or -1 if unknown */
 } XmlSerialize;
 
 /* Partitioning related definitions */
@@ -851,7 +851,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } PartitionElem;
 
 typedef enum PartitionStrategy
@@ -871,7 +871,7 @@ typedef struct PartitionSpec
 	NodeTag		type;
 	PartitionStrategy strategy;
 	List	   *partParams;		/* List of PartitionElems */
-	int			location;		/* token location, or -1 if unknown */
+	Location	location;		/* token location, or -1 if unknown */
 } PartitionSpec;
 
 /*
@@ -898,7 +898,7 @@ struct PartitionBoundSpec
 	List	   *lowerdatums;	/* List of PartitionRangeDatums */
 	List	   *upperdatums;	/* List of PartitionRangeDatums */
 
-	int			location;		/* token location, or -1 if unknown */
+	Location	location;		/* token location, or -1 if unknown */
 };
 
 /*
@@ -921,7 +921,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } PartitionRangeDatum;
 
 /*
@@ -1454,7 +1454,7 @@ typedef struct GroupingSet
 	NodeTag		type;
 	GroupingSetKind kind pg_node_attr(query_jumble_ignore);
 	List	   *content;
-	int			location;
+	Location	location;
 } GroupingSet;
 
 /*
@@ -1542,7 +1542,7 @@ typedef struct WithClause
 	NodeTag		type;
 	List	   *ctes;			/* list of CommonTableExprs */
 	bool		recursive;		/* true = WITH RECURSIVE */
-	int			location;		/* token location, or -1 if unknown */
+	Location	location;		/* token location, or -1 if unknown */
 } WithClause;
 
 /*
@@ -1557,7 +1557,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } InferClause;
 
 /*
@@ -1573,7 +1573,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } OnConflictClause;
 
 /*
@@ -1594,7 +1594,7 @@ typedef struct CTESearchClause
 	List	   *search_col_list;
 	bool		search_breadth_first;
 	char	   *search_seq_column;
-	int			location;
+	Location	location;
 } CTESearchClause;
 
 typedef struct CTECycleClause
@@ -1605,7 +1605,7 @@ typedef struct CTECycleClause
 	Node	   *cycle_mark_value;
 	Node	   *cycle_mark_default;
 	char	   *cycle_path_column;
-	int			location;
+	Location	location;
 	/* These fields are set during parse analysis: */
 	Oid			cycle_mark_type;	/* common type of _value and _default */
 	int			cycle_mark_typmod;
@@ -1629,7 +1629,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 */
+	Location	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);
@@ -1725,7 +1725,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } JsonParseExpr;
 
 /*
@@ -1737,7 +1737,7 @@ typedef struct JsonScalarExpr
 	NodeTag		type;
 	Expr	   *expr;			/* scalar expression */
 	JsonOutput *output;			/* RETURNING clause, if specified */
-	int			location;		/* token location, or -1 if unknown */
+	Location	location;		/* token location, or -1 if unknown */
 } JsonScalarExpr;
 
 /*
@@ -1749,7 +1749,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } JsonSerializeExpr;
 
 /*
@@ -1763,7 +1763,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } JsonObjectConstructor;
 
 /*
@@ -1776,7 +1776,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } JsonArrayConstructor;
 
 /*
@@ -1790,7 +1790,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } JsonArrayQueryConstructor;
 
 /*
@@ -1805,7 +1805,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 */
+	Location	location;		/* token location, or -1 if unknown */
 } JsonAggConstructor;
 
 /*
@@ -1859,8 +1859,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" */
+	Location	stmt_location;	/* start location, or -1 if unknown */
+	Location	stmt_len;		/* length in bytes; 0 means "rest of string" */
 } RawStmt;
 
 /*****************************************************************************
@@ -2067,7 +2067,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 */
+	Location	location;		/* name's token location, or -1 if unknown */
 } PLAssignStmt;
 
 
@@ -2609,7 +2609,7 @@ typedef struct Constraint
 	Oid			old_pktable_oid;	/* pg_constraint.confrelid of my former
 									 * self */
 
-	int			location;		/* token location, or -1 if unknown */
+	Location	location;		/* token location, or -1 if unknown */
 } Constraint;
 
 /* ----------------------
@@ -3516,7 +3516,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);
+	Location	location pg_node_attr(query_jumble_location);
 } TransactionStmt;
 
 /* ----------------------
@@ -3902,7 +3902,7 @@ typedef struct DeallocateStmt
 	/* true if DEALLOCATE ALL */
 	bool		isall;
 	/* token location, or -1 if unknown */
-	int			location pg_node_attr(query_jumble_location);
+	Location	location pg_node_attr(query_jumble_location);
 } DeallocateStmt;
 
 /*
@@ -3990,7 +3990,7 @@ typedef struct PublicationObjSpec
 	PublicationObjSpecType pubobjtype;	/* type of this publication object */
 	char	   *name;
 	PublicationTable *pubtable;
-	int			location;		/* token location, or -1 if unknown */
+	Location	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..557be05657 100644
--- a/src/include/nodes/primnodes.h
+++ b/src/include/nodes/primnodes.h
@@ -30,6 +30,8 @@ typedef enum OverridingKind
 } OverridingKind;
 
 
+#define Location int
+
 /* ----------------------------------------------------------------
  *						node definitions
  * ----------------------------------------------------------------
@@ -91,7 +93,7 @@ typedef struct RangeVar
 	Alias	   *alias;
 
 	/* token location, or -1 if unknown */
-	int			location;
+	Location	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;
+	Location	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;
+	Location	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);
+	Location	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;
+	Location	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;
+	Location	location;
 } Aggref;
 
 /*
@@ -537,7 +539,7 @@ typedef struct GroupingFunc
 	Index		agglevelsup;
 
 	/* token location */
-	int			location;
+	Location	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;
+	Location	location;
 } WindowFunc;
 
 /*
@@ -702,7 +704,7 @@ typedef struct FuncExpr
 	/* arguments to the function */
 	List	   *args;
 	/* token location, or -1 if unknown */
-	int			location;
+	Location	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;
+	Location	location;
 } NamedArgExpr;
 
 /*
@@ -771,7 +773,7 @@ typedef struct OpExpr
 	List	   *args;
 
 	/* token location, or -1 if unknown */
-	int			location;
+	Location	location;
 } OpExpr;
 
 /*
@@ -851,7 +853,7 @@ typedef struct ScalarArrayOpExpr
 	List	   *args;
 
 	/* token location, or -1 if unknown */
-	int			location;
+	Location	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 */
+	Location	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 */
+	Location	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 */
+	Location	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 */
+	Location	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 */
+	Location	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 */
+	Location	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 */
+	Location	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 */
+	Location	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 */
+	Location	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;
+	Location	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 */
+	Location	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;
+	Location	location;
 } CoalesceExpr;
 
 /*
@@ -1452,7 +1454,7 @@ typedef struct MinMaxExpr
 	/* the arguments */
 	List	   *args;
 	/* token location, or -1 if unknown */
-	int			location;
+	Location	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 */
+	Location	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;
+	Location	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 */
+	Location	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;
+	Location	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 */
+	Location	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 */
+	Location	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 */
+	Location	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 */
+	Location	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;
+	Location	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;
+	Location	location;
 } SetToDefault;
 
 /*
-- 
2.40.1

