Re: inet/cidr type comparisons

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: inet/cidr type comparisons
Дата
Msg-id 5516.992281261@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: inet/cidr type comparisons  (Alex Pilosov <alex@pilosoft.com>)
Ответы Re: inet/cidr type comparisons  (Alex Pilosov <alex@pilosoft.com>)
Список pgsql-hackers
Alex Pilosov <alex@pilosoft.com> writes:
> What I have right now is rewriting a <<= b to use index plan :
> (a >= network(b)) && ( a <= broadcast(b) )
> However, that breaks down, since (for example) 
> if a=10.1.2.3/32 and b = 10.1.2.0/24, broadcast(b) will be 10.1.2.255/24,
> but 10.1.2.255/24 is considered to be less than 10.1.2.3/32...

That simply demonstrates that broadcast(b) is not the right function to
use to derive an indexscan bound.  You probably want to do this the same
way that textual indexscan bounds are derived, viz for b = '10.1.2.0/24'
a >= '10.1.2.0/24' AND a < '10.1.3.0/24'

In other words, increment the network part.  This is for the same
reasons that motivate the construction of indexscan limits for
"a LIKE 'abc%'" as "a >= 'abc' AND a < 'abd'".

While there may not be a user-visible function for next-network-part,
that hardly matters since the special-indexqual stuff isn't user-visible
either.


> So what I'm going to do then is to make a function set_masklen(inet|cidr,
> int4) which would take an existing address and return a new value with
> changed masklen.

There may or may not be any reason to export such a function; are there
other uses for such a thing?


> Also, I'd like to create casting functions from varchar to inet/cidr,
> since they are missing. Functions I'm writing:

Should be functions from text to inet/cidr, for consistency with the
rest of Postgres.

> varchar_inet(varchar, int4)
> varchar_cidr(varchar, int4)

> (the last two variants will take masklen as a separate argument)

And do what exactly?  What if the text string specifies masklen too?

Unless this is a very common scenario, seems it's sufficient to provide
text to inet/cidr.  The other can be done with the equivalent of
inet('10.1.2.3' || '/' || '32').
        regards, tom lane


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Jim Mercer
Дата:
Сообщение: Re: inet/cidr type comparisons
Следующее
От: Alex Pilosov
Дата:
Сообщение: Re: inet/cidr type comparisons