无法find从未知到文本的转换function

在我的一个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' 

为什么第二个例子中的转换失败? 有没有一些我不明白的逻辑,或者在未来的Pos​​tgreSQL版本中会被修复?

PostgreSQL 9.1.9

PostgreSQL 9.2.4上的相同行为( SQL Fiddle )

Postgres很高兴,如果它可以从上下文中检测出types的无types常量。 但是,当任何上下文是不可能的,当查询稍微复杂一点,然后这个机制失败。 这些规则对于任何SELECT子句都是特定的,有些更严格,有些则不是。 如果我可以这么说,那么较老的例程更宽容(由于与Oracle的兼容性较高,对初学者的负面影响较小),现代人较不宽容(由于types错误的安全性较高)。

有一些build议尝试使用文本常量等任何未知文字常量,但由于更多原因而被拒绝。 所以我不期望在这方面发生重大变化。 这个问题通常与综合testing相关 – 而不是真正的查询,其中types是从列types中推导出来的。