Thread: New cast between inet/cidr and bytea

New cast between inet/cidr and bytea

From
Zoltan Boszormenyi
Date:
Hi,

we at Cybertec have developed cast functions in C between
inet/cidr <-> bytea for a client and we would like to submit it.

This is how it works:
- IPv4 inet/cidr value will return 4 bytes if the netmask covers all 32 
bits. It returns 5 bytes if the netmask is shorter than 32 bits.
- Similarly for IPv6, 12[+1] bytes is returned.
- 4, 5, 12 or 13 bytes long bytea values are converted to an inet/cidr value, the 5th or 13th byte is range-checked to
bea valid netmask value.
 

What are the requirements for it to be accepted
as a core cast function or as a contrib module?

-- 
----------------------------------
Zoltán Böszörményi
Cybertec Geschwinde & Schönig GmbH
http://www.postgresql.at/



Re: New cast between inet/cidr and bytea

From
Bruce Momjian
Date:
Zoltan Boszormenyi wrote:
> Hi,
> 
> we at Cybertec have developed cast functions in C between
> inet/cidr <-> bytea for a client and we would like to submit it.
> 
> This is how it works:
> - IPv4 inet/cidr value will return 4 bytes if the netmask covers all 32 
> bits.
>   It returns 5 bytes if the netmask is shorter than 32 bits.
> - Similarly for IPv6, 12[+1] bytes is returned.
> - 4, 5, 12 or 13 bytes long bytea values are converted
>   to an inet/cidr value, the 5th or 13th byte is range-checked
>   to be a valid netmask value.
> 
> What are the requirements for it to be accepted
> as a core cast function or as a contrib module?

You discuss it on the hackers list.  Have you read the developer's FAQ? 
What is the use case for such a cast?

--  Bruce Momjian  <bruce@momjian.us>          http://momjian.us EnterpriseDB
http://www.enterprisedb.com
 + If your life is a hard drive, Christ can be your backup. +


Re: New cast between inet/cidr and bytea

From
Tom Lane
Date:
Zoltan Boszormenyi <zb@cybertec.at> writes:
> we at Cybertec have developed cast functions in C between
> inet/cidr <-> bytea for a client and we would like to submit it.

Why is this a good idea?  Exposing the internal representation of a
datatype is usually bad.  What will you do when we add support for
scoped IPv6 addressing, to take one obvious example?
        regards, tom lane


Re: New cast between inet/cidr and bytea

From
Zoltan Boszormenyi
Date:
Bruce Momjian írta:
> Zoltan Boszormenyi wrote:
>   
>> Hi,
>>
>> we at Cybertec have developed cast functions in C between
>> inet/cidr <-> bytea for a client and we would like to submit it.
>>
>> This is how it works:
>> - IPv4 inet/cidr value will return 4 bytes if the netmask covers all 32 
>> bits.
>>   It returns 5 bytes if the netmask is shorter than 32 bits.
>> - Similarly for IPv6, 12[+1] bytes is returned.
>> - 4, 5, 12 or 13 bytes long bytea values are converted
>>   to an inet/cidr value, the 5th or 13th byte is range-checked
>>   to be a valid netmask value.
>>
>> What are the requirements for it to be accepted
>> as a core cast function or as a contrib module?
>>     
>
> You discuss it on the hackers list.

That's what I am trying to.

>   Have you read the developer's FAQ? 
>   

Not yet in its entireness.

> What is the use case for such a cast?
>   
e.g.:
# select '192.168.0.1'::inet::bytea;     bytea      
------------------\300\250\000\001
(1 row)

# select '192.168.0.0/24'::inet::bytea;       bytea        
----------------------\300\250\000\000\030
(1 row)

# select decode('\\300\\250\\000\\001', 'escape')::inet;  decode   
-------------192.168.0.1
(1 row)

# select decode('\\300\\250\\000\\000\\030', 'escape')::inet;    decode    
----------------192.168.0.2/24
(1 row)

Similarly for IPv6 addresses.
The application doesn't want to parse the textual IP address
when all the parsing and checking intelligence is already there
in the inet/cidr type checks. The reverse when you pass in bytes
is only a logical extension.

-- 
----------------------------------
Zoltán Böszörményi
Cybertec Geschwinde & Schönig GmbH
http://www.postgresql.at/



Re: New cast between inet/cidr and bytea

