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

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

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

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

Оператор

Описание

Пример(ы)

inet << inet → boolean

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

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 <<= inet → boolean

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

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

inet >> inet → boolean

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

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

inet >>= inet → boolean

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

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

inet && inet → boolean

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

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

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

~ inet → inet

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

~ inet '192.168.1.6' → 63.87.254.249

inet & inet → inet

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

inet '192.168.1.6' & inet '0.0.0.255' → 0.0.0.6

inet | inet → inet

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

inet '192.168.1.6' | inet '0.0.0.255' → 192.168.1.255

inet + bigint → inet

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

inet '192.168.1.6' + 25 → 192.168.1.31

bigint + inet → inet

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

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

inet - bigint → inet

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

inet '192.168.1.43' - 36 → 192.168.1.7

inet - inet → bigint

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

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

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

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

trunc ( macaddr8 ) → macaddr8

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

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