9.12. Функции и операторы для работы с сетевыми адресами

В Таблица 9.34 показаны операторы, работающие с типами cidr и inet. Операторы <<, <<=, >>, >>= и && проверяют включения подсетей, рассматривая только биты сети в обоих адресах (игнорируя биты узлов) и определяя, идентична ли одна сеть другой или её подсети.

Таблица 9.34. Операторы для типов cidr и inet

ОператорОписаниеПример
<меньшеinet '192.168.1.5' < inet '192.168.1.6'
<=меньше или равноinet '192.168.1.5' <= inet '192.168.1.5'
=равноinet '192.168.1.5' = inet '192.168.1.5'
>=больше или равноinet '192.168.1.5' >= inet '192.168.1.5'
>большеinet '192.168.1.5' > inet '192.168.1.4'
<>не равноinet '192.168.1.5' <> inet '192.168.1.4'
<<содержится вinet '192.168.1.5' << inet '192.168.1/24'
<<=равно или содержится вinet '192.168.1/24' <<= inet '192.168.1/24'
>>содержитinet '192.168.1/24' >> inet '192.168.1.5'
>>=равно или содержитinet '192.168.1/24' >>= inet '192.168.1/24'
&&содержит или содержится вinet '192.168.1/24' && inet '192.168.1.80/28'
~битовый NOT~ inet '192.168.1.6'
&битовый ANDinet '192.168.1.6' & inet '0.0.0.255'
|битовый ORinet '192.168.1.6' | inet '0.0.0.255'
+сложениеinet '192.168.1.6' + 25
-вычитаниеinet '192.168.1.43' - 36
-вычитаниеinet '192.168.1.43' - inet '192.168.1.19'

В Таблице 9.35 перечислены функции, работающие с типами cidr и inet. Функции abbrev, host и text предназначены в основном для вывода данных в альтернативных форматах.

Таблица 9.35. Функции для типов cidr и inet

ФункцияТип результатаОписаниеПримерРезультат
abbrev(inet)textвывод адрес в кратком текстовом видеabbrev(inet '10.1.0.0/16')10.1.0.0/16
abbrev(cidr)textвывод адрес в кратком текстовом видеabbrev(cidr '10.1.0.0/16')10.1/16
broadcast(inet)inetшироковещательный адрес сетиbroadcast('192.168.1.5/​24')192.168.1.255/​24
family(inet)intвозвращает семейство адреса; 4 для адреса IPv4, 6 для IPv6family('::1')6
host(inet)textизвлекает IP-адрес в виде текстаhost('192.168.1.5/​24')192.168.1.5
hostmask(inet)inetвычисляет маску узла для сетевого адресаhostmask('192.168.23.20/​30')0.0.0.3
masklen(inet)intвыдаёт длину маски сетиmasklen('192.168.1.5/​24')24
netmask(inet)inetвычисляет маску сети для сетевого адресаnetmask('192.168.1.5/​24')255.255.255.0
network(inet)cidrизвлекает компонент сети из адресаnetwork('192.168.1.5/​24')192.168.1.0/24
set_masklen(inet, int)inetзадаёт размер маски для значения inetset_masklen('192.168.1.5/​24', 16)192.168.1.5/16
set_masklen(cidr, int)cidrзадаёт размер маски для значения cidrset_masklen('192.168.1.0/​24'::cidr, 16)192.168.0.0/16
text(inet)textвыводит в текстовом виде IP-адрес и длину маскиtext(inet '192.168.1.5')192.168.1.5/32
inet_same_family(inet, inet)booleanадреса относятся к одному семейству?inet_same_family('192.168.1.5/24', '::1')false
inet_merge(inet, inet)cidrнаименьшая сеть, включающая обе заданные сетиinet_merge('192.168.1.5/24', '192.168.2.5/24')192.168.0.0/22

Любое значение cidr можно привести к типу inet, явно или нет; поэтому все функции, показанные выше с типом inet, также будут работать со значениями cidr. (Некоторые из функций указаны отдельно для типов inet и cidr, потому что их поведение с разными типами различается.) Кроме того, значение inet тоже можно привести к типу cidr. При этом все биты справа от сетевой маски просто обнуляются, чтобы значение стало допустимым для типа cidr. К типам inet и cidr можно привести и обычные текстовые значения, используя обычный синтаксис, например: inet(выражение) или столбец::cidr.

В Таблице 9.36 приведена функция, предназначенная для работы с типом macaddr. Функция trunc(macaddr) возвращает MAC-адрес, последние 3 байта в котором равны 0. Это может быть полезно для вычисления префикса, определяющего производителя.

Таблица 9.36. Функции macaddr