From
Zoltan Boszormenyi
Date:
Tom Lane írta:
> Zoltan Boszormenyi <zb@cybertec.at> writes:
>   
>> we at Cybertec have developed cast functions in C between
>> inet/cidr <-> bytea for a client and we would like to submit it.
>>     
>
> Why is this a good idea?  Exposing the internal representation of a
> datatype is usually bad.

I didn't expose the inet/cidr internals.

An IP address is an IP address whether you represent it
textually or as a series of bytes. Since the rise of the CIDR
type netmask usage, there is not much support for netmasks
with holes in the middle of the bits, like 255.255.192.128
on the 'net. And there is no support for this kind of netmask
in PostgreSQL either. So, to don't lose data (the netmask _is_
an important data) we decided to go this way.
A single IP address without the netmask means the netmask
covers the whole 32 or 128 bits in real life, too.

>   What will you do when we add support for
> scoped IPv6 addressing, to take one obvious example?
>   

It can still be represented as a series of bytes, won't it?
Just as in an actual IP packet header.
When the support arrives, I can fix the cast, too, if needed.

>             regards, tom lane
>   

Best regards

-- 
----------------------------------
Zoltán Böszörményi
Cybertec Geschwinde & Schönig GmbH
http://www.postgresql.at/



Re: New cast between inet/cidr and bytea

From
Tom Lane
Date:
Zoltan Boszormenyi <zb@cybertec.at> writes:
> Bruce Momjian �rta:
>> What is the use case for such a cast?

> The application doesn't want to parse the textual IP address
> when all the parsing and checking intelligence is already there
> in the inet/cidr type checks.

This presumes exactly the assumption we are questioning, namely that
there's a universal binary representation for these things.  There might
be such for bare IP addresses (ignoring endianness) but the argument
doesn't scale to CIDR.  You've also failed to make the case that this
application designer has made a sane judgment about whether avoiding
parsing is a good tradeoff here.

Also: to the extent that the application is willing to deal with a
Postgres-specific inet/cidr representation (which, in the end, is
what this would be) it can do that *today* using binary output format.
So I'm still not seeing an argument for exposing a cast to bytea.
        regards, tom lane


Re: New cast between inet/cidr and bytea

From
Zoltan Boszormenyi
Date:
Tom Lane írta:
> Zoltan Boszormenyi <zb@cybertec.at> writes:
>   
>> Bruce Momjian írta:
>>     
>>> What is the use case for such a cast?
>>>       
>
>   
>> The application doesn't want to parse the textual IP address
>> when all the parsing and checking intelligence is already there
>> in the inet/cidr type checks.
>>     
>
> This presumes exactly the assumption we are questioning, namely that
> there's a universal binary representation for these things.

But there is: network order.

>   There might
> be such for bare IP addresses (ignoring endianness) but the argument
> doesn't scale to CIDR.

Would you enlighten me why not?

>   You've also failed to make the case that this
> application designer has made a sane judgment about whether avoiding
> parsing is a good tradeoff here.
>   

So, reinventing the wheel is always the way to go?
Even when the app is actually storing those IP addresses
with the type and features PostgreSQL provides?

> Also: to the extent that the application is willing to deal with a
> Postgres-specific inet/cidr representation (which, in the end, is
> what this would be) it can do that *today* using binary output format.
> So I'm still not seeing an argument for exposing a cast to bytea.
>
>             regards, tom lane
>   

But the binary output of inet/cidr needs another round of parsing
which requires using internal server headers.

Would you like a 4/8/16/32 byte output using IP only
or IP + fully represented netmask better?

Best regards,

-- 
----------------------------------
Zoltán Böszörményi
Cybertec Geschwinde & Schönig GmbH
http://www.postgresql.at/



Re: New cast between inet/cidr and bytea

From
Andrew Dunstan
Date:

Zoltan Boszormenyi wrote:
>> Also: to the extent that the application is willing to deal with a
>> Postgres-specific inet/cidr representation (which, in the end, is
>> what this would be) it can do that *today* using binary output format.
>> So I'm still not seeing an argument for exposing a cast to bytea.
>>
>>             regards, tom lane
>>   
>
> But the binary output of inet/cidr needs another round of parsing
> which requires using internal server headers.
>
> Would you like a 4/8/16/32 byte output using IP only
> or IP + fully represented netmask better?
>
>

How are you getting the bytea output? If as text then you're going to be 
doing parsing anyway; if as binary, why not just get the binary of the 
base type directly? It is not clear to me why we should provide this 
facility just for inet/cidr - if it is justified in that case it should 
be required for all types.

cheers

andrew