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
|