blob: 535b2987ce15d661d6ba409973105fe931e00040 [file] [log] [blame]
/*-------------------------------------------------------------------------
*
* cdbpullup.h
* definitions for cdbpullup.c utilities
*
* Portions Copyright (c)2006-2008, Greenplum inc
* Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates.
*
*
* IDENTIFICATION
* src/include/cdb/cdbpullup.h
*
*-------------------------------------------------------------------------
*/
#ifndef CDBPULLUP_H
#define CDBPULLUP_H
#include "nodes/pathnodes.h" /* PathKey, Relids */
/*
* cdbpullup_expr
*
* Suppose there is a Plan node 'P' whose projection is defined by
* a targetlist 'TL', and which has subplan 'S'. Given TL and an
* expr 'X0' whose Var nodes reference the result columns of S, this
* function returns a new expr 'X1' that is a copy of X0 with Var nodes
* adjusted to reference the columns of S after their passage through P.
*
* Parameters:
* expr -> X0, the expr in terms of the subplan S's targetlist
* targetlist -> TL (a List of TargetEntry), the plan P's targetlist
* (or can be a List of Expr)
* newvarlist -> an optional List of Expr which may contain Var nodes
* referencing the result of the projection. The Var nodes in
* the new expr are copied from ones in this list if possible,
* to get their varnoold and varoattno settings.
* newvarno = varno to be used in new Var nodes
*
* When calling this function on an expr which has NOT yet been transformed
* by set_plan_references(), newvarno should be the RTE index assigned to
* the result of the projection.
*
* When calling this function on an expr which HAS been transformed by
* set_plan_references(), newvarno should usually be OUTER; or 0 if the
* expr is to be used in the targetlist of an Agg or Group node.
*
* At present this function doesn't support pull-up from a subquery into a
* containing query: there is no provision for adjusting the varlevelsup
* field in Var nodes for outer references. This could be added if needed.
*
* Returns X1, the expr recast in terms of the given targetlist; or
* NULL if X0 references a column of S that is not projected in TL.
*/
Expr *
cdbpullup_expr(Expr *expr, List *targetlist, List *newvarlist, Index newvarno);
extern Expr *cdbpullup_findEclassInTargetList(EquivalenceClass *eclass, List *targetlist, Oid hashOpFamily);
extern List *cdbpullup_truncatePathKeysForTargetList(List *pathkeys, List *targetlist);
#endif /* CDBPULLUP_H */