BUG #7575: "between" does not work properly with inet/cidr addresses

Started by Mr Dash Fourover 13 years ago5 messagesbugs
Jump to latest
#1Mr Dash Four
mr.dash.four@googlemail.com

The following bug has been logged on the website:

Bug reference: 7575
Logged by: Mr-4
Email address: mr.dash.four@googlemail.com
PostgreSQL version: 9.1.4
Operating system: Linux (kernel 3.5)
Description:

1. select '10.1.1.0/24'::inet between '10.1.1.0'::inet and
'10.1.1.255'::inet gives me FALSE.

2. select '10.1.0.0/24'::inet between '10.1.0.0'::inet and
'10.1.255.255'::inet also produces FALSE.

To my understanding, 10.1.1.0/24 covers the range 10.1.1.0-10.1.1.255, so
the first statement above should produce TRUE, not FALSE. It is similar to
"select 1 between 1 and 1" which, quite rightly, produces TRUE.

Same goes for the second statement above: 10.1.0.0/24 covers the range
10.1.0.0-10.1.0.255, which falls fully within the 10.1.0.0-10.1.255.255
(10.1.0.0/16) range.

Am I missing something obvious?

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Mr Dash Four (#1)
Re: BUG #7575: "between" does not work properly with inet/cidr addresses

mr.dash.four@googlemail.com writes:

1. select '10.1.1.0/24'::inet between '10.1.1.0'::inet and
'10.1.1.255'::inet gives me FALSE.

Am I missing something obvious?

10.1.1.0/24 is different from, and sorts before, 10.1.1.0/32
(which is what '10.1.1.0'::inet is an abbreviation for).

You might find that the net address inclusion operators (<< and friends)
provide the semantics you're looking for. BETWEEN only knows about
btree sort ordering, which is fundamentally a brick or two shy of a
load when considering two-dimensional quantities such as netmasks.

regards, tom lane

#3Mr Dash Four
mr.dash.four@googlemail.com
In reply to: Tom Lane (#2)
Re: BUG #7575: "between" does not work properly with inet/cidr addresses

10.1.1.0/24 is different from, and sorts before, 10.1.1.0/32
(which is what '10.1.1.0'::inet is an abbreviation for).

You might find that the net address inclusion operators (<< and friends)
provide the semantics you're looking for.

That isn't possible in my case, because on the right side I have IP
ranges (from-to) and currently there isn't a PostgreSQL function which
converts IP ranges to cidr/inet, but even if there was such function
available, this may produce more than one cidr/inet ranges, so it won't
be of much use. Employing << and friends is of no use either, as they
work on inet/cidr on the right side - I can't use something like
"10.1.1.0/24 << (10.1.1.0-10.1.1.255)" for example.

BETWEEN only knows about
btree sort ordering, which is fundamentally a brick or two shy of a
load when considering two-dimensional quantities such as netmasks.

If BETWEEN can't handle operations between cidr/inet and IP ranges
(which is what I highlighted in the initial bug report), it should
either be fixed to produce the correct result or it should return an
error. Leaving things as they are can't be allowed.

#4Dimitri Fontaine
dimitri@2ndQuadrant.fr
In reply to: Mr Dash Four (#3)
Re: BUG #7575: "between" does not work properly with inet/cidr addresses

Mr Dash Four <mr.dash.four@googlemail.com> writes:

That isn't possible in my case, because on the right side I have IP ranges
(from-to) and currently there isn't a PostgreSQL function which converts IP
ranges to cidr/inet, but even if there was such function available, this may
produce more than one cidr/inet ranges, so it won't be of much use.

Have you tried using the ip4r extension yet?

Regards,
--
Dimitri Fontaine
http://2ndQuadrant.fr PostgreSQL : Expertise, Formation et Support

#5Mr Dash Four
mr.dash.four@googlemail.com
In reply to: Dimitri Fontaine (#4)
Re: BUG #7575: "between" does not work properly with inet/cidr addresses

Have you tried using the ip4r extension yet?

First time I am seeing this - well done, exactly what I needed. That
doesn't address the above bug though - the "between" functionality is
still wrong and needs to be corrected.