PostgreSQL负整数溢出

Luc*_*cas 3 postgresql postgresql-10 postgresql-11

我在使用tinyint扩展时对Postgres进行了一些测试,当时我遇到了关于其范围的令人惊讶的事情.打字时,select -128::tinyint它给了我一条ERROR: tinyint out of range消息,这根本不是我所期待的.

假设负数应该比正的最大值(或单个字节整数为127)大1(或者更小)我认为这是扩展的错误,但是在尝试使用非扩展数字时,我发现完全相同的是发生.

select -32768::smallint - >超出范围

select -2147483648::integer - >超出范围

select -9223372036854775808::bigint - >超出范围

参照数字数据类型的文档(https://www.postgresql.org/docs/current/datatype-numeric.html)这些数字都应该是可能的-所有负数少了一个-32767,-2147483647,-9223372036854775807正常工作,所以我很好奇,为什么会这样,或者这甚至发生在其他人的副本上.

我尝试在ubuntu 16.x桌面上使用postgresql 10和postgresql 11.

a_h*_*ame 5

认为这是因为强制转换操作符::的优先级高于减号.

因此-32768::smallint执行-1 * 32768::smallint确实无效.

使用括号修复此问题:(-32768)::smallint或使用SQL标准cast()运算符:cast(-32768 as smallint)