desglosar una funcion FuncExpr

From: LDC - Carmen Brando <carmen(at)ldc(dot)usb(dot)ve>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: desglosar una funcion FuncExpr
Date: 2006-11-20 14:16:42
Message-ID: Pine.LNX.4.64.0611201004110.5269@leto.ldc.usb.ve
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Hola lista,
Estamos intentando recorrer el subarbol de una funcion similar a
la de ORDER BY, por ejemplo (distance + 2*price). Lo estamos
intentando recorrer recursivamente con una funcion que tiene un
switch-case dado tipo del nodo (NodeTag), pero cuando se hace la
comparacion para averiguar el tipo de los argumentos (OpExpr,
FuncExpr, Var) no entra en ninguno de estos tres casos.

Este primer switch-case funciona bien y es el que se encarga de
decidir llamar a la funcion recursiva:
NOTA: tle es el TargetEntry que contiene la funcion.

switch(nodeTag((Node *) tle->expr))
{
case T_Var: /* Table Column */
node->tleTopKRef = assignTopKRef(tle->resno,
*targetlist);
node->topkOp = ordering_oper_opid(restype);
topkrefs = lappend(topkrefs, node);
break;
case T_FuncExpr:
fexpr = (FuncExpr *) tle->expr;
args = fexpr->args;
//llamada recursiva a continuacion
setTLErefsInExprOfFunc(args, topkrefs, targetlist);
break;
case T_OpExpr:
oexpr = (OpExpr *) tle->expr;
args = oexpr->args;
setTLErefsInExprOfFunc(args, topkrefs, targetlist);
break;
default:
break;
}

Este es el switch-case que falla, que se encuentra dentro de la
funcion recursiva. La diferencia con el anterior es que este verifica
contra los argumentos de la funcion en lugar del tle:

foreach(arg, args)
{
if(IsA((Expr *) arg, Var))
{
var = (Var *) lfirst(arg);
node = makeNode(TopKRefs);
node->tleTopKRef = assignTopKRef(var->varattno,
*targetlist);
node->topkOp = ordering_oper_opid(var->vartype);
topkrefs = lappend(topkrefs, node);
}
else if(IsA((Expr *) arg, FuncExpr))
{
fexpr = (FuncExpr *) lfirst(arg);
setTLErefsInExprOfFunc(fexpr->args, topkrefs, targetlist);
}
else if(IsA((Expr *) arg, OpExpr))
{
oexpr = (OpExpr *) lfirst(arg);
setTLErefsInExprOfFunc(oexpr->args, topkrefs, targetlist);
}
}

Muchas gracias por la ayuda que nos puedan brindar =D
Carmen y Vanessa.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message LDC - Carmen Brando 2006-11-20 14:43:57 Re: desglosar una funcion FuncExpr
Previous Message Douglas Escobar 2006-11-20 14:09:23 RE: Problemas en actualizacion de DB