aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/selfuncs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/selfuncs.c')
-rw-r--r--src/backend/utils/adt/selfuncs.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index db1792bf8d4..7361e9d43ca 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -1816,10 +1816,19 @@ strip_array_coercion(Node *node)
{
for (;;)
{
- if (node && IsA(node, ArrayCoerceExpr) &&
- ((ArrayCoerceExpr *) node)->elemfuncid == InvalidOid)
+ if (node && IsA(node, ArrayCoerceExpr))
{
- node = (Node *) ((ArrayCoerceExpr *) node)->arg;
+ ArrayCoerceExpr *acoerce = (ArrayCoerceExpr *) node;
+
+ /*
+ * If the per-element expression is just a RelabelType on top of
+ * CaseTestExpr, then we know it's a binary-compatible relabeling.
+ */
+ if (IsA(acoerce->elemexpr, RelabelType) &&
+ IsA(((RelabelType *) acoerce->elemexpr)->arg, CaseTestExpr))
+ node = (Node *) acoerce->arg;
+ else
+ break;
}
else if (node && IsA(node, RelabelType))
{