to_number postgres numerico funcion entero convertir cast caracter cadena postgresql postgresql-9.1 postgresql-9.2

postgresql - postgres - Error al encontrar la función de conversión de desconocido a texto



funcion to_number postgres (1)

En una de mis declaraciones seleccionadas, recibí el siguiente error:

ERROR: failed to find conversion function from unknown to text ********** Error ********** ERROR: failed to find conversion function from unknown to text SQL state: XX000

Esto fue fácil de arreglar usando el cast , pero no entiendo completamente por qué sucedió. Ilustraré mi confusión con dos declaraciones simples.

Este está bien:

select ''text'' union all select ''text'';

Esto devolverá el error:

with t as (select ''text'') select * from t union all select ''text''

Sé que puedo arreglarlo fácilmente:

with t as (select ''text''::text) select * from t union all select ''text''

¿Por qué la conversión falla en el segundo ejemplo? ¿Hay alguna lógica que no entiendo o esto se solucionará en la versión futura de PostgreSQL?

PostgreSQL 9.1.9

El mismo comportamiento en PostgreSQL 9.2.4 ( SQL Fiddle )


Postgres está contento, si puede detectar tipos de constantes sin tipo del contexto. Pero cuando cualquier contexto no es posible, y cuando la consulta es un poco más compleja que trivial, entonces este mecanismo falla. Estas reglas son específicas para cualquier cláusula SELECT, y algunas son más estrictas, otras no. Si puedo decir, entonces las rutinas más antiguas son más tolerantes (debido a una mayor compatibilidad con Oracle y menos impacto negativo en los principiantes), las modernas son menos tolerantes (debido a una mayor seguridad para escribir errores).

Hubo algunas propuestas para intentar trabajar con cualquier constante literal desconocida, como la constante de texto, pero fue rechazada por más razones. Entonces no espero cambios significativos en esta área. Este problema suele estar relacionado con las pruebas sintéticas, y menos con las consultas reales, donde los tipos se deducen de los tipos de columna.