]> granicus.if.org Git - postgresql/commitdiff
Preserve Var location information during flatten_join_alias_vars.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 Nov 2011 02:13:11 +0000 (22:13 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 Nov 2011 02:13:11 +0000 (22:13 -0400)
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.

src/backend/optimizer/util/var.c

index 888f6f67a84a5a1556af270bc38458def7e4cde8..80fc8324b9d8e5196ab7a06905435fc2637be9f5 100644 (file)
@@ -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);