由于 Postgresql 9.5 中的运算符优先级更改而改变其含义的条件有哪些示例?

问题描述

在 Postgresql 9.5 中,发行说明中列出的破坏向后兼容性的更改之一是:

调整运算符优先级以匹配 sql 标准 (Tom Lane)

= 和 的优先级已降低以匹配 和=。 IS 测试的优先级(例如,x IS NULL)已降低 略低于这六个比较运算符。另外,多关键字 以 NOT 开头的运算符现在具有其基数的优先级 运算符(例如,NOT BETWEEN 现在具有与 BETWEEN) 而在它们具有不一致的优先级之前,行为 喜欢不是关于他们的左操作数,而是喜欢他们的基数 运算符关于他们的右操作数。新的配置 可以启用参数 operator_precedence_warning 来警告 这些优先级更改导致不同解析的查询 选择。

由于上述更改,我发现很难提出改变其含义的查询。什么是这样的查询的例子?

New precedence table

Old precedence table

解决方法

select 1>2 is true;

在 9.4 中它会被解释为 select 1> (2 is true);,这是无效的并抛出错误 error: argument of IS TRUE must be type boolean,not type integer

在 9.5 中,它会被解释为 select (1>2) is true;,它是有效的并返回 false

这些版本仍可在 db-fiddle 上进行测试。