inet increment with int

Поиск
Список
Период
Сортировка
От Patrick Welche
Тема inet increment with int
Дата
Msg-id 20050905182501.GS8469@quartz.itdept.newn.cam.ac.uk
обсуждение исходный текст
Ответы Re: inet increment with int  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: inet increment with int  (Bruce Momjian <pgman@candle.pha.pa.us>)
Re: inet increment with int  (Bruce Momjian <pgman@candle.pha.pa.us>)
Список pgsql-hackers
Ilya Kovalenko posted some code at in a thread starting at

  http://archives.postgresql.org/pgsql-hackers/2005-04/msg00417.php

which lead to the TODO item:

* Allow INET + INT4 to increment the host part of the address, or
  throw an error on overflow

I think that the naively coded function attached does what is needed, e.g.,

CREATE OR REPLACE FUNCTION inet_inc(inet, int4)
        RETURNS inet
        AS '/tmp/inet.so','inet_inc'
        LANGUAGE C STRICT;

CREATE OPERATOR + (
        leftarg = inet,
        rightarg = int4,
        procedure = inet_inc
);

test=# select '192.168.0.1/24'::inet + 300;
ERROR:  Increment (300) too big for network (/24)
test=# select '192.168.0.1/24'::inet + 254;
     ?column?
------------------
 192.168.0.255/24
(1 row)

test=# select '192.168.0.1/24'::inet + 255;
ERROR:  Increment (255) takes address (192.168.0.1) out of its network (/24)
test=# select '192.168.0.1/24'::inet + -2;
ERROR:  Increment (-2) takes address (192.168.0.1) out of its network (/24)
test=# select '255.255.255.254/0'::inet + 2;
ERROR:  Increment (2) takes address (255.255.255.254) out of its network (/0)

and just for fun:

create table list (
        host inet
);

insert into list values ('192.168.0.1/24');
insert into list values ('192.168.0.2/24');
insert into list values ('192.168.0.4/24');
insert into list values ('192.168.0.5/24');
insert into list values ('192.168.0.6/24');
insert into list values ('192.168.0.8/24');
insert into list values ('192.168.0.9/24');
insert into list values ('192.168.0.10/24');
insert into list values ('192.168.1.1/24');
insert into list values ('192.168.1.3/24');

select host+1 from list
 where host+1 <<= '192.168.1.0/24'
   and not exists
       ( select 1
           from list
          where host=host+1
            and host << '192.168.1.0/24' )
 limit 1;



If you agree that this is the right thing, I can code it less
naively, (Ilya rightly uses ntohl/htonl), create the operator's
commutator, provide a patch which makes it a built-in, and some
obvious documentation.

Cheers,

Patrick

Вложения

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

Предыдущее
От: Peter Eisentraut
Дата:
Сообщение: Re: Call for 7.5 feature completion
Следующее
От: Patrick Welche
Дата:
Сообщение: Re: Proof of concept COLLATE support with patch