Не удалось найти функцию преобразования из неизвестного в текст

в одном из моих операторов select у меня есть следующая ошибка:

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

Это легко исправить с помощью cast, но я не совсем понимаю, почему это произошло. Я объясню свое замешательство двумя простыми утверждениями.

написать:

select 'text'
union all
select 'text';

это вернет ошибку:

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

Я знаю, что могу исправить это легко:

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

почему преобразование не выполняется во втором примере? Есть какая-то логика я не понять или это будет исправлено в будущей версии PostgreSQL?

PostgreSQL 9.1.9

такое же поведение на PostgreSQL 9.2.4 ( SQL Fiddle)

1 ответов


Postgres счастлив, если он может обнаруживать типы нетипизированных констант из контекста. Но когда какой-либо контекст невозможен, и когда запрос немного сложнее, чем тривиальный, тогда этот механизм терпит неудачу. Эти правила специфичны для любого предложения SELECT, и некоторые из них более строгие, некоторые нет. Если я могу сказать, то старые процедуры более терпимы (из-за более высокой совместимости с Oracle и меньшего негативного влияния на новичков), современные менее терпимы (из-за более высокой безопасности для типа ошибки.)

некоторые предложения пытались работать с любой неизвестной литеральной константой, такой как текстовая константа, но были отклонены по нескольким причинам. Поэтому я не ожидаю значительных изменений в этой области. Эта проблема обычно связана с синтетическими тестами-и меньше с реальными запросами, где типы выводятся из типов столбцов.