From: | Arturo Rossodivita <arossodivita(at)gmail(dot)com> |
---|---|
To: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | crear expresion |
Date: | 2009-03-17 20:34:20 |
Message-ID: | 36fdef070903171334q5194eeabk15ed8169a5f485a3@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
hola lista como estan?
les comento estoy realizando una extension al nucleo de postgreSQL en la
cual si un usario quiere crear una expresion para luego consultar
directamente alguna tabla lo haga directamente con esa funcion por ejemplo:
SELECT * FROM X WHERE edad = aprox; donde ya previamente aprox fue definido
como una expresion que podria ser como la siguiente:
(x+1.5) / (5.3+6) > 0 donde x es el campo de la tabla a consultar, en el
ejemplo anterior edad para lo cual la expresion quedaria de la siguiente
forma:
(edad+1.5) / (5.3+6) > 0 quedando el nuevo query asi:
SELECT * FROM X WHERE (edad+1.5) / (5.3+6) > 0;
lo que hice fue crear una tabla del catalogo y una rutina para que el
usuario cree sus expresiones y luego pueda hacer sus consultas, estas
expresiones las almaceno en el catalogo como un string
cuando el usuario pide una consulta de este tipo lo que hago es que
identifico en el subquery_planner en planner.c del modulo del optimizer y
trato de crear el arbol para esa expresion
el cual deberia quedarme de la siguiente forma:
>
/
0
+
+
edad 1.5 5.3
6
para esto paso a la expresion en postfijo quedando de la siguiente forma:
edad1.5+5.36+/
en el planner mientras voy evaluando voy creando cada una de las clausulas
de la siguiente forma primero creo la clausula + para crear
(edad + 1.5) de la siguiente forma:
make_opclause(1758,1700,false, (Expr *) makeFuncExpr( 1782, 1700,
list_make1(varfa),2) , (Expr *) makeConst(1700, -1,
Float8GetDaum(atof(op2)), false, false));
donde varfa es de tipo var que me indica varno(numero de la tabla a
consultar) y varattno(numero del atributo dentro de dicha tabla) (edad). Y
op2 es el operando leido de la expresion en posfijo (1.5)
luego creo la siguiente clausula que es otro + para crear (5.3+6):
make_opclause(1758, 1700, false, (Expr *) makeConst(1700, -1,
Float8GetDaum(atof(op1)), false, false) , (Expr *) makeConst(1700, -1,
Float8GetDaum(atof(op2)), false, false));
donde op1 y op2 son los operandos leidos de la expresion en posfijo (5.3 y 6
respectivamente)
luego creo la siguiente clausula que seria un / para crear (edad + 1.5) /
(5.3 +6)
make_opclause(1761, 1700, false, (Expr *) clause1 , (Expr *) clause2);
donde clause1 y clause2 son las clausulas previamente creadas las cuales
almaceno en una lista
y por ultimo creo la ultima clausula para esta expresion en especifico que
seria > para crear (edad + 1.5) / (5.3 + 6) > 0
make_opclause(1756, 1700, false, (Expr *) clause1, (Expr *)
makeFuncExpr(1782, 1700, list_make1(makeConst(1700, -1, Float8GetDatum(0.0),
false, false)) , 2));
donde clause 1 es la clausula creada anteriormente
el problema que veo es que cuando imprimo el parser que me crea para
confirmar que esta bien el arbol es que el valor de todas las constantes
creadas (makeConst) sale vacio, o por lo menos eso es lo que me da a
enterder pue aparece asi:
contvalue 0 [ ] y luego cuando imprimo el plan aparece con muchos valores
estoy hablando de 4 lineas casi siempre.
no se si la forma que estpy planteandolo esta bien o si sera mejor no
guardar la expresion como una cadena no se o si alguno de ustedes sabe como
pasar una cadena con una expresion a una expresion directamente.
bueno como siempre que pregunto son muy largas mis opreguntas pero lo hago
para explicarme bien espero alguno pueda ayudarme gracias.
From | Date | Subject | |
---|---|---|---|
Next Message | Redondo Repiso, Santiago | 2009-03-17 20:35:52 | MOMENT TIMESTAMPTZ DEFAULT NOW() |
Previous Message | santi2r | 2009-03-17 20:16:19 | RE: Off Topic, Unix Shell Script |