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

Типы cidr и inet, предназначенные для сетевых IP-адресов, поддерживают обычные операторы сравнения, показанные в Таблице 9.1, а также специализированные операторы и функции, показанные в Таблице 9.39 и Таблице 9.40.

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

Таблица 9.39. Операторы для работы с IP-адресами

Оператор

Описание

Пример(ы)

inet << inetboolean

Первая подсеть содержится во второй и не равна ей? Этот оператор и следующие четыре проверяют вхождение одной сети в другую или их равенство, при этом рассматривая в адресах только компонент сети (биты справа от сетевой маски игнорируются).

inet '192.168.1.5' << inet '192.168.1/24't

inet '192.168.0.5' << inet '192.168.1/24'f

inet '192.168.1/24' << inet '192.168.1/24'f

inet <<= inetboolean

Первая подсеть содержится во второй или равна ей?

inet '192.168.1/24' <<= inet '192.168.1/24't

inet >> inetboolean

Первая подсеть содержит вторую подсеть и не равна ей?

inet '192.168.1/24' >> inet '192.168.1.5't

inet >>= inetboolean

Первая подсеть содержит вторую подсеть или равна ей?

inet '192.168.1/24' >>= inet '192.168.1/24't

inet && inetboolean

Одна из двух подсетей содержит другую или равна ей?

inet '192.168.1/24' && inet '192.168.1.80/28't

inet '192.168.1/24' && inet '192.168.2.0/28'f

~ inetinet

Вычисляет результат побитового НЕ.

~ inet '192.168.1.6'63.87.254.249

inet & inetinet

Вычисляет результат побитового И.

inet '192.168.1.6' & inet '0.0.0.255'0.0.0.6

inet | inetinet

Вычисляет результат побитового ИЛИ.

inet '192.168.1.6' | inet '0.0.0.255'192.168.1.255

inet + bigintinet

Добавляет смещение к адресу.

inet '192.168.1.6' + 25192.168.1.31

bigint + inetinet

Добавляет смещение к адресу.

200 + inet '::ffff:fff0:1'::ffff:255.240.0.201

inet - bigintinet

Вычитает смещение из адреса.

inet '192.168.1.43' - 36192.168.1.7

inet - inetbigint

Вычисляет разность двух адресов.

inet '192.168.1.43' - inet '192.168.1.19'24

inet '::1' - inet '::ffff:1'-4294901760


Таблица 9.40. Функции для работы с IP-адресами

Функция

Описание

Пример(ы)

abbrev ( inet ) → text

Выводит адрес в сокращённом текстовом виде. (Результат не отличается от того, что даёт функция вывода inet; «сокращённым» он является только в сравнении с явным приведением к типу text, которое по историческим причинам не убирает компонент маски сети).

abbrev(inet '10.1.0.0/32')10.1.0.0

abbrev ( cidr ) → text

Выводит адрес в сокращённом текстовом виде. (Сокращение заключается в отбрасывании полностью нулевых октетов в конце сетевой маски; другие примеры приведены в Таблице 8.22.)

abbrev(cidr '10.1.0.0/16')10.1/16

broadcast ( inet ) → inet

Вычисляет широковещательный адрес для сети.

broadcast(inet '192.168.1.5/24')192.168.1.255/​24

family ( inet ) → integer

Выдаёт семейство адреса: 4 для адресов IPv4, 6 для адресов IPv6.

family(inet '::1')6

host ( inet ) → text

Выдаёт IP-адрес в текстовом виде, опуская маску сети.

host(inet '192.168.1.0/24')192.168.1.0

hostmask ( inet ) → inet

Вычисляет маску узла для сети в заданном адресе.

hostmask(inet '192.168.23.20/30')0.0.0.3

inet_merge ( inet, inet ) → cidr

Вычисляет наименьшую сеть, содержащую обе заданные сети.

inet_merge(inet '192.168.1.5/24', inet '192.168.2.5/24')192.168.0.0/22

inet_same_family ( inet, inet ) → boolean

Проверяет, относятся ли адреса к одному семейству IP?

inet_same_family(inet '192.168.1.5/24', inet '::1')f

masklen ( inet ) → integer

Выдаёт длину маски сети в битах.

masklen(inet '192.168.1.5/24')24

netmask ( inet ) → inet

Вычисляет маску сети для заданного адреса.

netmask(inet '192.168.1.5/24')255.255.255.0

network ( inet ) → cidr

Выдаёт компонент сети для заданного адреса, обнуляя все биты справа от маски сети. (Это равнозначно приведению значения к типу cidr.)

network(inet '192.168.1.5/24')192.168.1.0/24

set_masklen ( inet, integer ) → inet

Задаёт размер маски сети для значения inet. Компонент адреса при этом не меняется.

set_masklen(inet '192.168.1.5/24', 16)192.168.1.5/16

set_masklen ( cidr, integer ) → cidr

Задаёт размер маски сети для значения cidr. Биты адреса справа от новой маски при этом обнуляются.

set_masklen(cidr '192.168.1.0/24', 16)192.168.0.0/16

text ( inet ) → text

Выдаёт несокращённый IP-адрес и размер маски в виде текста. (Такой же результат получается при явном приведении к типу text.)

text(inet '192.168.1.5')192.168.1.5/32


Подсказка

Функции abbrev, host и text предназначены в основном для вывода IP-адресов в альтернативных текстовых форматах.

Типы MAC-адресов macaddr и macaddr8 поддерживают обычные операторы сравнения, показанные в Таблице 9.1, a также специализированные функции, показанные в Таблице 9.41. Кроме того, они поддерживают битовые логические операторы: ~, & и | (НЕ, И, ИЛИ), показанные выше для IP-адресов.

Таблица 9.41. Функции для работы с MAC-адресами

Функция

Описание

Пример(ы)

trunc ( macaddr ) → macaddr

Обнуляет три последних байта адреса. Оставшийся префикс можно сопоставить с конкретным производителем сетевой карты (в Postgres Pro необходимой для этого информации нет).

trunc(macaddr '12:34:56:​78:90:ab')12:34:56:​00:00:00

trunc ( macaddr8 ) → macaddr8

Обнуляет 5 последних байт адреса. Оставшийся префикс можно сопоставить с конкретным производителем сетевой карты (в Postgres Pro необходимой для этого информации нет).

trunc(macaddr8 '12:34:56:78:90:ab:cd:ef')12:34:56:00:00:00:00:00

macaddr8_set7bit ( macaddr8 ) → macaddr8

Устанавливает в 7 бите адреса единицу, получая тем самым так называемый модифицированный адрес EUI-64 для включения в адрес IPv6.

macaddr8_set7bit(macaddr8 '00:34:56:ab:cd:ef')02:34:56:ff:fe:ab:cd:ef