diff --git a/contrib/postgres_fdw/deparse.c b/contrib/postgres_fdw/deparse.c index 8fc66fa11c..2f4ed33173 100644 --- a/contrib/postgres_fdw/deparse.c +++ b/contrib/postgres_fdw/deparse.c @@ -3914,11 +3914,11 @@ appendOrderByClause(List *pathkeys, bool has_final_sort, int nestlevel; const char *delim = " "; StringInfo buf = context->buf; + bool gotone = false; /* Make sure any constants in the exprs are printed portably */ nestlevel = set_transmission_modes(); - appendStringInfoString(buf, " ORDER BY"); foreach(lcell, pathkeys) { PathKey *pathkey = lfirst(lcell); @@ -3949,6 +3949,21 @@ appendOrderByClause(List *pathkeys, bool has_final_sort, if (em == NULL) elog(ERROR, "could not find pathkey item to sort"); + /* + * If the member just has a Const expression then we needn't add it to + * the ORDER BY clause. This can happen in UNION ALL queries where the + * union child targetlist has a Const. Adding these would be wasteful, + * but also, for INT columns, putting an integer literal will be seen + * as an ordinal column position rather than a value to sort by, so we + * must skip these. + */ + if (IsA(em->em_expr, Const)) + continue; + + if (!gotone) + appendStringInfoString(buf, " ORDER BY"); + gotone = true; + em_expr = em->em_expr; /*