create table pl_inet ( host text, abbrev text, masklen int, network inet, netmask inet, first inet, last inet ); create or replace function inet_val(inet) returns pl_inet as ' a = args[0] [a.host, a.abbrev, a.masklen, a.network, a.netmask, a.first, a.last] ' language 'plruby'; select * from inet_val('192.168.1'::cidr); host | abbrev | masklen | network | netmask | first | last -------------+--------------+---------+----------------+---------------+----------------+--------------- 192.168.1.0 | 192.168.1/24 | 24 | 192.168.1.0/24 | 255.255.255.0 | 192.168.1.0/24 | 192.168.1.255 (1 row) select * from inet_val('192.168.1.226/24'::inet); host | abbrev | masklen | network | netmask | first | last ---------------+------------------+---------+----------------+---------------+----------------+--------------- 192.168.1.226 | 192.168.1.226/24 | 24 | 192.168.1.0/24 | 255.255.255.0 | 192.168.1.0/24 | 192.168.1.255 (1 row) select * from inet_val('192.168.1.0/24'::cidr); host | abbrev | masklen | network | netmask | first | last -------------+--------------+---------+----------------+---------------+----------------+--------------- 192.168.1.0 | 192.168.1/24 | 24 | 192.168.1.0/24 | 255.255.255.0 | 192.168.1.0/24 | 192.168.1.255 (1 row) select * from inet_val('192.168.1.226'::inet); host | abbrev | masklen | network | netmask | first | last ---------------+---------------+---------+------------------+-----------------+------------------+--------------- 192.168.1.226 | 192.168.1.226 | 32 | 192.168.1.226/32 | 255.255.255.255 | 192.168.1.226/32 | 192.168.1.226 (1 row) select * from inet_val('192.168.1'::cidr); host | abbrev | masklen | network | netmask | first | last -------------+--------------+---------+----------------+---------------+----------------+--------------- 192.168.1.0 | 192.168.1/24 | 24 | 192.168.1.0/24 | 255.255.255.0 | 192.168.1.0/24 | 192.168.1.255 (1 row) select * from inet_val('192.168.1.0/24'::inet); host | abbrev | masklen | network | netmask | first | last -------------+----------------+---------+----------------+---------------+----------------+--------------- 192.168.1.0 | 192.168.1.0/24 | 24 | 192.168.1.0/24 | 255.255.255.0 | 192.168.1.0/24 | 192.168.1.255 (1 row) select * from inet_val('192.168.1'::cidr); host | abbrev | masklen | network | netmask | first | last -------------+--------------+---------+----------------+---------------+----------------+--------------- 192.168.1.0 | 192.168.1/24 | 24 | 192.168.1.0/24 | 255.255.255.0 | 192.168.1.0/24 | 192.168.1.255 (1 row) select * from inet_val('192.168.1.0/25'::inet); host | abbrev | masklen | network | netmask | first | last -------------+----------------+---------+----------------+-----------------+----------------+--------------- 192.168.1.0 | 192.168.1.0/25 | 25 | 192.168.1.0/25 | 255.255.255.128 | 192.168.1.0/25 | 192.168.1.127 (1 row) select * from inet_val('192.168.1'::cidr); host | abbrev | masklen | network | netmask | first | last -------------+--------------+---------+----------------+---------------+----------------+--------------- 192.168.1.0 | 192.168.1/24 | 24 | 192.168.1.0/24 | 255.255.255.0 | 192.168.1.0/24 | 192.168.1.255 (1 row) select * from inet_val('192.168.1.255/24'::inet); host | abbrev | masklen | network | netmask | first | last ---------------+------------------+---------+----------------+---------------+----------------+--------------- 192.168.1.255 | 192.168.1.255/24 | 24 | 192.168.1.0/24 | 255.255.255.0 | 192.168.1.0/24 | 192.168.1.255 (1 row) select * from inet_val('192.168.1'::cidr); host | abbrev | masklen | network | netmask | first | last -------------+--------------+---------+----------------+---------------+----------------+--------------- 192.168.1.0 | 192.168.1/24 | 24 | 192.168.1.0/24 | 255.255.255.0 | 192.168.1.0/24 | 192.168.1.255 (1 row) select * from inet_val('192.168.1.255/25'::inet); host | abbrev | masklen | network | netmask | first | last ---------------+------------------+---------+------------------+-----------------+------------------+--------------- 192.168.1.255 | 192.168.1.255/25 | 25 | 192.168.1.128/25 | 255.255.255.128 | 192.168.1.128/25 | 192.168.1.255 (1 row) select * from inet_val('10'::cidr); host | abbrev | masklen | network | netmask | first | last ----------+--------+---------+------------+-----------+------------+---------------- 10.0.0.0 | 10/8 | 8 | 10.0.0.0/8 | 255.0.0.0 | 10.0.0.0/8 | 10.255.255.255 (1 row) select * from inet_val('10.1.2.3/8'::inet); host | abbrev | masklen | network | netmask | first | last ----------+------------+---------+------------+-----------+------------+---------------- 10.1.2.3 | 10.1.2.3/8 | 8 | 10.0.0.0/8 | 255.0.0.0 | 10.0.0.0/8 | 10.255.255.255 (1 row) select * from inet_val('10.0.0.0'::cidr); host | abbrev | masklen | network | netmask | first | last ----------+-------------+---------+-------------+-----------------+-------------+---------- 10.0.0.0 | 10.0.0.0/32 | 32 | 10.0.0.0/32 | 255.255.255.255 | 10.0.0.0/32 | 10.0.0.0 (1 row) select * from inet_val('10.1.2.3/8'::inet); host | abbrev | masklen | network | netmask | first | last ----------+------------+---------+------------+-----------+------------+---------------- 10.1.2.3 | 10.1.2.3/8 | 8 | 10.0.0.0/8 | 255.0.0.0 | 10.0.0.0/8 | 10.255.255.255 (1 row) select * from inet_val('10.1.2.3'::cidr); host | abbrev | masklen | network | netmask | first | last ----------+-------------+---------+-------------+-----------------+-------------+---------- 10.1.2.3 | 10.1.2.3/32 | 32 | 10.1.2.3/32 | 255.255.255.255 | 10.1.2.3/32 | 10.1.2.3 (1 row) select * from inet_val('10.1.2.3/32'::inet); host | abbrev | masklen | network | netmask | first | last ----------+----------+---------+-------------+-----------------+-------------+---------- 10.1.2.3 | 10.1.2.3 | 32 | 10.1.2.3/32 | 255.255.255.255 | 10.1.2.3/32 | 10.1.2.3 (1 row) select * from inet_val('10.1.2'::cidr); host | abbrev | masklen | network | netmask | first | last ----------+-----------+---------+-------------+---------------+-------------+------------ 10.1.2.0 | 10.1.2/24 | 24 | 10.1.2.0/24 | 255.255.255.0 | 10.1.2.0/24 | 10.1.2.255 (1 row) select * from inet_val('10.1.2.3/24'::inet); host | abbrev | masklen | network | netmask | first | last ----------+-------------+---------+-------------+---------------+-------------+------------ 10.1.2.3 | 10.1.2.3/24 | 24 | 10.1.2.0/24 | 255.255.255.0 | 10.1.2.0/24 | 10.1.2.255 (1 row) select * from inet_val('10.1'::cidr); host | abbrev | masklen | network | netmask | first | last ----------+---------+---------+-------------+-------------+-------------+-------------- 10.1.0.0 | 10.1/16 | 16 | 10.1.0.0/16 | 255.255.0.0 | 10.1.0.0/16 | 10.1.255.255 (1 row) select * from inet_val('10.1.2.3/16'::inet); host | abbrev | masklen | network | netmask | first | last ----------+-------------+---------+-------------+-------------+-------------+-------------- 10.1.2.3 | 10.1.2.3/16 | 16 | 10.1.0.0/16 | 255.255.0.0 | 10.1.0.0/16 | 10.1.255.255 (1 row) select * from inet_val('10'::cidr); host | abbrev | masklen | network | netmask | first | last ----------+--------+---------+------------+-----------+------------+---------------- 10.0.0.0 | 10/8 | 8 | 10.0.0.0/8 | 255.0.0.0 | 10.0.0.0/8 | 10.255.255.255 (1 row) select * from inet_val('10.1.2.3/8'::inet); host | abbrev | masklen | network | netmask | first | last ----------+------------+---------+------------+-----------+------------+---------------- 10.1.2.3 | 10.1.2.3/8 | 8 | 10.0.0.0/8 | 255.0.0.0 | 10.0.0.0/8 | 10.255.255.255 (1 row) select * from inet_val('10'::cidr); host | abbrev | masklen | network | netmask | first | last ----------+--------+---------+------------+-----------+------------+---------------- 10.0.0.0 | 10/8 | 8 | 10.0.0.0/8 | 255.0.0.0 | 10.0.0.0/8 | 10.255.255.255 (1 row) select * from inet_val('11.1.2.3/8'::inet); host | abbrev | masklen | network | netmask | first | last ----------+------------+---------+------------+-----------+------------+---------------- 11.1.2.3 | 11.1.2.3/8 | 8 | 11.0.0.0/8 | 255.0.0.0 | 11.0.0.0/8 | 11.255.255.255 (1 row) select * from inet_val('10'::cidr); host | abbrev | masklen | network | netmask | first | last ----------+--------+---------+------------+-----------+------------+---------------- 10.0.0.0 | 10/8 | 8 | 10.0.0.0/8 | 255.0.0.0 | 10.0.0.0/8 | 10.255.255.255 (1 row) select * from inet_val('9.1.2.3/8'::inet); host | abbrev | masklen | network | netmask | first | last ---------+-----------+---------+-----------+-----------+-----------+--------------- 9.1.2.3 | 9.1.2.3/8 | 8 | 9.0.0.0/8 | 255.0.0.0 | 9.0.0.0/8 | 9.255.255.255 (1 row) select * from inet_val('10:23::f1'::cidr); host | abbrev | masklen | network | netmask | first | last -----------+---------------+---------+---------------+-----------------------------------------+---------------+----------- 10:23::f1 | 10:23::f1/128 | 128 | 10:23::f1/128 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | 10:23::f1/128 | 10:23::f1 (1 row) select * from inet_val('10:23::f1/64'::inet); host | abbrev | masklen | network | netmask | first | last -----------+--------------+---------+------------+-----------------------+------------+---------------------------- 10:23::f1 | 10:23::f1/64 | 64 | 10:23::/64 | ffff:ffff:ffff:ffff:: | 10:23::/64 | 10:23::ffff:ffff:ffff:ffff (1 row) select * from inet_val('10:23::8000/113'::cidr); host | abbrev | masklen | network | netmask | first | last -------------+-----------------+---------+-----------------+-----------------------------------------+-----------------+------------- 10:23::8000 | 10:23::8000/113 | 113 | 10:23::8000/113 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:8000 | 10:23::8000/113 | 10:23::ffff (1 row) select * from inet_val('10:23::ffff'::inet); host | abbrev | masklen | network | netmask | first | last -------------+-------------+---------+-----------------+-----------------------------------------+-----------------+------------- 10:23::ffff | 10:23::ffff | 128 | 10:23::ffff/128 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | 10:23::ffff/128 | 10:23::ffff (1 row) select * from inet_val('::ffff:1.2.3.4'::cidr); host | abbrev | masklen | network | netmask | first | last ----------------+--------------------+---------+--------------------+-----------------------------------------+--------------------+---------------- ::ffff:1.2.3.4 | ::ffff:1.2.3.4/128 | 128 | ::ffff:1.2.3.4/128 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | ::ffff:1.2.3.4/128 | ::ffff:1.2.3.4 (1 row) select * from inet_val('::4.3.2.1/24'::inet); host | abbrev | masklen | network | netmask | first | last -----------+--------------+---------+---------+-------------+-------+------------------------------------ ::4.3.2.1 | ::4.3.2.1/24 | 24 | ::/24 | ffff:ff00:: | ::/24 | 0:ff:ffff:ffff:ffff:ffff:ffff:ffff (1 row) create or replace function mac_cmp(macaddr, macaddr) returns int as ' args[0] <=> args[1] ' language 'plruby'; select mac_cmp('00:07:E9:85:3E:C5'::macaddr, '00:E0:29:3E:E7:25'::macaddr); mac_cmp --------- -1 (1 row) create or replace function mac_trunc(macaddr) returns macaddr as ' args[0].truncate ' language 'plruby'; select mac_trunc('00:07:E9:85:3E:C5'::macaddr); mac_trunc ------------------- 00:07:e9:00:00:00 (1 row) select mac_trunc('00:E0:29:3E:E7:25'::macaddr); mac_trunc ------------------- 00:e0:29:00:00:00 (1 row)