[PATCH] add Location to IndexElem
Álvaro Herrera <alvherre@kurilemu.de>
From: Álvaro Herrera <alvherre@kurilemu.de>
To:
Date: 2025-12-12T13:22:00Z
Lists: pgsql-hackers
---
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--