#include "optimizer/var.h"

Go to the source code of this file.
Definition at line 112 of file tlist.c.
References copyObject(), lappend(), lfirst, list_length(), makeTargetEntry(), NULL, and tlist_member().
Referenced by flatten_tlist(), grouping_planner(), make_subplanTargetList(), and make_windowInputTargetList().
{
int next_resno = list_length(tlist) + 1;
ListCell *lc;
foreach(lc, exprs)
{
Node *expr = (Node *) lfirst(lc);
if (!tlist_member(expr, tlist))
{
TargetEntry *tle;
tle = makeTargetEntry(copyObject(expr), /* copy needed?? */
next_resno++,
NULL,
false);
tlist = lappend(tlist, tle);
}
}
return tlist;
}
| AttrNumber* extract_grouping_cols | ( | List * | groupClause, | |
| List * | tlist | |||
| ) |
Definition at line 378 of file tlist.c.
References get_sortgroupclause_tle(), lfirst, list_length(), palloc(), and TargetEntry::resno.
Referenced by grouping_planner(), and make_union_unique().
{
AttrNumber *grpColIdx;
int numCols = list_length(groupClause);
int colno = 0;
ListCell *glitem;
grpColIdx = (AttrNumber *) palloc(sizeof(AttrNumber) * numCols);
foreach(glitem, groupClause)
{
SortGroupClause *groupcl = (SortGroupClause *) lfirst(glitem);
TargetEntry *tle = get_sortgroupclause_tle(groupcl, tlist);
grpColIdx[colno++] = tle->resno;
}
return grpColIdx;
}
Definition at line 352 of file tlist.c.
References Assert, SortGroupClause::eqop, lfirst, list_length(), OidIsValid, and palloc().
Referenced by get_column_info_for_window(), grouping_planner(), and make_union_unique().
{
int numCols = list_length(groupClause);
int colno = 0;
Oid *groupOperators;
ListCell *glitem;
groupOperators = (Oid *) palloc(sizeof(Oid) * numCols);
foreach(glitem, groupClause)
{
SortGroupClause *groupcl = (SortGroupClause *) lfirst(glitem);
groupOperators[colno] = groupcl->eqop;
Assert(OidIsValid(groupOperators[colno]));
colno++;
}
return groupOperators;
}
| List* flatten_tlist | ( | List * | tlist, | |
| PVCAggregateBehavior | aggbehavior, | |||
| PVCPlaceHolderBehavior | phbehavior | |||
| ) |
Definition at line 89 of file tlist.c.
References add_to_flat_tlist(), list_free(), NIL, and pull_var_clause().
{
List *vlist = pull_var_clause((Node *) tlist,
aggbehavior,
phbehavior);
List *new_tlist;
new_tlist = add_to_flat_tlist(NIL, vlist);
list_free(vlist);
return new_tlist;
}
| Node* get_sortgroupclause_expr | ( | SortGroupClause * | sgClause, | |
| List * | targetList | |||
| ) |
Definition at line 310 of file tlist.c.
References TargetEntry::expr, and get_sortgroupclause_tle().
Referenced by get_sortgrouplist_exprs(), locate_grouping_columns(), make_pathkeys_for_sortclauses(), parseCheckAggregates(), and transformAggregateCall().
{
TargetEntry *tle = get_sortgroupclause_tle(sgClause, targetList);
return (Node *) tle->expr;
}
| TargetEntry* get_sortgroupclause_tle | ( | SortGroupClause * | sgClause, | |
| List * | targetList | |||
| ) |
Definition at line 298 of file tlist.c.
References get_sortgroupref_tle(), and SortGroupClause::tleSortGroupRef.
Referenced by ExecInitAgg(), extract_grouping_cols(), get_rule_sortgroupclause(), get_sortgroupclause_expr(), make_recursive_union(), make_setop(), make_sort_from_sortclauses(), make_unique(), query_is_distinct_for(), and transformDistinctClause().
{
return get_sortgroupref_tle(sgClause->tleSortGroupRef, targetList);
}
Definition at line 323 of file tlist.c.
References get_sortgroupclause_expr(), lappend(), and lfirst.
Referenced by query_planner().
{
List *result = NIL;
ListCell *l;
foreach(l, sgClauses)
{
SortGroupClause *sortcl = (SortGroupClause *) lfirst(l);
Node *sortexpr;
sortexpr = get_sortgroupclause_expr(sortcl, targetList);
result = lappend(result, sortexpr);
}
return result;
}
| TargetEntry* get_sortgroupref_tle | ( | Index | sortref, | |
| List * | targetList | |||
| ) |
Definition at line 276 of file tlist.c.
References elog, ERROR, lfirst, and TargetEntry::ressortgroupref.
Referenced by convert_subquery_pathkeys(), get_sortgroupclause_tle(), prepare_sort_from_pathkeys(), and transformDistinctOnClause().
{
ListCell *l;
foreach(l, targetList)
{
TargetEntry *tle = (TargetEntry *) lfirst(l);
if (tle->ressortgroupref == sortref)
return tle;
}
elog(ERROR, "ORDER/GROUP BY expression not found in targetlist");
return NULL; /* keep compiler quiet */
}
Definition at line 143 of file tlist.c.
References TargetEntry::expr, lappend(), lfirst, and TargetEntry::resjunk.
Referenced by recurse_set_operations().
{
List *result = NIL;
ListCell *l;
foreach(l, tlist)
{
TargetEntry *tle = (TargetEntry *) lfirst(l);
if (tle->resjunk && !includeJunk)
continue;
result = lappend(result, tle->expr);
}
return result;
}
Definition at line 424 of file tlist.c.
References SortGroupClause::hashable, and lfirst.
Referenced by choose_hashed_distinct(), choose_hashed_grouping(), choose_hashed_setop(), and generate_recursion_plan().
{
ListCell *glitem;
foreach(glitem, groupClause)
{
SortGroupClause *groupcl = (SortGroupClause *) lfirst(glitem);
if (!groupcl->hashable)
return false;
}
return true;
}
Definition at line 404 of file tlist.c.
References lfirst, OidIsValid, and SortGroupClause::sortop.
Referenced by choose_hashed_distinct(), choose_hashed_grouping(), choose_hashed_setop(), make_pathkeys_for_window(), and standard_qp_callback().
{
ListCell *glitem;
foreach(glitem, groupClause)
{
SortGroupClause *groupcl = (SortGroupClause *) lfirst(glitem);
if (!OidIsValid(groupcl->sortop))
return false;
}
return true;
}
| TargetEntry* tlist_member | ( | Node * | node, | |
| List * | targetlist | |||
| ) |
Definition at line 32 of file tlist.c.
References equal(), TargetEntry::expr, and lfirst.
Referenced by add_to_flat_tlist(), create_unique_plan(), locate_grouping_columns(), preprocess_targetlist(), and search_indexed_tlist_for_non_var().
{
ListCell *temp;
foreach(temp, targetlist)
{
TargetEntry *tlentry = (TargetEntry *) lfirst(temp);
if (equal(node, tlentry->expr))
return tlentry;
}
return NULL;
}
| TargetEntry* tlist_member_ignore_relabel | ( | Node * | node, | |
| List * | targetlist | |||
| ) |
Definition at line 53 of file tlist.c.
References arg, equal(), TargetEntry::expr, IsA, and lfirst.
Referenced by prepare_sort_from_pathkeys().
{
ListCell *temp;
while (node && IsA(node, RelabelType))
node = (Node *) ((RelabelType *) node)->arg;
foreach(temp, targetlist)
{
TargetEntry *tlentry = (TargetEntry *) lfirst(temp);
Expr *tlexpr = tlentry->expr;
while (tlexpr && IsA(tlexpr, RelabelType))
tlexpr = ((RelabelType *) tlexpr)->arg;
if (equal(node, tlexpr))
return tlentry;
}
return NULL;
}
Definition at line 241 of file tlist.c.
References TargetEntry::expr, exprCollation(), lfirst, lfirst_oid, list_head(), lnext, NULL, and TargetEntry::resjunk.
Referenced by recurse_set_operations().
{
ListCell *l;
ListCell *curColColl = list_head(colCollations);
foreach(l, tlist)
{
TargetEntry *tle = (TargetEntry *) lfirst(l);
if (tle->resjunk)
{
if (!junkOK)
return false;
}
else
{
if (curColColl == NULL)
return false; /* tlist longer than colCollations */
if (exprCollation((Node *) tle->expr) != lfirst_oid(curColColl))
return false;
curColColl = lnext(curColColl);
}
}
if (curColColl != NULL)
return false; /* tlist shorter than colCollations */
return true;
}
Definition at line 207 of file tlist.c.
References TargetEntry::expr, exprType(), lfirst, lfirst_oid, list_head(), lnext, NULL, and TargetEntry::resjunk.
Referenced by is_simple_union_all_recurse(), and recurse_set_operations().
{
ListCell *l;
ListCell *curColType = list_head(colTypes);
foreach(l, tlist)
{
TargetEntry *tle = (TargetEntry *) lfirst(l);
if (tle->resjunk)
{
if (!junkOK)
return false;
}
else
{
if (curColType == NULL)
return false; /* tlist longer than colTypes */
if (exprType((Node *) tle->expr) != lfirst_oid(curColType))
return false;
curColType = lnext(curColType);
}
}
if (curColType != NULL)
return false; /* tlist shorter than colTypes */
return true;
}
Definition at line 177 of file tlist.c.
References equal(), TargetEntry::expr, forboth, lfirst, and list_length().
Referenced by create_unique_plan(), and grouping_planner().
{
ListCell *lc1,
*lc2;
if (list_length(tlist1) != list_length(tlist2))
return false; /* not same length, so can't match */
forboth(lc1, tlist1, lc2, tlist2)
{
TargetEntry *tle1 = (TargetEntry *) lfirst(lc1);
TargetEntry *tle2 = (TargetEntry *) lfirst(lc2);
if (!equal(tle1->expr, tle2->expr))
return false;
}
return true;
}
1.7.1