Thread

  1. [PATCH] add Location to IndexElem

    Álvaro Herrera <alvherre@kurilemu.de> — 2025-12-12T13:22:00Z

    ---
     src/backend/nodes/nodeFuncs.c     | 3 +++
     src/backend/parser/gram.y         | 5 +++++
     src/backend/parser/parse_clause.c | 8 ++++----
     src/include/nodes/parsenodes.h    | 1 +
     4 files changed, 13 insertions(+), 4 deletions(-)
    
    diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c
    index 024a2b2fd84..89b7d80c0aa 100644
    --- a/src/backend/nodes/nodeFuncs.c
    +++ b/src/backend/nodes/nodeFuncs.c
    @@ -1726,6 +1726,9 @@ exprLocation(const Node *expr)
     		case T_ColumnDef:
     			loc = ((const ColumnDef *) expr)->location;
     			break;
    +		case T_IndexElem:
    +			loc = ((const IndexElem *) expr)->location;
    +			break;
     		case T_Constraint:
     			loc = ((const Constraint *) expr)->location;
     			break;
    diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
    index 7856ce9d78f..a9bad1bff04 100644
    --- a/src/backend/parser/gram.y
    +++ b/src/backend/parser/gram.y
    @@ -8402,6 +8402,7 @@ index_elem_options:
     			$$->opclassopts = NIL;
     			$$->ordering = $3;
     			$$->nulls_ordering = $4;
    +			$$->location = @1;
     		}
     	| opt_collate any_name reloptions opt_asc_desc opt_nulls_order
     		{
    @@ -8414,6 +8415,7 @@ index_elem_options:
     			$$->opclassopts = $3;
     			$$->ordering = $4;
     			$$->nulls_ordering = $5;
    +			$$->location = @1;
     		}
     	;
     
    @@ -8426,16 +8428,19 @@ index_elem: ColId index_elem_options
     				{
     					$$ = $2;
     					$$->name = $1;
    +					$$->location = @1;
     				}
     			| func_expr_windowless index_elem_options
     				{
     					$$ = $2;
     					$$->expr = $1;
    +					$$->location = @1;
     				}
     			| '(' a_expr ')' index_elem_options
     				{
     					$$ = $4;
     					$$->expr = $2;
    +					$$->location = @1;
     				}
     		;
     
    diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
    index 57609e2d55c..34693c8a9e6 100644
    --- a/src/backend/parser/parse_clause.c
    +++ b/src/backend/parser/parse_clause.c
    @@ -3289,20 +3289,20 @@ resolve_unique_index_expr(ParseState *pstate, InferClause *infer,
     					 errmsg("%s is not allowed in ON CONFLICT clause",
     							"ASC/DESC"),
     					 parser_errposition(pstate,
    -										exprLocation((Node *) infer))));
    +										exprLocation((Node *) ielem))));
     		if (ielem->nulls_ordering != SORTBY_NULLS_DEFAULT)
     			ereport(ERROR,
     					(errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
     					 errmsg("%s is not allowed in ON CONFLICT clause",
     							"NULLS FIRST/LAST"),
     					 parser_errposition(pstate,
    -										exprLocation((Node *) infer))));
    +										exprLocation((Node *) ielem))));
     		if (ielem->opclassopts)
     			ereport(ERROR,
     					errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
     					errmsg("operator class options are not allowed in ON CONFLICT clause"),
     					parser_errposition(pstate,
    -									   exprLocation((Node *) infer)));
    +									   exprLocation((Node *) ielem)));
     
     		if (!ielem->expr)
     		{
    @@ -3342,7 +3342,7 @@ resolve_unique_index_expr(ParseState *pstate, InferClause *infer,
     			pInfer->infercollid = InvalidOid;
     		else
     			pInfer->infercollid = LookupCollation(pstate, ielem->collation,
    -												  exprLocation(pInfer->expr));
    +												  exprLocation((Node *) ielem));
     
     		if (!ielem->opclass)
     			pInfer->inferopclass = InvalidOid;
    diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
    index d14294a4ece..48738aa26f0 100644
    --- a/src/include/nodes/parsenodes.h
    +++ b/src/include/nodes/parsenodes.h
    @@ -816,6 +816,7 @@ typedef struct IndexElem
     	List	   *opclassopts;	/* opclass-specific options, or NIL */
     	SortByDir	ordering;		/* ASC/DESC/default */
     	SortByNulls nulls_ordering; /* FIRST/LAST/default */
    +	ParseLoc	location;		/* token location, or -1 if unknown */
     } IndexElem;
     
     /*
    -- 
    2.47.3
    
    
    --vh6gt2temeq3zvst--