From: Tom Lane Date: Wed, 2 Nov 2011 02:13:11 +0000 (-0400) Subject: Preserve Var location information during flatten_join_alias_vars. X-Git-Tag: REL9_2_BETA1~899 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=391af9f7842ba8b8d2195aaf82879662434b97f3;p=postgresql Preserve Var location information during flatten_join_alias_vars. This allows us to give correct syntax error pointers when complaining about ungrouped variables in a join query with aggregates or GROUP BY. It's pretty much irrelevant for the planner's use of the function, though perhaps it might aid debugging sometimes. --- 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);