From: | Patrick Welche <prlw1(at)newn(dot)cam(dot)ac(dot)uk> |
---|---|
To: | pgsql-hackers(at)postgresql(dot)org |
Subject: | inet increment with int |
Date: | 2005-09-05 18:25:01 |
Message-ID: | 20050905182501.GS8469@quartz.itdept.newn.cam.ac.uk |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | 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
Attachment | Content-Type | Size |
---|---|---|
inet.c | text/plain | 1.9 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Patrick Welche | 2005-09-05 18:42:16 | Re: Proof of concept COLLATE support with patch |
Previous Message | Peter Eisentraut | 2005-09-05 15:43:16 | Re: Call for 7.5 feature completion |