Thread: lower integer bound not supported
According to documentation (from 9.1 to 9.5) the supported integer ranges are these ones: smallint 2 bytes -32768 to +32767 integer 4 bytes -2147483648 to +2147483647 bigint 8 bytes -9223372036854775808 to +9223372036854775807 But the lowest bound is not really supported: # select -32768::int2; ERROR: smallint out of range # select -2147483648::int4; ERROR: integer out of range # select -9223372036854775808::int8; ERROR: bigint out of range This happens with server versions 9.1.22, 9.3.6 and 9.5(unspecified). Is it the code or the documentation being broken ? To me, the documentation makes the most sense, and the code is broken. --strk; () Free GIS & Flash consultant/developer /\ https://strk.kbt.io/services.html
Sandro Santilli wrote: > According to documentation (from 9.1 to 9.5) the supported > integer ranges are these ones: > > smallint 2 bytes -32768 to +32767 > integer 4 bytes -2147483648 to +2147483647 > bigint 8 bytes -9223372036854775808 to +9223372036854775807 > > But the lowest bound is not really supported: > > # select -32768::int2; > ERROR: smallint out of range > # select -2147483648::int4; > ERROR: integer out of range > # select -9223372036854775808::int8; > ERROR: bigint out of range This is reported every once in a while. It's not a bug, just an operator precedence issue: the :: binds more tightly than the unary - so the number is interpreted as a positive value first, which is indeed out of range. Try "(-32768)::int2". Maybe it would be clearer if the error message indicated what's the value that's out of range, so that the lack of the minus might make the problem more evident; and perhaps add a HINT suggesting to add the parens? -- Álvaro Herrera http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
On Wed, Jun 08, 2016 at 12:37:59PM -0400, Alvaro Herrera wrote: > Sandro Santilli wrote: > > According to documentation (from 9.1 to 9.5) the supported > > integer ranges are these ones: > > > > smallint 2 bytes -32768 to +32767 > > integer 4 bytes -2147483648 to +2147483647 > > bigint 8 bytes -9223372036854775808 to +9223372036854775807 > > > > But the lowest bound is not really supported: > > > > # select -32768::int2; > > ERROR: smallint out of range > > # select -2147483648::int4; > > ERROR: integer out of range > > # select -9223372036854775808::int8; > > ERROR: bigint out of range > > This is reported every once in a while. It's not a bug, just an > operator precedence issue: the :: binds more tightly than the unary - so > the number is interpreted as a positive value first, which is indeed out > of range. Try "(-32768)::int2". That explains! > Maybe it would be clearer if the error message indicated what's the > value that's out of range, so that the lack of the minus might make the > problem more evident; and perhaps add a HINT suggesting to add the > parens? An HINT suggesting parens would be very very helpful. --strk;