Обсуждение: inet subtraction fails with IPv6?
Example (using one of google's IPv6 addrs): jnelson=# select inet '0::0' - inet '2001:4860:4006:800::1011'; ERROR: result is out of range jnelson=# -- Jon
On Tue, Jan 31, 2012 at 10:38 AM, Jon Nelson <jnelson+pgsql@jamponi.net> wr= ote: > Example (using one of google's IPv6 addrs): > > jnelson=3D# select inet '0::0' - inet '2001:4860:4006:800::1011'; > ERROR: =A0result is out of range > jnelson=3D# What were you expecting to get? There's no such thing as a negative IP add= ress. --=20 Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
On Tue, Jan 31, 2012 at 2:03 PM, Robert Haas <robertmhaas@gmail.com> wrote: > On Tue, Jan 31, 2012 at 10:38 AM, Jon Nelson <jnelson+pgsql@jamponi.net> = wrote: >> Example (using one of google's IPv6 addrs): >> >> jnelson=3D# select inet '0::0' - inet '2001:4860:4006:800::1011'; >> ERROR: =C2=A0result is out of range >> jnelson=3D# > > What were you expecting to get? =C2=A0There's no such thing as a negative= IP address. True, but it works for IPv4: jnelson=3D# select inet '255.255.255.255' - inet '0/0'; ?column? ------------ 4294967295 (1 row) Time: 0.417 ms jnelson=3D# select inet '0/0' - inet '255.255.255.255'; ?column? ------------- -4294967295 (1 row) Time: 0.166 ms jnelson=3D# If it makes you happy, reverse the arguments and try it again. --=20 Jon
Jon Nelson <jnelson+pgsql@jamponi.net> writes:
> On Tue, Jan 31, 2012 at 2:03 PM, Robert Haas <robertmhaas@gmail.com> wrote:
>> What were you expecting to get? There's no such thing as a negative IP address.
> True, but it works for IPv4:
> jnelson=# select inet '255.255.255.255' - inet '0/0';
> ?column?
> ------------
> 4294967295
> (1 row)
The inet minus inet operator is defined to yield bigint, so it only
copes for addresses within 2^63 of each other. Short of inventing an
integer type at least 129 bits wide, the only way we could fix this is
to make the operator return numeric instead, which doesn't really seem
like an improvement for typical use-cases. I'm fairly sure this was
debated when the operator was added, and we thought it was an acceptable
limitation; though maybe with IPv6 finally starting to see real usage
it's going to seem less so.
regards, tom lane