Re: Summary: what to do about INET/CIDR - Mailing list pgsql-hackers
| From | Tom Lane |
|---|---|
| Subject | Re: Summary: what to do about INET/CIDR |
| Date | |
| Msg-id | 8203.973286399@sss.pgh.pa.us Whole thread Raw |
| In response to | Re: Summary: what to do about INET/CIDR (Larry Rosenman <ler@lerctr.org>) |
| Responses |
Re: Summary: what to do about INET/CIDR
Re: Summary: what to do about INET/CIDR Re: Summary: what to do about INET/CIDR |
| List | pgsql-hackers |
Larry Rosenman <ler@lerctr.org> writes:
> What was the final outcome?
I don't think we'd quite agreed what to do. The proposed code changes
are not large, we just need a consensus on what the behavior ought to
be.
Since a couple of people objected to the idea of using casts to control
the output format, here is a strawman Plan C for discussion. This
differs from my last proposal in that the inet() and cidr() pseudo
cast functions are gone, and there are two functions returning text
values that can be used if you don't like the default display formats.
1. CIDR-type values will be displayed in "abbreviated" format, eg "127.1/16". Since a CIDR value is no longer allowed
tohave any nonzero bits to the right of the mask, no information is lost by abbreviation. The /n will appear even
whenit is 32.
2. INET-type values will always be displayed with all octets, eg "127.1.0.0/16". The /n part will be suppressed from
display if it is 32. INET will accept any octet pattern as an address together with any netmask length from 1 to 32.
3. The function host(inet) will return a text representation of just the IP part of an INET or CIDR value, eg,
"127.1.0.0". All four octets will always appear, the netmask will never appear. (This is the same as its current
behavior,I think.)
4. A new function text(inet) will return a text representation of both the IP and netmask parts of an INET or CIDR
value,eg, "127.1.0.0/16". Unlike the default display conversions, all four octets and the netmask length will always
appearin the result. Note that the system will consider this function to be a typecast, so the same result can be
gottenwith inetval::text or CAST(inetval AS text).
[ the rest is the same as in my last proposal: ]
5. The function broadcast(inet) will now return inet not text. It will take the given address octets and force the
bitsto the right of the netmask to 1. The display type will be set to inet. I am inclined to have it return the
samemasklength as the input, so for example broadcast('127.1/16') would yield '127.1.255.255/16'::inet. If you want
thebroadcast address displayed without a netmask notation, you'd need to write host(broadcast(foo)). Alternatively,
wecould say that broadcast() always returns masklen 32, but I think this loses valuable functionality.
6. The function network(inet) will now return cidr not text. The result has the same masklen as the input, with bits
tothe right of the mask zeroed to ensure it is a valid cidr value. The display type will be set to cidr. For
example,network('127.1.2.3/16') will yield '127.1/16'::cidr. To get this result displayed in a different format,
writehost(network(foo)) or text(network(foo)).
7. The function netmask(inet) will now return inet not text. It will return octets with 1s in the input's netmask, 0s
tothe right, and output display type and masklen set to inet and 32. For example, netmask('127.1/16') =
'255.255.0.0/32'::inetwhich will display as '255.255.0.0'. (I suppose a really anal definition would keep the input
masklen,forcing you to write host(netmask(foo)) to get a display without "/n". But I don't see any value in that for
netmasks.)
8. Because we still consider inet and cidr to be binary-equivalent types, all of these functions can be applied to
eitherinet or cidr columns.
Comments?
regards, tom lane
pgsql-hackers by date: