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 (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers