aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/util/tlist.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/util/tlist.c')
-rw-r--r--src/backend/optimizer/util/tlist.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/backend/optimizer/util/tlist.c b/src/backend/optimizer/util/tlist.c
index 1e507235c53..e58fe7dc7f1 100644
--- a/src/backend/optimizer/util/tlist.c
+++ b/src/backend/optimizer/util/tlist.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/util/tlist.c,v 1.74 2007/01/05 22:19:33 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/util/tlist.c,v 1.75 2007/11/08 19:25:37 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -45,6 +45,34 @@ tlist_member(Node *node, List *targetlist)
}
/*
+ * tlist_member_ignore_relabel
+ * Same as above, except that we ignore top-level RelabelType nodes
+ * while checking for a match. This is needed for some scenarios
+ * involving binary-compatible sort operations.
+ */
+TargetEntry *
+tlist_member_ignore_relabel(Node *node, List *targetlist)
+{
+ ListCell *temp;
+
+ while (node && IsA(node, RelabelType))
+ node = (Node *) ((RelabelType *) node)->arg;
+
+ foreach(temp, targetlist)
+ {
+ TargetEntry *tlentry = (TargetEntry *) lfirst(temp);
+ Expr *tlexpr = tlentry->expr;
+
+ while (tlexpr && IsA(tlexpr, RelabelType))
+ tlexpr = ((RelabelType *) tlexpr)->arg;
+
+ if (equal(node, tlexpr))
+ return tlentry;
+ }
+ return NULL;
+}
+
+/*
* flatten_tlist
* Create a target list that only contains unique variables.
*