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.
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 |