aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_clause.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser/parse_clause.c')
-rw-r--r--src/backend/parser/parse_clause.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index fcee1379c0c..4931dcad3b6 100644
--- a/src/backend/parser/parse_clause.c
+++ b/src/backend/parser/parse_clause.c
@@ -332,7 +332,8 @@ transformJoinUsingClause(ParseState *pstate,
RangeTblEntry *leftRTE, RangeTblEntry *rightRTE,
List *leftVars, List *rightVars)
{
- Node *result = NULL;
+ Node *result;
+ List *andargs = NIL;
ListCell *lvars,
*rvars;
@@ -358,18 +359,16 @@ transformJoinUsingClause(ParseState *pstate,
copyObject(lvar), copyObject(rvar),
-1);
- /* And combine into an AND clause, if multiple join columns */
- if (result == NULL)
- result = (Node *) e;
- else
- {
- A_Expr *a;
-
- a = makeA_Expr(AEXPR_AND, NIL, result, (Node *) e, -1);
- result = (Node *) a;
- }
+ /* Prepare to combine into an AND clause, if multiple join columns */
+ andargs = lappend(andargs, e);
}
+ /* Only need an AND if there's more than one join column */
+ if (list_length(andargs) == 1)
+ result = (Node *) linitial(andargs);
+ else
+ result = (Node *) makeBoolExpr(AND_EXPR, andargs, -1);
+
/*
* Since the references are already Vars, and are certainly from the input
* relations, we don't have to go through the same pushups that