From 9610fb53586fccee1f6bb361607706e73d8a1cba Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@bowt.ie>
Date: Mon, 23 May 2016 11:17:16 -0700
Subject: [PATCH] Add IndexElem to raw_expression_tree_walker()

INSERT ... ON CONFLICT unique index inference reused IndexElem nodes
within its raw parse tree.  IndexElems were previously only used for
CREATE INDEX.  There was never an IndexElem handler within
raw_expression_tree_walker(), presumably because of the assumption that
IndexElem was used exclusively by utility statements, and as such
required no handler.  That assumption is now clearly obsolete.  This can
be shown easily by executing a statement with a WITH RECURSIVE CTE that
contains INSERT ...  ON CONFLICT ...  RETURNING.

Per bug #14153 from Thomas Alton.  Backpatch to 9.5, where ON CONFLICT
was added.
---
 src/backend/nodes/nodeFuncs.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c
index 7bc5be1..5e03efe 100644
--- a/src/backend/nodes/nodeFuncs.c
+++ b/src/backend/nodes/nodeFuncs.c
@@ -3370,6 +3370,18 @@ raw_expression_tree_walker(Node *node,
 				/* for now, constraints are ignored */
 			}
 			break;
+		case T_IndexElem:
+			{
+				IndexElem  *indelem = (IndexElem *) node;
+
+				if (walker(indelem->expr, context))
+					return true;
+				if (walker(indelem->collation, context))
+					return true;
+				if (walker(indelem->opclass, context))
+					return true;
+			}
+			break;
 		case T_GroupingSet:
 			return walker(((GroupingSet *) node)->content, context);
 		case T_LockingClause:
-- 
2.7.4

