diff options
Diffstat (limited to 'src/backend/optimizer/util/var.c')
-rw-r--r-- | src/backend/optimizer/util/var.c | 161 |
1 files changed, 0 insertions, 161 deletions
diff --git a/src/backend/optimizer/util/var.c b/src/backend/optimizer/util/var.c index 81332ff1cd1..1d88a778203 100644 --- a/src/backend/optimizer/util/var.c +++ b/src/backend/optimizer/util/var.c @@ -54,12 +54,6 @@ typedef struct typedef struct { - int min_varlevel; - int sublevels_up; -} find_minimum_var_level_context; - -typedef struct -{ List *varlist; PVCAggregateBehavior aggbehavior; PVCPlaceHolderBehavior phbehavior; @@ -81,8 +75,6 @@ static bool contain_var_clause_walker(Node *node, void *context); static bool contain_vars_of_level_walker(Node *node, int *sublevels_up); static bool locate_var_of_level_walker(Node *node, locate_var_of_level_context *context); -static bool find_minimum_var_level_walker(Node *node, - find_minimum_var_level_context *context); static bool pull_var_clause_walker(Node *node, pull_var_clause_context *context); static Node *flatten_join_alias_vars_mutator(Node *node, @@ -489,159 +481,6 @@ locate_var_of_level_walker(Node *node, /* - * find_minimum_var_level - * Recursively scan a clause to find the lowest variable level it - * contains --- for example, zero is returned if there are any local - * variables, one if there are no local variables but there are - * one-level-up outer references, etc. Subqueries are scanned to see - * if they possess relevant outer references. (But any local variables - * within subqueries are not relevant.) - * - * -1 is returned if the clause has no variables at all. - * - * Will recurse into sublinks. Also, may be invoked directly on a Query. - */ -int -find_minimum_var_level(Node *node) -{ - find_minimum_var_level_context context; - - context.min_varlevel = -1; /* signifies nothing found yet */ - context.sublevels_up = 0; - - (void) query_or_expression_tree_walker(node, - find_minimum_var_level_walker, - (void *) &context, - 0); - - return context.min_varlevel; -} - -static bool -find_minimum_var_level_walker(Node *node, - find_minimum_var_level_context *context) -{ - if (node == NULL) - return false; - if (IsA(node, Var)) - { - int varlevelsup = ((Var *) node)->varlevelsup; - - /* convert levelsup to frame of reference of original query */ - varlevelsup -= context->sublevels_up; - /* ignore local vars of subqueries */ - if (varlevelsup >= 0) - { - if (context->min_varlevel < 0 || - context->min_varlevel > varlevelsup) - { - context->min_varlevel = varlevelsup; - - /* - * As soon as we find a local variable, we can abort the tree - * traversal, since min_varlevel is then certainly 0. - */ - if (varlevelsup == 0) - return true; - } - } - } - if (IsA(node, CurrentOfExpr)) - { - int varlevelsup = 0; - - /* convert levelsup to frame of reference of original query */ - varlevelsup -= context->sublevels_up; - /* ignore local vars of subqueries */ - if (varlevelsup >= 0) - { - if (context->min_varlevel < 0 || - context->min_varlevel > varlevelsup) - { - context->min_varlevel = varlevelsup; - - /* - * As soon as we find a local variable, we can abort the tree - * traversal, since min_varlevel is then certainly 0. - */ - if (varlevelsup == 0) - return true; - } - } - } - - /* - * An Aggref must be treated like a Var of its level. Normally we'd get - * the same result from looking at the Vars in the aggregate's argument, - * but this fails in the case of a Var-less aggregate call (COUNT(*)). - */ - if (IsA(node, Aggref)) - { - int agglevelsup = ((Aggref *) node)->agglevelsup; - - /* convert levelsup to frame of reference of original query */ - agglevelsup -= context->sublevels_up; - /* ignore local aggs of subqueries */ - if (agglevelsup >= 0) - { - if (context->min_varlevel < 0 || - context->min_varlevel > agglevelsup) - { - context->min_varlevel = agglevelsup; - - /* - * As soon as we find a local aggregate, we can abort the tree - * traversal, since min_varlevel is then certainly 0. - */ - if (agglevelsup == 0) - return true; - } - } - } - /* Likewise, make sure PlaceHolderVar is treated correctly */ - if (IsA(node, PlaceHolderVar)) - { - int phlevelsup = ((PlaceHolderVar *) node)->phlevelsup; - - /* convert levelsup to frame of reference of original query */ - phlevelsup -= context->sublevels_up; - /* ignore local vars of subqueries */ - if (phlevelsup >= 0) - { - if (context->min_varlevel < 0 || - context->min_varlevel > phlevelsup) - { - context->min_varlevel = phlevelsup; - - /* - * As soon as we find a local variable, we can abort the tree - * traversal, since min_varlevel is then certainly 0. - */ - if (phlevelsup == 0) - return true; - } - } - } - if (IsA(node, Query)) - { - /* Recurse into subselects */ - bool result; - - context->sublevels_up++; - result = query_tree_walker((Query *) node, - find_minimum_var_level_walker, - (void *) context, - 0); - context->sublevels_up--; - return result; - } - return expression_tree_walker(node, - find_minimum_var_level_walker, - (void *) context); -} - - -/* * pull_var_clause * Recursively pulls all Var nodes from an expression clause. * |