虽然CockroachDB支持PostgreSQL语法和驱动程序,但它不是完全兼容PostgreSQL。 本文记录了PostgreSQL和CockroachDB之间在已知的相同输入情况下,存在差异的列表。 也就是说,此处列出的类型的SQL语句将与PostgreSQL中的行为不同。 将现有应用程序移植到CockroachDB将需要更改这些表达式。

请注意,其中一些差异仅适用于极少见的输入,因此即使使用列出的功能,也不需要进行任何更改。 在这些情况下,忽略指令移植是安全的。

本文档目前仅介绍如何重写SQL表达式。 对于含有CockroachDB不支持的SQL功能的应用程序,例如ENUM类型,本文并没有讨论对应的移植策略。

float溢出

在PostgreSQL中,对于float类型,当其溢出或者表达式返回Infinity时,返回错误:

postgres=# select 1e300::float * 1e10::float;
ERROR:  value out of range: overflow
postgres=#  select pow(0::float, -1::float);
ERROR:  zero raised to a negative power is undefined

在CockroachDB中,这些表达式返回Infinity:

SELECT 1e300::float * 1e10::float;
+----------------------------+
| 1e300::FLOAT * 1e10::FLOAT |
+----------------------------+
| +Inf                       |
+----------------------------+
SELECT pow(0::float, -1::float);
+---------------------------+
| pow(0::FLOAT, - 1::FLOAT) |
+---------------------------+
| +Inf                      |
+---------------------------+

一元运算符的优先级

在PostgreSQL中,一元~(按位非)运算符的优先级较低。 例如,以下查询被解析为〜(1 + 2)因为~的优先级低于+

SELECT ~1 + 2

在CockroachDB中,一元~与一元-具有相同(高)优先级,因此上述表达式将被解析为(~1)+ 2

移植指令:在依赖于PostgreSQL行为的表达式周围手动添加括号。

位运算符的优先级

在PostgreSQL中,运算符|(OR),(XOR)和(AND)都具有相同的优先级。 在CockroachDB中,从最高到最低的优先级是:|

移植指令:在依赖于PostgreSQL行为的表达式周围手动添加括号。

整数除法

在PostgreSQL中,整数除法产生一个整数。 例如,以下查询返回1,因为1/2被截断为0

SELECT 1 + 1 / 2

在CockroachDB中,整数除法产生decimal。 不过,CockroachDB提供了//运算符使整数除法产生整数。 移植指令:在整数除法中将/更改为//,其结果必须是整数。

Shift参数模

在PostgreSQL中,移位运算符(<<>>)有时将其第二个参数模除为基础类型的位大小。 例如,以下查询结果为1,因为int类型为32位,而32%320,因此这相当于“1 << 0”:

SELECT 1::int << 32

在CockroachDB中,不会执行这样的模数。

移植指令:手动向第二个参数添加模数。 另请注意,CockroachDB的INT类型始终为64位。 例如:

SELECT 1::int << (x % 64)