From aarnal at gmail.com Tue Aug 19 06:51:41 2014 From: aarnal at gmail.com (Alexis Arnal) Date: Tue, 19 Aug 2014 09:21:41 -0430 Subject: [caracas-pm] =?iso-8859-1?q?Como_verificar_la_sintaxis_de_una_fun?= =?iso-8859-1?q?ci=F3n_plPerl_en_postgres?= Message-ID: Saludos, espero que est?n muy bien. M?nica y yo hemos estado trabajando con funciones plPerl en postgres, todo hab?a ido muy bien pero ahora nos sale un error de sintaxis y no hemos encontrado la manera de verificar la sintaxis para ver el error En un script normal con perl -c nombre_archivo me muestra los errores si los hubiera. Como puedo hacer algo similar dentro de postgres con plPerl??? Instal? el debugger de PgAdmin y solo funciona para funciones plPgsql. Alguno ha usado Ptkdb dentro de postgres??? Muchas gracias por sus comentarios -------------- next part -------------- An HTML attachment was scrubbed... URL: From amijaresp at gmail.com Tue Aug 19 07:02:57 2014 From: amijaresp at gmail.com (Alberto Mijares) Date: Tue, 19 Aug 2014 09:32:57 -0430 Subject: [caracas-pm] =?utf-8?q?Como_verificar_la_sintaxis_de_una_funci?= =?utf-8?q?=C3=B3n_plPerl_en_postgres?= In-Reply-To: References: Message-ID: Hola Alexis, Hace un tiempo trabaj? con PL/Perl y no tuve problema alguno. Si funciona desde tu CLI debe funcionar dentro de Pg. Sin embargo, se me ocurre que puedes estar utilizando una de las funciones o llamadas al sistema que requieren privilegios adicionales. Para eso necesitas PL/PerlU. Revisa la doc... Saludos. Alberto Mijares 2014-08-19 9:21 GMT-04:30 Alexis Arnal : > Saludos, espero que est?n muy bien. > > M?nica y yo hemos estado trabajando con funciones plPerl en postgres, todo > hab?a ido muy bien pero ahora nos sale un error de sintaxis y no hemos > encontrado la manera de verificar la sintaxis para ver el error > > En un script normal con perl -c nombre_archivo me muestra los errores si los > hubiera. Como puedo hacer algo similar dentro de postgres con plPerl??? > > Instal? el debugger de PgAdmin y solo funciona para funciones plPgsql. > Alguno ha usado Ptkdb dentro de postgres??? > > Muchas gracias por sus comentarios > > _______________________________________________ > caracas-pm mailing list > caracas-pm at pm.org > http://mail.pm.org/mailman/listinfo/caracas-pm From aarnal at gmail.com Tue Aug 19 07:13:14 2014 From: aarnal at gmail.com (Alexis Arnal) Date: Tue, 19 Aug 2014 09:43:14 -0430 Subject: [caracas-pm] =?iso-8859-1?q?Como_verificar_la_sintaxis_de_una_fun?= =?iso-8859-1?q?ci=F3n_plPerl_en_postgres?= In-Reply-To: References: Message-ID: Saludos, gracias por la pronta respuesta. Efectivamente estamos trabajando con PLPerlU. Hasta el momento no hab?a ido muy bien. El problema que tenemos ahorita es un error de sintaxis pero no logramos ver el error. Se me ocurri? buscar la manera de hacer un perl -c pero dentro de postgres. Estoy buscando desde el s?bado como hacer debug dentro de postgres. Al principio teniamos errores con unos triggers y lo resolvimos con el debugger de PgAdmin pero los PLPerl no se pueden. Ya se nos est?n acabando las flechas El 19 de agosto de 2014, 9:32, Alberto Mijares escribi?: > Hola Alexis, > > Hace un tiempo trabaj? con PL/Perl y no tuve problema alguno. Si > funciona desde tu CLI debe funcionar dentro de Pg. Sin embargo, se me > ocurre que puedes estar utilizando una de las funciones o llamadas al > sistema que requieren privilegios adicionales. Para eso necesitas > PL/PerlU. Revisa la doc... > > Saludos. > > Alberto Mijares > > > 2014-08-19 9:21 GMT-04:30 Alexis Arnal : > > Saludos, espero que est?n muy bien. > > > > M?nica y yo hemos estado trabajando con funciones plPerl en postgres, > todo > > hab?a ido muy bien pero ahora nos sale un error de sintaxis y no hemos > > encontrado la manera de verificar la sintaxis para ver el error > > > > En un script normal con perl -c nombre_archivo me muestra los errores si > los > > hubiera. Como puedo hacer algo similar dentro de postgres con plPerl??? > > > > Instal? el debugger de PgAdmin y solo funciona para funciones plPgsql. > > Alguno ha usado Ptkdb dentro de postgres??? > > > > Muchas gracias por sus comentarios > > > > _______________________________________________ > > caracas-pm mailing list > > caracas-pm at pm.org > > http://mail.pm.org/mailman/listinfo/caracas-pm > -------------- next part -------------- An HTML attachment was scrubbed... URL: From monicatahan at gmail.com Tue Aug 19 07:35:50 2014 From: monicatahan at gmail.com (Monica Tahan) Date: Tue, 19 Aug 2014 10:05:50 -0430 Subject: [caracas-pm] =?utf-8?q?Como_verificar_la_sintaxis_de_una_funci?= =?utf-8?q?=C3=B3n_plPerl_en_postgres?= In-Reply-To: References: Message-ID: Saludos, Si, de hecho el script lo hicimos en pl/perlU. Cuando corro la funci?n desarrollada en pl/perlu me da error de sintaxis cerda de "xxxx". Con lo que no estamos muy claros es con spi_exec_query, me explico: Estamos haciendo una funci?n que consulta unas tablas, y el resultado de la consulta devuelve un dato, es decir, no es un arreglo, sino un valor, para ello coloqu? algo as?: my $tabla_id = spi_exec_query("SELECT esquema.tabla.id from esquema.tabla WHERE esquema.tabla.nombre LIKE '% $valor%'") or elog(ERROR, qq{$tabla_id $!}); Deseo guardar en $tabla_id el valor que retorna el select, el cual no es un conjunto de datos, sino un solo dato, para ello es correcta la forma como est? escrita la instrucci?n??? O debo hacer $datoquequiero = $tabla->{rows}; ???? Existen varios querys de este tipo, pero el error que me retorna la funci?n es: ERROR: error de sintaxis en o cerca de ??x7f2e288169e0?? at line 200, CONTEXT: funci?n PL/Perl ?procesamiento_xxx? Ser?a genial que existiera un debugger para pl/perl, pues el que tengo actualmente solo soporta funciones pg/sql y sql. Gracias por sus comentario... El 19 de agosto de 2014, 9:32, Alberto Mijares escribi?: > Hola Alexis, > > Hace un tiempo trabaj? con PL/Perl y no tuve problema alguno. Si > funciona desde tu CLI debe funcionar dentro de Pg. Sin embargo, se me > ocurre que puedes estar utilizando una de las funciones o llamadas al > sistema que requieren privilegios adicionales. Para eso necesitas > PL/PerlU. Revisa la doc... > > Saludos. > > Alberto Mijares > > > 2014-08-19 9:21 GMT-04:30 Alexis Arnal : > > Saludos, espero que est?n muy bien. > > > > M?nica y yo hemos estado trabajando con funciones plPerl en postgres, > todo > > hab?a ido muy bien pero ahora nos sale un error de sintaxis y no hemos > > encontrado la manera de verificar la sintaxis para ver el error > > > > En un script normal con perl -c nombre_archivo me muestra los errores si > los > > hubiera. Como puedo hacer algo similar dentro de postgres con plPerl??? > > > > Instal? el debugger de PgAdmin y solo funciona para funciones plPgsql. > > Alguno ha usado Ptkdb dentro de postgres??? > > > > Muchas gracias por sus comentarios > > > > _______________________________________________ > > caracas-pm mailing list > > caracas-pm at pm.org > > http://mail.pm.org/mailman/listinfo/caracas-pm > _______________________________________________ > caracas-pm mailing list > caracas-pm at pm.org > http://mail.pm.org/mailman/listinfo/caracas-pm -------------- next part -------------- An HTML attachment was scrubbed... URL: From emhnemhn at gmail.com Thu Aug 21 20:11:16 2014 From: emhnemhn at gmail.com (Ernesto =?ISO-8859-1?Q?Hern=E1ndez-Novich?=) Date: Thu, 21 Aug 2014 22:41:16 -0430 Subject: [caracas-pm] =?iso-8859-1?q?Como_verificar_la_sintaxis_de_una_fun?= =?iso-8859-1?q?ci=F3n_plPerl_en_postgres?= In-Reply-To: References: Message-ID: <1408677076.5716.28.camel@trillian.itverx.com.ve> On Tue, 2014-08-19 at 10:05 -0430, Monica Tahan wrote: [...] > Si, de hecho el script lo hicimos en pl/perlU. Antes que comentar sobre la funci?n en PL/perlU es pertinente aclarar que la *?nica* raz?n para usar Perl como lenguaje almacenado en PostgreSQL, es porque la manipulaci?n que se va a hacer de los datos requiere expresiones regulares *avanzadas* o alguna librer?a externa provista con Perl para algo que no se puede hacer con PL/pgSQL. PL/pgSQL tiene toda la funcionalidad necesaria para manipular datos, aplicar expresiones regulares, operar sobre cadenas y n?meros, efectuar consultas est?ticas o din?micas paralelizables, y cuenta con las estructuras de control para expresar algoritmos generales, con un desempe?o que ha de ser superior al de Perl porque se ahorra el paso de datos a una m?quina virtual diferente. No es necesario que den m?s detalles sobre lo que intentan hacer con PL/perlU, pero reflexionen al respecto porque es posible que lo que traten de hacer salga mucho m?s f?cil con PL/pgSQL. Al final, PL/pgSQL debe ser el primer lenguaje almacenado a usar en PostgreSQL, y PL/R el segundo, con cualquier otro en un *distante* tercero. > Cuando corro la funci?n desarrollada en pl/perlu me da error de > sintaxis cerda de "xxxx". Con lo que no estamos muy claros es con > spi_exec_query, me explico: > Estamos haciendo una funci?n que consulta unas tablas, y el resultado > de la consulta devuelve un dato, es decir, no es un arreglo, sino un > valor, para ello coloqu? algo as?: > > > my $tabla_id = spi_exec_query("SELECT esquema.tabla.id from > esquema.tabla WHERE esquema.tabla.nombre LIKE '% $valor%'") or > elog(ERROR, qq{$tabla_id $!}); Interpolar $valor no es buena idea, pues se presta a ataques de inyecci?n de SQL. Es mejor usar quote_literal() o quote_ident() seg?n el caso, aunque lo realmente correcto es usar la familia spi_prepare spi_query_prepared spi_exec_prepared spi_freeplan para que la consulta sea reutilizable. El c?digo que presentan va a hacerle da?o al cach? de instrucciones de PostgreSQL porque cada invocaci?n va a corresponder a una instrucci?n "diferente" cuando se podr?a tener un plan de ejecuci?n ?nico reutilizable. El error de sintaxis ocurre por usar 'or' como conector en una expresi?n, pues el 'or' es una *instrucci?n* y no un *operador*. Citando el manual 'perlop': Using "or" for assignment is unlikely to do what you want; see below. Y cuando uno 'sees below' comprende que my $variable = spi_exec_query(...) or elog(...) en realidad es interpretado como my ($variable = spi_exec_query(...)) or elog(...) que es un error de sintaxis. Cambien 'or' por '||' o '//'. > Deseo guardar en $tabla_id el valor que retorna el select, el cual no > es un conjunto de datos, sino un solo dato, para ello es correcta la > forma como est? escrita la instrucci?n??? No. > O debo hacer $datoquequiero = $tabla->{rows}; ???? Tampoco. my $r = spi_exec_query(...) Revisar el manual de PL/perl para PostgreSQL revela que el resultado de spi_exec_query() es una referencia a un hash, una de cuyas claves es $r->{rows} que contiene todas las filas como un *arreglo de referencias a hashes*, de manera que si quiero la columna 'foo' de la fila 42 $r->{rows}[42]->{foo} Incidentalmente, un debugger no habr?a servido de nada, porque el error fundamental aqu? es de sintaxis, consecuencia de usar un 'or', as? que nunca habr?a llegado a ejecutar ni una instrucci?n. Personalmente, hubiera seleccionado el trozo de Perl en mi editor (vim) e invocado 'perl -c' para confirmar la sintaxis, habr?a obtenido un Found = in conditional, should be == at foo.pl line ... y de all? se deduce el error que involucra el 'or'. -- Ernesto Hern?ndez-Novich - @iamemhn - Unix: Live free or die! Geek by nature, Linux by choice, Debian of course. If you can't aptitude it, it isn't useful or doesn't exist. GPG Key Fingerprint = 0064 ADF5 EB5C DE16 99C1 6C56 F2A3 86B5 A757 E5A1 From monicatahan at gmail.com Thu Aug 21 20:51:30 2014 From: monicatahan at gmail.com (Monica Tahan) Date: Thu, 21 Aug 2014 23:21:30 -0430 Subject: [caracas-pm] =?utf-8?q?Como_verificar_la_sintaxis_de_una_funci?= =?utf-8?q?=C3=B3n_plPerl_en_postgres?= In-Reply-To: <1408677076.5716.28.camel@trillian.itverx.com.ve> References: <1408677076.5716.28.camel@trillian.itverx.com.ve> Message-ID: Gracias Ernesto por tu respuesta... Si efectivamente, la raz?n por la que recurrimos a usar pl/perlU, es por sus bondades para el procesamiento de archivos de textos CSV, funcionalidad que no iba a poder emplear en su m?xima expresi?n en pl/perl sencillo o con plpgsql, que es el que se debe emplear primero que cualquier otro como mencionas. En este caso puntual estamos usando librer?as externas para la conversi?n de tipo de codificaci?n del archivo y estructuras de validaci?n con expresiones regulares, de los datos del CSV origen. El error de sintaxis estaba en las estructuras de los inserts, porque el dato no se estaba guardando, sino estaba intentando insertar en hash (mala mia), ya hab?amos hecho el perl -c y la sintaxis de perl estaba OK, era sintaxys SQL errada. Hoy resolvimos el problema, haciendo lo siguiente: 1. Tomamos la expresi?n que va despu?s del like y la construimos en una variable concaten?ndole la expresi?n regular para a?adir los porcentajes. 2. Tomamos el dato empleando la expresi?n: my $dato_id = $query_id->{rows}[0]->{id_columna}; Ya con eso, la funci?n corri? correctamente y no hubo inconvenientes. Voy tomar en cuenta tu recomendaci?n respecto al uso de la familia SPI, pues me interesa que el tiempo de ejecuci?n sea imperceptible para el usuario. Gracias a todos por sus respuestas, feliz noche... El 21 de agosto de 2014, 22:41, Ernesto Hern?ndez-Novich escribi?: > On Tue, 2014-08-19 at 10:05 -0430, Monica Tahan wrote: > [...] > > Si, de hecho el script lo hicimos en pl/perlU. > > Antes que comentar sobre la funci?n en PL/perlU es pertinente aclarar > que la *?nica* raz?n para usar Perl como lenguaje almacenado en > PostgreSQL, es porque la manipulaci?n que se va a hacer de los datos > requiere expresiones regulares *avanzadas* o alguna librer?a externa > provista con Perl para algo que no se puede hacer con PL/pgSQL. > > PL/pgSQL tiene toda la funcionalidad necesaria para manipular datos, > aplicar expresiones regulares, operar sobre cadenas y n?meros, efectuar > consultas est?ticas o din?micas paralelizables, y cuenta con las > estructuras de control para expresar algoritmos generales, con un > desempe?o que ha de ser superior al de Perl porque se ahorra el paso de > datos a una m?quina virtual diferente. No es necesario que den m?s > detalles sobre lo que intentan hacer con PL/perlU, pero reflexionen al > respecto porque es posible que lo que traten de hacer salga mucho m?s > f?cil con PL/pgSQL. > > Al final, PL/pgSQL debe ser el primer lenguaje almacenado a usar en > PostgreSQL, y PL/R el segundo, con cualquier otro en un *distante* > tercero. > > > Cuando corro la funci?n desarrollada en pl/perlu me da error de > > sintaxis cerda de "xxxx". Con lo que no estamos muy claros es con > > spi_exec_query, me explico: > > > Estamos haciendo una funci?n que consulta unas tablas, y el resultado > > de la consulta devuelve un dato, es decir, no es un arreglo, sino un > > valor, para ello coloqu? algo as?: > > > > > > my $tabla_id = spi_exec_query("SELECT esquema.tabla.id from > > esquema.tabla WHERE esquema.tabla.nombre LIKE '% $valor%'") or > > elog(ERROR, qq{$tabla_id $!}); > > Interpolar $valor no es buena idea, pues se presta a ataques de > inyecci?n de SQL. Es mejor usar quote_literal() o quote_ident() seg?n el > caso, aunque lo realmente correcto es usar la familia > > spi_prepare > spi_query_prepared > spi_exec_prepared > spi_freeplan > > para que la consulta sea reutilizable. El c?digo que presentan va a > hacerle da?o al cach? de instrucciones de PostgreSQL porque cada > invocaci?n va a corresponder a una instrucci?n "diferente" cuando se > podr?a tener un plan de ejecuci?n ?nico reutilizable. > > El error de sintaxis ocurre por usar 'or' como conector en una > expresi?n, pues el 'or' es una *instrucci?n* y no un *operador*. Citando > el manual 'perlop': Using "or" for assignment is unlikely to do what you > want; see below. Y cuando uno 'sees below' comprende que > > my $variable = spi_exec_query(...) or elog(...) > > en realidad es interpretado como > > my ($variable = spi_exec_query(...)) or elog(...) > > que es un error de sintaxis. Cambien 'or' por '||' o '//'. > > > Deseo guardar en $tabla_id el valor que retorna el select, el cual no > > es un conjunto de datos, sino un solo dato, para ello es correcta la > > forma como est? escrita la instrucci?n??? > > No. > > > O debo hacer $datoquequiero = $tabla->{rows}; ???? > > Tampoco. > > my $r = spi_exec_query(...) > > Revisar el manual de PL/perl para PostgreSQL revela que el resultado de > spi_exec_query() es una referencia a un hash, una de cuyas claves es > > $r->{rows} > > que contiene todas las filas como un *arreglo de referencias a hashes*, > de manera que si quiero la columna 'foo' de la fila 42 > > $r->{rows}[42]->{foo} > > Incidentalmente, un debugger no habr?a servido de nada, porque el error > fundamental aqu? es de sintaxis, consecuencia de usar un 'or', as? que > nunca habr?a llegado a ejecutar ni una instrucci?n. Personalmente, > hubiera seleccionado el trozo de Perl en mi editor (vim) e invocado > 'perl -c' para confirmar la sintaxis, habr?a obtenido un > > Found = in conditional, should be == at foo.pl line ... > > y de all? se deduce el error que involucra el 'or'. > -- > Ernesto Hern?ndez-Novich - @iamemhn - Unix: Live free or die! > Geek by nature, Linux by choice, Debian of course. > If you can't aptitude it, it isn't useful or doesn't exist. > GPG Key Fingerprint = 0064 ADF5 EB5C DE16 99C1 6C56 F2A3 86B5 A757 E5A1 > > _______________________________________________ > caracas-pm mailing list > caracas-pm at pm.org > http://mail.pm.org/mailman/listinfo/caracas-pm > -------------- next part -------------- An HTML attachment was scrubbed... URL: From fobispo at isc.org Sun Aug 24 12:50:45 2014 From: fobispo at isc.org (Francisco Obispo) Date: Sun, 24 Aug 2014 12:50:45 -0700 Subject: [caracas-pm] =?iso-8859-1?q?Como_verificar_la_sintaxis_de_una_fun?= =?iso-8859-1?q?ci=F3n_plPerl_en_postgres?= In-Reply-To: References: <1408677076.5716.28.camel@trillian.itverx.com.ve> Message-ID: On Aug 21, 2014, at 8:51 PM, Monica Tahan wrote: > Gracias Ernesto por tu respuesta... > > Si efectivamente, la raz?n por la que recurrimos a usar pl/perlU, es por sus bondades para el procesamiento de archivos de textos CSV, funcionalidad que no iba a poder emplear en su m?xima expresi?n en pl/perl sencillo o con plpgsql, que es el que se debe emplear primero que cualquier otro como mencionas. En este caso puntual estamos usando librer?as externas para la conversi?n de tipo de codificaci?n del archivo y estructuras de validaci?n con expresiones regulares, de los datos del CSV origen. > Postgres tiene muchas facilidades para procesar archivos CSV, incluyendo FDW (Foreign Data Wrappers) que permiten acceder a los datos sin tener que importarlos. Procesar archivos CSV es mas dif?cil de lo que parece, si estas usando perl sin usar Text::CSV_XS, les recomiendo que lo vean. > El error de sintaxis estaba en las estructuras de los inserts, porque el dato no se estaba guardando, sino estaba intentando insertar en hash (mala mia), ya hab?amos hecho el perl -c y la sintaxis de perl estaba OK, era sintaxys SQL errada. Hoy resolvimos el problema, haciendo lo siguiente: > > 1. Tomamos la expresi?n que va despu?s del like y la construimos en una variable concaten?ndole la expresi?n regular para a?adir los porcentajes. > 2. Tomamos el dato empleando la expresi?n: my $dato_id = $query_id->{rows}[0]->{id_columna}; > > Ya con eso, la funci?n corri? correctamente y no hubo inconvenientes. Voy tomar en cuenta tu recomendaci?n respecto al uso de la familia SPI, pues me interesa que el tiempo de ejecuci?n sea imperceptible para el usuario. > > Gracias a todos por sus respuestas, feliz noche... > La mejor recomendaci?n que puedes tomar del comentario de ernesto, es que migren todo a PLPGSQL. Saludos