Не удалось найти функцию преобразования из неизвестного в текст
в одном из моих операторов 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 и меньшего негативного влияния на новичков), современные менее терпимы (из-за более высокой безопасности для типа ошибки.)
некоторые предложения пытались работать с любой неизвестной литеральной константой, такой как текстовая константа, но были отклонены по нескольким причинам. Поэтому я не ожидаю значительных изменений в этой области. Эта проблема обычно связана с синтетическими тестами-и меньше с реальными запросами, где типы выводятся из типов столбцов.