diff --git a/src/backend/optimizer/util/var.c b/src/backend/optimizer/util/var.c index 888f6f67a8..80fc8324b9 100644 --- a/src/backend/optimizer/util/var.c +++ b/src/backend/optimizer/util/var.c @@ -794,16 +794,17 @@ flatten_join_alias_vars_mutator(Node *node, /* Ignore dropped columns */ if (IsA(newvar, Const)) continue; + newvar = copyObject(newvar); /* * If we are expanding an alias carried down from an upper * query, must adjust its varlevelsup fields. */ if (context->sublevels_up != 0) - { - newvar = copyObject(newvar); IncrementVarSublevelsUp(newvar, context->sublevels_up, 0); - } + /* Preserve original Var's location, if possible */ + if (IsA(newvar, Var)) + ((Var *) newvar)->location = var->location; /* Recurse in case join input is itself a join */ /* (also takes care of setting inserted_sublink if needed) */ newvar = flatten_join_alias_vars_mutator(newvar, context); @@ -814,7 +815,7 @@ flatten_join_alias_vars_mutator(Node *node, rowexpr->row_typeid = var->vartype; rowexpr->row_format = COERCE_IMPLICIT_CAST; rowexpr->colnames = NIL; - rowexpr->location = -1; + rowexpr->location = var->location; return (Node *) rowexpr; } @@ -822,16 +823,18 @@ flatten_join_alias_vars_mutator(Node *node, /* Expand join alias reference */ Assert(var->varattno > 0); newvar = (Node *) list_nth(rte->joinaliasvars, var->varattno - 1); + newvar = copyObject(newvar); /* * If we are expanding an alias carried down from an upper query, must * adjust its varlevelsup fields. */ if (context->sublevels_up != 0) - { - newvar = copyObject(newvar); IncrementVarSublevelsUp(newvar, context->sublevels_up, 0); - } + + /* Preserve original Var's location, if possible */ + if (IsA(newvar, Var)) + ((Var *) newvar)->location = var->location; /* Recurse in case join input is itself a join */ newvar = flatten_join_alias_vars_mutator(newvar, context);