@ -10558,418 +10558,512 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple
<title>Network Address Functions and Operators</title>
<para>
<xref linkend="cidr-inet-operators-table"/> shows the operators
available for the <type>cidr</type> and <type>inet</type> types.
The operators <literal><<</literal>,
<literal><<=</literal>, <literal>>></literal>,
<literal>>>=</literal>, and <literal>&&</literal>
test for subnet inclusion. They
consider only the network parts of the two addresses (ignoring any
host part) and determine whether one network is identical to
or a subnet of the other.
The IP network address types, <type>cidr</type> and <type>inet</type>,
support the usual comparison operators shown in
<xref linkend="functions-comparison-op-table"/>
as well as the specialized operators and functions shown in
<xref linkend="cidr-inet-operators-table"/> and
<xref linkend="cidr-inet-functions-table"/>.
</para>
<table id="cidr-inet-operators-table">
<title><type>cidr</type> and <type>inet</type> Operators</title>
<tgroup cols="3">
<thead>
<row>
<entry>Operator</entry>
<entry>Description</entry>
<entry>Example</entry>
</row>
</thead>
<tbody>
<row>
<entry> <literal><</literal> </entry>
<entry>is less than</entry>
<entry><literal>inet '192.168.1.5' < inet '192.168.1.6'</literal></entry>
</row>
<row>
<entry> <literal><=</literal> </entry>
<entry>is less than or equal</entry>
<entry><literal>inet '192.168.1.5' <= inet '192.168.1.5'</literal></entry>
</row>
<row>
<entry> <literal>=</literal> </entry>
<entry>equals</entry>
<entry><literal>inet '192.168.1.5' = inet '192.168.1.5'</literal></entry>
</row>
<row>
<entry> <literal>>=</literal> </entry>
<entry>is greater or equal</entry>
<entry><literal>inet '192.168.1.5' >= inet '192.168.1.5'</literal></entry>
</row>
<row>
<entry> <literal>></literal> </entry>
<entry>is greater than</entry>
<entry><literal>inet '192.168.1.5' > inet '192.168.1.4'</literal></entry>
</row>
<row>
<entry> <literal><></literal> </entry>
<entry>is not equal</entry>
<entry><literal>inet '192.168.1.5' <> inet '192.168.1.4'</literal></entry>
</row>
<row>
<entry> <literal><<</literal> </entry>
<entry>is contained by</entry>
<entry><literal>inet '192.168.1.5' << inet '192.168.1/24'</literal></entry>
</row>
<row>
<entry> <literal><<=</literal> </entry>
<entry>is contained by or equals</entry>
<entry><literal>inet '192.168.1/24' <<= inet '192.168.1/24'</literal></entry>
</row>
<row>
<entry> <literal>>></literal> </entry>
<entry>contains</entry>
<entry><literal>inet '192.168.1/24' >> inet '192.168.1.5'</literal></entry>
</row>
<row>
<entry> <literal>>>=</literal> </entry>
<entry>contains or equals</entry>
<entry><literal>inet '192.168.1/24' >>= inet '192.168.1/24'</literal></entry>
</row>
<row>
<entry> <literal>&&</literal> </entry>
<entry>contains or is contained by</entry>
<entry><literal>inet '192.168.1/24' && inet '192.168.1.80/28'</literal></entry>
</row>
<row>
<entry> <literal>~</literal> </entry>
<entry>bitwise NOT</entry>
<entry><literal>~ inet '192.168.1.6'</literal></entry>
</row>
<row>
<entry> <literal>&</literal> </entry>
<entry>bitwise AND</entry>
<entry><literal>inet '192.168.1.6' & inet '0.0.0.255'</literal></entry>
</row>
<row>
<entry> <literal>|</literal> </entry>
<entry>bitwise OR</entry>
<entry><literal>inet '192.168.1.6' | inet '0.0.0.255'</literal></entry>
</row>
<row>
<entry> <literal>+</literal> </entry>
<entry>addition</entry>
<entry><literal>inet '192.168.1.6' + 25</literal></entry>
</row>
<row>
<entry> <literal>-</literal> </entry>
<entry>subtraction</entry>
<entry><literal>inet '192.168.1.43' - 36</literal></entry>
</row>
<row>
<entry> <literal>-</literal> </entry>
<entry>subtraction</entry>
<entry><literal>inet '192.168.1.43' - inet '192.168.1.19'</literal></entry>
</row>
</tbody>
</tgroup>
</table>
<para>
<xref linkend="cidr-inet-functions-table"/> shows the functions
available for use with the <type>cidr</type> and <type>inet</type>
types. The <function>abbrev</function>, <function>host</function>,
and <function>text</function>
functions are primarily intended to offer alternative display
formats.
Any <type>cidr</type> value can be cast to <type>inet</type> implicitly;
therefore, the operators and functions shown below as operating on
<type>inet</type> also work on <type>cidr</type> values. (Where there are
separate functions for <type>inet</type> and <type>cidr</type>, it is
because the behavior should be different for the two cases.)
Also, it is permitted to cast an <type>inet</type> value
to <type>cidr</type>. When this is done, any bits to the right of the
netmask are silently zeroed to create a valid <type>cidr</type> value.
</para>
<table id="cidr-inet-functions-table">
<title><type>cidr</type> and <type>inet</type> Functions</title>
<tgroup cols="5">
<thead>
<row>
<entry>Function</entry>
<entry>Return Type</entry>
<entry>Description</entry>
<entry>Example</entry>
<entry>Result</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<indexterm>
<primary>abbrev</primary>
</indexterm>
<literal><function>abbrev(<type>inet</type>)</function></literal>
</entry>
<entry><type>text</type></entry>
<entry>abbreviated display format as text</entry>
<entry><literal>abbrev(inet '10.1.0.0/16')</literal></entry>
<entry><literal>10.1.0.0/16</literal></entry>
</row>
<row>
<entry><literal><function>abbrev(<type>cidr</type>)</function></literal></entry>
<entry><type>text</type></entry>
<entry>abbreviated display format as text</entry>
<entry><literal>abbrev(cidr '10.1.0.0/16')</literal></entry>
<entry><literal>10.1/16</literal></entry>
</row>
<row>
<entry>
<indexterm>
<primary>broadcast</primary>
</indexterm>
<literal><function>broadcast(<type>inet</type>)</function></literal>
</entry>
<entry><type>inet</type></entry>
<entry>broadcast address for network</entry>
<entry><literal>broadcast('192.168.1.5/24')</literal></entry>
<entry><literal>192.168.1.255/24</literal></entry>
</row>
<row>
<entry>
<indexterm>
<primary>family</primary>
</indexterm>
<literal><function>family(<type>inet</type>)</function></literal>
</entry>
<entry><type>int</type></entry>
<entry>extract family of address; <literal>4</literal> for IPv4,
<literal>6</literal> for IPv6</entry>
<entry><literal>family('::1')</literal></entry>
<entry><literal>6</literal></entry>
</row>
<row>
<entry>
<indexterm>
<primary>host</primary>
</indexterm>
<literal><function>host(<type>inet</type>)</function></literal>
</entry>
<entry><type>text</type></entry>
<entry>extract IP address as text</entry>
<entry><literal>host('192.168.1.5/24')</literal></entry>
<entry><literal>192.168.1.5</literal></entry>
</row>
<row>
<entry>
<indexterm>
<primary>hostmask</primary>
</indexterm>
<literal><function>hostmask(<type>inet</type>)</function></literal>
</entry>
<entry><type>inet</type></entry>
<entry>construct host mask for network</entry>
<entry><literal>hostmask('192.168.23.20/30')</literal></entry>
<entry><literal>0.0.0.3</literal></entry>
</row>
<row>
<entry>
<indexterm>
<primary>masklen</primary>
</indexterm>
<literal><function>masklen(<type>inet</type>)</function></literal>
</entry>
<entry><type>int</type></entry>
<entry>extract netmask length</entry>
<entry><literal>masklen('192.168.1.5/24')</literal></entry>
<entry><literal>24</literal></entry>
</row>
<row>
<entry>
<indexterm>
<primary>netmask</primary>
</indexterm>
<literal><function>netmask(<type>inet</type>)</function></literal>
</entry>
<entry><type>inet</type></entry>
<entry>construct netmask for network</entry>
<entry><literal>netmask('192.168.1.5/24')</literal></entry>
<entry><literal>255.255.255.0</literal></entry>
</row>
<row>
<entry>
<indexterm>
<primary>network</primary>
</indexterm>
<literal><function>network(<type>inet</type>)</function></literal>
</entry>
<entry><type>cidr</type></entry>
<entry>extract network part of address</entry>
<entry><literal>network('192.168.1.5/24')</literal></entry>
<entry><literal>192.168.1.0/24</literal></entry>
</row>
<row>
<entry>
<indexterm>
<primary>set_masklen</primary>
</indexterm>
<literal><function>set_masklen(<type>inet</type>, <type>int</type>)</function></literal>
</entry>
<entry><type>inet</type></entry>
<entry>set netmask length for <type>inet</type> value</entry>
<entry><literal>set_masklen('192.168.1.5/24', 16)</literal></entry>
<entry><literal>192.168.1.5/16</literal></entry>
</row>
<row>
<entry><literal><function>set_masklen(<type>cidr</type>, <type>int</type>)</function></literal></entry>
<entry><type>cidr</type></entry>
<entry>set netmask length for <type>cidr</type> value</entry>
<entry><literal>set_masklen('192.168.1.0/24'::cidr, 16)</literal></entry>
<entry><literal>192.168.0.0/16</literal></entry>
</row>
<row>
<entry>
<indexterm>
<primary>text</primary>
</indexterm>
<literal><function>text(<type>inet</type>)</function></literal>
</entry>
<entry><type>text</type></entry>
<entry>extract IP address and netmask length as text</entry>
<entry><literal>text(inet '192.168.1.5')</literal></entry>
<entry><literal>192.168.1.5/32</literal></entry>
</row>
<row>
<entry>
<indexterm>
<primary>inet_same_family</primary>
</indexterm>
<literal><function>inet_same_family(<type>inet</type>, <type>inet</type>)</function></literal>
</entry>
<entry><type>boolean</type></entry>
<entry>are the addresses from the same family?</entry>
<entry><literal>inet_same_family('192.168.1.5/24', '::1')</literal></entry>
<entry><literal>false</literal></entry>
</row>
<row>
<entry>
<indexterm>
<primary>inet_merge</primary>
</indexterm>
<literal><function>inet_merge(<type>inet</type>, <type>inet</type>)</function></literal>
</entry>
<entry><type>cidr</type></entry>
<entry>the smallest network which includes both of the given networks</entry>
<entry><literal>inet_merge('192.168.1.5/24', '192.168.2.5/24')</literal></entry>
<entry><literal>192.168.0.0/22</literal></entry>
</row>
</tbody>
</tgroup>
</table>
<table id="cidr-inet-operators-table">
<title>IP Address Operators</title>
<tgroup cols="1">
<thead>
<row>
<entry role="functableentry">
Operator<?br?>Description<?br?>Example(s)
</entry>
</row>
</thead>
<para>
Any <type>cidr</type> value can be cast to <type>inet</type> implicitly
or explicitly; therefore, the functions shown above as operating on
<type>inet</type> also work on <type>cidr</type> values. (Where there are
separate functions for <type>inet</type> and <type>cidr</type>, it is because
the behavior should be different for the two cases.)
Also, it is permitted to cast an <type>inet</type> value to <type>cidr</type>.
When this is done, any bits to the right of the netmask are silently zeroed
to create a valid <type>cidr</type> value.
In addition,
you can cast a text value to <type>inet</type> or <type>cidr</type>
using normal casting syntax: for example,
<literal>inet(<replaceable>expression</replaceable>)</literal> or
<literal><replaceable>colname</replaceable>::cidr</literal>.
</para>
<tbody>
<row>
<entry role="functableentry">
<type>inet</type> <literal><<</literal> <type>inet</type>
<returnvalue>boolean</returnvalue>
<?br?>
Is subnet strictly contained by subnet?
This operator, and the next four, test for subnet inclusion. They
consider only the network parts of the two addresses (ignoring any
bits to the right of the netmasks) and determine whether one network
is identical to or a subnet of the other.
<?br?>
<literal>inet '192.168.1.5' << inet '192.168.1/24'</literal>
<returnvalue>t</returnvalue>
<?br?>
<literal>inet '192.168.0.5' << inet '192.168.1/24'</literal>
<returnvalue>f</returnvalue>
<?br?>
<literal>inet '192.168.1/24' << inet '192.168.1/24'</literal>
<returnvalue>f</returnvalue>
</entry>
</row>
<para>
<xref linkend="macaddr-functions-table"/> shows the functions
available for use with the <type>macaddr</type> type. The function
<literal><function>trunc(<type>macaddr</type>)</function></literal> returns a MAC
address with the last 3 bytes set to zero. This can be used to
associate the remaining prefix with a manufacturer.
</para>
<row>
<entry role="functableentry">
<type>inet</type> <literal><<=</literal> <type>inet</type>
<returnvalue>boolean</returnvalue>
<?br?>
Is subnet contained by or equal to subnet?
<?br?>
<literal>inet '192.168.1/24' <<= inet '192.168.1/24'</literal>
<returnvalue>t</returnvalue>
</entry>
</row>
<table id="macaddr-functions-table">
<title><type>macaddr</type> Functions</title>
<tgroup cols="5">
<thead>
<row>
<entry>Function</entry>
<entry>Return Type</entry>
<entry>Description</entry>
<entry>Example</entry>
<entry>Result</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<indexterm>
<primary>trunc</primary>
</indexterm>
<literal><function>trunc(<type>macaddr</type>)</function></literal>
</entry>
<entry><type>macaddr</type></entry>
<entry>set last 3 bytes to zero</entry>
<entry><literal>trunc(macaddr '12:34:56:78:90:ab')</literal></entry>
<entry><literal>12:34:56:00:00:00</literal></entry>
</row>
</tbody>
</tgroup>
</table>
<row>
<entry role="functableentry">
<type>inet</type> <literal>>></literal> <type>inet</type>
<returnvalue>boolean</returnvalue>
<?br?>
Does subnet strictly contain subnet?
<?br?>
<literal>inet '192.168.1/24' >> inet '192.168.1.5'</literal>
<returnvalue>t</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<type>inet</type> <literal>>>=</literal> <type>inet</type>
<returnvalue>boolean</returnvalue>
<?br?>
Does subnet contain or equal subnet?
<?br?>
<literal>inet '192.168.1/24' >>= inet '192.168.1/24'</literal>
<returnvalue>t</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<type>inet</type> <literal>&&</literal> <type>inet</type>
<returnvalue>boolean</returnvalue>
<?br?>
Does either subnet contain or equal the other?
<?br?>
<literal>inet '192.168.1/24' && inet '192.168.1.80/28'</literal>
<returnvalue>t</returnvalue>
<?br?>
<literal>inet '192.168.1/24' && inet '192.168.2.0/28'</literal>
<returnvalue>f</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<literal>~</literal> <type>inet</type>
<returnvalue>inet</returnvalue>
<?br?>
Computes bitwise NOT.
<?br?>
<literal>~ inet '192.168.1.6'</literal>
<returnvalue>63.87.254.249</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<type>inet</type> <literal>&</literal> <type>inet</type>
<returnvalue>inet</returnvalue>
<?br?>
Computes bitwise AND.
<?br?>
<literal>inet '192.168.1.6' & inet '0.0.0.255'</literal>
<returnvalue>0.0.0.6</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<type>inet</type> <literal>|</literal> <type>inet</type>
<returnvalue>inet</returnvalue>
<?br?>
Computes bitwise OR.
<?br?>
<literal>inet '192.168.1.6' | inet '0.0.0.255'</literal>
<returnvalue>192.168.1.255</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<type>inet</type> <literal>+</literal> <type>bigint</type>
<returnvalue>inet</returnvalue>
<?br?>
Adds an offset to an address.
<?br?>
<literal>inet '192.168.1.6' + 25</literal>
<returnvalue>192.168.1.31</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<type>bigint</type> <literal>+</literal> <type>inet</type>
<returnvalue>inet</returnvalue>
<?br?>
Adds an offset to an address.
<?br?>
<literal>200 + inet '::ffff:fff0:1'</literal>
<returnvalue>::ffff:255.240.0.201</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<type>inet</type> <literal>-</literal> <type>bigint</type>
<returnvalue>inet</returnvalue>
<?br?>
Subtracts an offset from an address.
<?br?>
<literal>inet '192.168.1.43' - 36</literal>
<returnvalue>192.168.1.7</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<type>inet</type> <literal>-</literal> <type>inet</type>
<returnvalue>bigint</returnvalue>
<?br?>
Computes the difference of two addresses.
<?br?>
<literal>inet '192.168.1.43' - inet '192.168.1.19'</literal>
<returnvalue>24</returnvalue>
<?br?>
<literal>inet '::1' - inet '::ffff:1'</literal>
<returnvalue>-4294901760</returnvalue>
</entry>
</row>
</tbody>
</tgroup>
</table>
<table id="cidr-inet-functions-table">
<title>IP Address Functions</title>
<tgroup cols="1">
<thead>
<row>
<entry role="functableentry">
Function<?br?>Description<?br?>Example(s)
</entry>
</row>
</thead>
<tbody>
<row>
<entry role="functableentry">
<indexterm>
<primary>abbrev</primary>
</indexterm>
<function>abbrev</function> ( <type>inet</type> )
<returnvalue>text</returnvalue>
<?br?>
Creates an abbreviated display format as text.
(The result is the same as the <type>inet</type> output function
produces; it is <quote>abbreviated</quote> only in comparison to the
result of an explicit cast to <type>text</type>, which for historical
reasons will never suppress the netmask part.)
<?br?>
<literal>abbrev(inet '10.1.0.0/32')</literal>
<returnvalue>10.1.0.0</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<function>abbrev</function> ( <type>cidr</type> )
<returnvalue>text</returnvalue>
<?br?>
Creates an abbreviated display format as text.
(The abbreviation consists of dropping all-zero octets to the right
of the netmask; more examples are in
<xref linkend="datatype-net-cidr-table"/>.)
<?br?>
<literal>abbrev(cidr '10.1.0.0/16')</literal>
<returnvalue>10.1/16</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<indexterm>
<primary>broadcast</primary>
</indexterm>
<function>broadcast</function> ( <type>inet</type> )
<returnvalue>inet</returnvalue>
<?br?>
Computes the broadcast address for the address's network.
<?br?>
<literal>broadcast(inet '192.168.1.5/24')</literal>
<returnvalue>192.168.1.255/24</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<indexterm>
<primary>family</primary>
</indexterm>
<function>family</function> ( <type>inet</type> )
<returnvalue>integer</returnvalue>
<?br?>
Returns the address's family: <literal>4</literal> for IPv4,
<literal>6</literal> for IPv6.
<?br?>
<literal>family(inet '::1')</literal>
<returnvalue>6</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<indexterm>
<primary>host</primary>
</indexterm>
<function>host</function> ( <type>inet</type> )
<returnvalue>text</returnvalue>
<?br?>
Returns the IP address as text, ignoring the netmask.
<?br?>
<literal>host(inet '192.168.1.0/24')</literal>
<returnvalue>192.168.1.0</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<indexterm>
<primary>hostmask</primary>
</indexterm>
<function>hostmask</function> ( <type>inet</type> )
<returnvalue>inet</returnvalue>
<?br?>
Computes the host mask for the address's network.
<?br?>
<literal>hostmask(inet '192.168.23.20/30')</literal>
<returnvalue>0.0.0.3</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<indexterm>
<primary>inet_merge</primary>
</indexterm>
<function>inet_merge</function> ( <type>inet</type>, <type>inet</type> )
<returnvalue>cidr</returnvalue>
<?br?>
Computes the smallest network that includes both of the given networks.
<?br?>
<literal>inet_merge(inet '192.168.1.5/24', inet '192.168.2.5/24')</literal>
<returnvalue>192.168.0.0/22</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<indexterm>
<primary>inet_same_family</primary>
</indexterm>
<function>inet_same_family</function> ( <type>inet</type>, <type>inet</type> )
<returnvalue>boolean</returnvalue>
<?br?>
Tests whether the addresses belong to the same IP family.
<?br?>
<literal>inet_same_family(inet '192.168.1.5/24', inet '::1')</literal>
<returnvalue>f</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<indexterm>
<primary>masklen</primary>
</indexterm>
<function>masklen</function> ( <type>inet</type> )
<returnvalue>integer</returnvalue>
<?br?>
Returns the netmask length in bits.
<?br?>
<literal>masklen(inet '192.168.1.5/24')</literal>
<returnvalue>24</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<indexterm>
<primary>netmask</primary>
</indexterm>
<function>netmask</function> ( <type>inet</type> )
<returnvalue>inet</returnvalue>
<?br?>
Computes the network mask for the address's network.
<?br?>
<literal>netmask(inet '192.168.1.5/24')</literal>
<returnvalue>255.255.255.0</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<indexterm>
<primary>network</primary>
</indexterm>
<function>network</function> ( <type>inet</type> )
<returnvalue>cidr</returnvalue>
<?br?>
Returns the network part of the address, zeroing out
whatever is to the right of the netmask.
(This is equivalent to casting the value to <type>cidr</type>.)
<?br?>
<literal>network(inet '192.168.1.5/24')</literal>
<returnvalue>192.168.1.0/24</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<indexterm>
<primary>set_masklen</primary>
</indexterm>
<function>set_masklen</function> ( <type>inet</type>, <type>integer</type> )
<returnvalue>inet</returnvalue>
<?br?>
Sets the netmask length for an <type>inet</type> value.
The address part does not change.
<?br?>
<literal>set_masklen(inet '192.168.1.5/24', 16)</literal>
<returnvalue>192.168.1.5/16</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<function>set_masklen</function> ( <type>cidr</type>, <type>integer</type> )
<returnvalue>cidr</returnvalue>
<?br?>
Sets the netmask length for a <type>cidr</type> value.
Address bits to the right of the new netmask are set to zero.
<?br?>
<literal>set_masklen(cidr '192.168.1.0/24', 16)</literal>
<returnvalue>192.168.0.0/16</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<indexterm>
<primary>text</primary>
</indexterm>
<function>text</function> ( <type>inet</type> )
<returnvalue>text</returnvalue>
<?br?>
Returns the unabbreviated IP address and netmask length as text.
(This has the same result as an explicit cast to <type>text</type>.)
<?br?>
<literal>text(inet '192.168.1.5')</literal>
<returnvalue>192.168.1.5/32</returnvalue>
</entry>
</row>
</tbody>
</tgroup>
</table>
<tip>
<para>
The <type>macaddr</type> type also supports the standard relational
operators (<literal>></literal>, <literal><=</literal>, etc.) for
lexicographical ordering, and the bitwise arithmetic operators
(<literal>~</literal>, <literal>&</literal> and <literal>|</literal>)
for NOT, AND and OR.
The <function>abbrev</function>, <function>host</function>,
and <function>text</function> functions are primarily intended to offer
alternative display formats for IP addresses.
</para>
</tip>
<para>
<xref linkend="macaddr8-functions-table"/> shows the functions
available for use with the <type>macaddr8</type> type. The function
<literal><function>trunc(<type>macaddr8</type>)</function></literal> returns a MAC
address with the last 5 bytes set to zero. This can be used to
associate the remaining prefix with a manufacturer.
<para>
The MAC address types, <type>macaddr</type> and <type>macaddr8</type>,
support the usual comparison operators shown in
<xref linkend="functions-comparison-op-table"/>
as well as the specialized functions shown in
<xref linkend="macaddr-functions-table"/>.
In addition, they support the bitwise logical operators
<literal>~</literal>, <literal>&</literal> and <literal>|</literal>
(NOT, AND and OR), just as shown above for IP addresses.
</para>
<table id="macaddr8-functions-table">
<title><type>macaddr8</type> Functions</title>
<tgroup cols="5">
<thead>
<row>
<entry>Function</entry>
<entry>Return Type</entry>
<entry>Description</entry>
<entry>Example</entry>
<entry>Result</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<indexterm>
<primary>trunc</primary>
</indexterm>
<literal><function>trunc(<type>macaddr8</type>)</function></literal>
</entry>
<entry><type>macaddr8</type></entry>
<entry>set last 5 bytes to zero</entry>
<entry><literal>trunc(macaddr8 '12:34:56:78:90:ab:cd:ef')</literal></entry>
<entry><literal>12:34:56:00:00:00:00:00</literal></entry>
</row>
<row>
<entry>
<indexterm>
<primary>macaddr8_set7bit</primary>
</indexterm>
<literal><function>macaddr8_set7bit(<type>macaddr8</type>)</function></literal>
</entry>
<entry><type>macaddr8</type></entry>
<entry>set 7th bit to one, also known as modified EUI-64, for inclusion in an IPv6 address</entry>
<entry><literal>macaddr8_set7bit(macaddr8 '00:34:56:ab:cd:ef')</literal></entry>
<entry><literal>02:34:56:ff:fe:ab:cd:ef</literal></entry>
</row>
</tbody>
</tgroup>
</table>
<table id="macaddr-functions-table">
<title>MAC Address Functions</title>
<tgroup cols="1">
<thead>
<row>
<entry role="functableentry">
Function<?br?>Description<?br?>Example(s)
</entry>
</row>
</thead>
<para>
The <type>macaddr8</type> type also supports the standard relational
operators (<literal>></literal>, <literal><=</literal>, etc.) for
ordering, and the bitwise arithmetic operators (<literal>~</literal>,
<literal>&</literal> and <literal>|</literal>) for NOT, AND and OR.
</para>
<tbody>
<row>
<entry role="functableentry">
<indexterm>
<primary>trunc</primary>
</indexterm>
<function>trunc</function> ( <type>macaddr</type> )
<returnvalue>macaddr</returnvalue>
<?br?>
Sets the last 3 bytes of the address to zero. The remaining prefix
can be associated with a particular manufacturer (using data not
included in <productname>PostgreSQL</productname>).
<?br?>
<literal>trunc(macaddr '12:34:56:78:90:ab')</literal>
<returnvalue>12:34:56:00:00:00</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<function>trunc</function> ( <type>macaddr8</type> )
<returnvalue>macaddr8</returnvalue>
<?br?>
Sets the last 5 bytes of the address to zero. The remaining prefix
can be associated with a particular manufacturer (using data not
included in <productname>PostgreSQL</productname>).
<?br?>
<literal>trunc(macaddr8 '12:34:56:78:90:ab:cd:ef')</literal>
<returnvalue>12:34:56:00:00:00:00:00</returnvalue>
</entry>
</row>
<row>
<entry role="functableentry">
<indexterm>
<primary>macaddr8_set7bit</primary>
</indexterm>
<function>macaddr8_set7bit</function> ( <type>macaddr8</type> )
<returnvalue>macaddr8</returnvalue>
<?br?>
Sets the 7th bit of the address to one, creating what is known as
modified EUI-64, for inclusion in an IPv6 address.
<?br?>
<literal>macaddr8_set7bit(macaddr8 '00:34:56:ab:cd:ef')</literal>
<returnvalue>02:34:56:ff:fe:ab:cd:ef</returnvalue>
</entry>
</row>
</tbody>
</tgroup>
</table>
</sect1>