ФункцияТип результатаОписаниеПримерРезультат
trunc(macaddr)macaddrобнуляет последние 3 байтаtrunc(macaddr '12:34:56:​78:90:ab')12:34:56:​00:00:00

Тип macaddr также поддерживает стандартные реляционные операторы лексической сортировки (>, <= и т. д.) и операторы битовой арифметики (~, & и |), соответствующие операциям NOT, AND и OR.

9.12. Network Address Functions and Operators

Table 9.34 shows the operators available for the cidr and inet types. The operators <<, <<=, >>, >>=, and && 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.

Table 9.34. cidr and inet Operators

OperatorDescriptionExample
<is less thaninet '192.168.1.5' < inet '192.168.1.6'
<=is less than or equalinet '192.168.1.5' <= inet '192.168.1.5'
=equalsinet '192.168.1.5' = inet '192.168.1.5'
>=is greater or equalinet '192.168.1.5' >= inet '192.168.1.5'
>is greater thaninet '192.168.1.5' > inet '192.168.1.4'
<>is not equalinet '192.168.1.5' <> inet '192.168.1.4'
<<is contained byinet '192.168.1.5' << inet '192.168.1/24'
<<=is contained by or equalsinet '192.168.1/24' <<= inet '192.168.1/24'
>>containsinet '192.168.1/24' >> inet '192.168.1.5'
>>=contains or equalsinet '192.168.1/24' >>= inet '192.168.1/24'
&&contains or is contained byinet '192.168.1/24' && inet '192.168.1.80/28'
~bitwise NOT~ inet '192.168.1.6'
&bitwise ANDinet '192.168.1.6' & inet '0.0.0.255'
|bitwise ORinet '192.168.1.6' | inet '0.0.0.255'
+additioninet '192.168.1.6' + 25
-subtractioninet '192.168.1.43' - 36
-subtractioninet '192.168.1.43' - inet '192.168.1.19'

Table 9.35 shows the functions available for use with the cidr and inet types. The abbrev, host, and text functions are primarily intended to offer alternative display formats.

Table 9.35. cidr and inet Functions

FunctionReturn TypeDescriptionExampleResult
abbrev(inet)textabbreviated display format as textabbrev(inet '10.1.0.0/16')10.1.0.0/16
abbrev(cidr)textabbreviated display format as textabbrev(cidr '10.1.0.0/16')10.1/16
broadcast(inet)inetbroadcast address for networkbroadcast('192.168.1.5/24')192.168.1.255/24
family(inet)intextract family of address; 4 for IPv4, 6 for IPv6family('::1')6
host(inet)textextract IP address as texthost('192.168.1.5/24')192.168.1.5
hostmask(inet)inetconstruct host mask for networkhostmask('192.168.23.20/30')0.0.0.3
masklen(inet)intextract netmask lengthmasklen('192.168.1.5/24')24
netmask(inet)inetconstruct netmask for networknetmask('192.168.1.5/24')255.255.255.0
network(inet)cidrextract network part of addressnetwork('192.168.1.5/24')192.168.1.0/24
set_masklen(inet, int)inetset netmask length for inet valueset_masklen('192.168.1.5/24', 16)192.168.1.5/16
set_masklen(cidr, int)cidrset netmask length for cidr valueset_masklen('192.168.1.0/24'::cidr, 16)192.168.0.0/16
text(inet)textextract IP address and netmask length as texttext(inet '192.168.1.5')192.168.1.5/32
inet_same_family(inet, inet)booleanare the addresses from the same family?inet_same_family('192.168.1.5/24', '::1')false
inet_merge(inet, inet)cidrthe smallest network which includes both of the given networksinet_merge('192.168.1.5/24', '192.168.2.5/24')192.168.0.0/22

Any cidr value can be cast to inet implicitly or explicitly; therefore, the functions shown above as operating on inet also work on cidr values. (Where there are separate functions for inet and cidr, it is because the behavior should be different for the two cases.) Also, it is permitted to cast an inet value to cidr. When this is done, any bits to the right of the netmask are silently zeroed to create a valid cidr value. In addition, you can cast a text value to inet or cidr using normal casting syntax: for example, inet(expression) or colname::cidr.

Table 9.36 shows the functions available for use with the macaddr type. The function trunc(macaddr) returns a MAC address with the last 3 bytes set to zero. This can be used to associate the remaining prefix with a manufacturer.

Table 9.36. macaddr Functions

FunctionReturn TypeDescriptionExampleResult
trunc(macaddr)macaddrset last 3 bytes to zerotrunc(macaddr '12:34:56:78:90:ab')12:34:56:00:00:00

The macaddr type also supports the standard relational operators (>, <=, etc.) for lexicographical ordering, and the bitwise arithmetic operators (~, & and |) for NOT, AND and OR.