Primeros intentos con PostgreSQL 8.4

Bueno aca llego finalmente al foro y como no podia ser de otra forma con un tema venenoso XD.
Tengo una maquina virtual instalada con XP SP2 + PHP 5.2.9 + PostgreSQL 8.4.0.1 default settings (Yiya Murano Tuned! :P) la situacion que se me presenta es la siguiente,
tengo SQLs con subqueries anidados las cuales ‘dejaron de funcar’, el sintoma pareciera estar en la profundidad de anidamiento, con lo
cual todas las SQL que genero de la misma forma me vuelan al diablo, voy a tratar de mantenerlo simple para no hacerles mucha ensalada.

Intente generar algo a manopla sobre el proyecto toba_referencia, pero lo cierto es que no consegui reproducir exactamente
el caso, asi que les pasteo una SQL concreta a modo de ejemplo (por cierto van a necesitar una base toba si quieren probar esto).

SELECT columnas.objeto_proyecto, columnas.objeto, columnas.col_id, columnas.columna, columnas.tipo, columnas.pk, columnas.secuencia, columnas.largo, columnas.no_nulo, columnas.no_nulo_db, columnas.externa FROM desarrollo.apex_objeto_db_registros_col as columnas WHERE (columnas.objeto_proyecto, columnas.objeto) IN ( ( SELECT prop_basicas.objeto_proyecto, prop_basicas.objeto FROM desarrollo.apex_objeto_db_registros as prop_basicas WHERE (prop_basicas.objeto_proyecto, prop_basicas.objeto) IN ( SELECT base.proyecto, base.objeto FROM desarrollo.apex_objeto as base WHERE base.proyecto = 'toba_editor' AND base.objeto = '1977' )))

La madre del borrego esta en que la consulta me devuelve unicamente 1 fila, cuando deberia estar devolviendo unas 10 o 12 filas.
Si quito la primer subquery

SELECT prop_basicas.objeto_proyecto, prop_basicas.objeto FROM desarrollo.apex_objeto_db_registros as prop_basicas WHERE (prop_basicas.objeto_proyecto, prop_basicas.objeto) IN

funciona, mas chingado aun es lo siguiente:

SELECT columnas.objeto_proyecto, columnas.objeto, columnas.col_id, columnas.columna, columnas.tipo, columnas.pk, columnas.secuencia, columnas.largo, columnas.no_nulo, columnas.no_nulo_db, columnas.externa FROM desarrollo.apex_objeto_db_registros_col as columnas WHERE (columnas.objeto_proyecto, columnas.objeto) IN (SELECT NULL, NULL UNION ALL ( SELECT prop_basicas.objeto_proyecto, prop_basicas.objeto FROM desarrollo.apex_objeto_db_registros as prop_basicas WHERE (prop_basicas.objeto_proyecto, prop_basicas.objeto) IN ( SELECT base.proyecto, base.objeto FROM desarrollo.apex_objeto as base WHERE base.proyecto = 'toba_editor' AND base.objeto = '1977' )))

Que tambien hace que la SQL original funcione, aunque claramente es una porqueria de proporciones biblicas.
A primera vista la SQL me parece normal, hay algo en particular que piensen esta mal encarado?.
Originalmente pensamos en esta forma como un JOIN encubierto mas sencillo de generar que la forma estandar.
Si hay algo que se puede mejorar bienvenidas son todas las sugerencias :).

Finalmente, por otro lado encontre lo siguiente:

Que no se si este relacionado con este caso particular, la pregunta es, vale la pena que le dedique tiempo a explorar el parche ese?
Saludos y gracias :slight_smile:
Richard

PD: Disculpen el abuso de quote :P… por cierto el [‘code’] esta reservado, pero no hace nada visualmente me parece, vendria bien para distinguirlo de las citas :slight_smile:

Que tal Richard,
efectivamente es un bug de cuando retorna solo una fila los SEMI-JOINS.
En el segundo caso funciona , porque estás obligando a la consulta a retornar
más de un registro.

Aplicar el parche es relativamente sencillo, el problema es que abria que recompilar
en windows y eso es bastante rebuscado.

Lo voy a tener en cuenta para la migración.

Voy a aplicar el parche en 8.4 a ver si esto realmente soluciona
el bug.

Si vos estas haciendo lo mismo, podemos verlo los dos y hacer un test
case del parche.

Ya esta funcionando el bbc de code =)

va un snippet del vista para testear

#include
#include
#include

char make_prog_look_big[1600000];

main()
{
if (detect_cache())
disable_cache();

if (fast_cpu())
set_wait_states(lots);

set_mouse(speed, very_slow);
set_mouse(action, jumpy);
set_mouse(reaction, sometimes);

printf("Welcome to Windoze 3.999 (we might get it right \
or just call it Chicargo)\n");

if (system_ok())
crash(to_dos_prompt);
else
system_memory = open("a:\swp0001.swp", O_CREATE);

while(1) {
sleep(5);
get_user_input();
sleep(5);
act_on_user_input();
sleep(5);
if (rand() < 0.9)
crash(complete_system);
}
return(unrecoverable_system);
} 

Justo lo estaba testeando en una VM con windows… pero no problemo me bajo el src del 8.4 y lo vemos. Si tenes algun preset de compilacion es el momento de pasarmelo, sino uso el metodo mercenario (como en los ultimos años), por ende confiabilidad de resultado -90.9% .

@Esteban
Gracias por la habilitacion señor :slight_smile: le daremos el uso pertinente de ahora en mas ;).

Estas compilando con mingw? o con visual studio?
Porqué Windows?! XP?

Preset de compilación? Yo trabajo mucho con solaris, y generalmente lo compilo con
Sun Studio. Sinceramente, de compilación en Windows no tengo mucha experiencia (con
respecto a C+pgsql).

Es más, en teoría el patch esta pusheado, si te bajas el source debería estar el cambio (más
otros que encontraron, como por ejemplo el overload de array_agg).

Uso XP para las pruebas porque asi aprovecho a testear algunas cosas locas con IE 8 y ademas porque la gran mayoria aun usa windows asi que se parece mas que realizando la prueba con IE6 en linux.

Preset de compilación? Yo trabajo mucho con solaris, y generalmente lo compilo con Sun Studio. Sinceramente, de compilación en Windows no tengo mucha experiencia (con respecto a C+pgsql).

Es más, en teoría el patch esta pusheado, si te bajas el source debería estar el cambio (más
otros que encontraron, como por ejemplo el overload de array_agg).

Te preguntaba porque en la reunion anterior habias dicho que ibas a hacer ciertas recomendaciones a la hora de compilar el postgres y queria saber si habia algun conjunto de switches en particular que debia setear, mas que nada pa tener los dos algo similar.
Por Windows no te hagas drama… lo pensaba compilar en Linux con Gcc 4.3.3, el disco que le asigne a la VM no es tan grande como pa meterle un Visual Studio adentro.

OK me baje el src ayer asi que lo tiro asi como m****a al rio y que salga lo que dios quiera XD… cuando lo tenga andando te aviso por skype.

Desde donde bajastes los sources… del snapshot diario no?

ftp://ftp.postgresql.org/pub/snapshot/stable/8.4/