On 28.03.2011 10:02, Vaibhav Kaushal wrote:
Hi,I see the ExecInitExpr says something like this: ------------ case T_Var: state = (ExprState *) makeNode(ExprState); state->evalfunc = ExecEvalVar; --------------- But the ExecEvalVar function definition says: ------------------------ Var *variable = (Var *) exprstate->expr; TupleTableSlot *slot; AttrNumber attnum; if (isDone) *isDone = ExprSingleResult; /* Get the input slot and attribute number we want */ switch (variable->varno) { case INNER: /* get the tuple from the inner node */ ------------------------- Since ExprState -> expr in its final form would finally contain only: NodeTag type; I think that the pointer being cast in the ExecEvalVar is actually already a form of Var which is passed around as Expr for sake of function call.
Right, exprstate->expr is a Var in ExecEvalVar.
So, was the node in the Expr tree for the corresponding ExprState node of the ExprState tree actually a 'Var'?
Yes.
Also, I have tried, but failed to fidn the exact place where the Expr tree is created. Just pointing me to the file / function which does this would be of great help.
A raw expression tree is created in the grammar, src/backend/parser/gram.y. It is then transformed in parse analysis phase to the form the planner accepts, in transformExpr(). The planner can do some further transformations, like replacing immutable function calls with Consts.
-- Heikki Linnakangas EnterpriseDB http://www.enterprisedb.com -- Sent via pgsql-hackers mailing list ([email protected]) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
