No se pudo encontrar la función de conversión de desconocido a texto


En una de mis instrucciones select tengo 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 cast, pero no entiendo completamente por qué sucedió. Ilustraré mi confusión con dos simples declaraciones.

Este está bien:

select 'text'
union all
select 'text';

Esto devolverá 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é falla la conversión en el segundo ejemplo? ¿Hay alguna lógica que no entiendo o esto se arreglará en la versión futura de PostgreSQL?

PostgreSQL 9.1.9

El mismo comportamiento en PostgreSQL 9.2.4 (SQL Fiddle)

Author: Beryllium, 2013-08-06

1 answers

Postgres está contento, si puede detectar tipos de constantes sin tipo desde el 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 un menor impacto negativo en los principiantes), las modernas son menos tolerantes (debido a una mayor seguridad a los errores de tipo).

Allí fue algunas propuestas tratan de trabajar con cualquier constante literal desconocido como constante de texto, pero fue rechazado por más razones. Así que no espero cambios significativos en esta área. Este problema generalmente está relacionado con pruebas sintéticas, y menos con consultas reales, donde los tipos se deducen de los tipos de columna.

 46
Author: Pavel Stehule,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-06 20:56:28