このトピックでは、ip4r
拡張機能の背景情報、データ型、および使用方法について説明します。
前提条件
この拡張機能は、次のエンジンを実行するPolarDB for PostgreSQL (Compatible with Oracle) クラスターでサポートされています。
PolarDB for PostgreSQL (Oracle互換) 2.0 (バージョン2.0.14.13.0以降)
PolarDB for PostgreSQL (Oracle互換) 1.0 (バージョン1.1.36以降)
次のステートメントを実行して、PolarDB for PostgreSQL (Compatible with Oracle) クラスターのリビジョンバージョンを表示できます。
SHOW polar_version;
概要
ip4r
は、 PolarDB for PostgreSQL (Oracle互換) でサポートされているサードパーティの拡張機能です。 IPv4またはIPv6アドレスを格納するデータ型を提供します。 PostgreSQLによって提供されるinet
/cidr
データ型とは異なり、ip4r
拡張機能は、クエリが >>=
(contains or equals) 演算子を使用する場合にインデックススキャンをサポートします。 さらに、ip4r
拡張機能には、組み込みのネットワークアドレスタイプのPostgreSQLよりも次の利点があります。
セマンティックオーバーロードが少ない: ネットブロックと特定のIPアドレスを処理するための特殊なデータ型を提供します。
オーバーヘッドの削減: PostgreSQLは可変長のデータ型を使用して、IPv6アドレスとIPv4アドレスの両方を格納します。 これにより、IPv4アドレスのみを含むユースケースでは、大きなオーバーヘッドが発生します。
ip4r
拡張機能は、IPv4またはIPv6アドレスに合わせた固定長データ型を提供します。
データ型
ip4r
は、IPv4およびIPv6アドレスを格納および表すための幅広いデータ型を提供します。
データ型 | 説明 |
データ型 | 説明 |
ip4 | 単一のIPv4アドレス |
ip4r | IPv4ネットブロック |
ip6 | 単一のIPv6アドレス |
ip6r | IPv6ネットブロック |
ipaddress | 単一のIPv4またはIPv6アドレス |
iprange | IPv4またはIPv6ネットブロック |
単一IPアドレスのデータ型と型変換
単一のIPアドレスを格納するには、次の3つのデータ型が使用されます。
ip4
:nnn.nnn.nnn.nnn
の形式で入力を受け付けます。 IPアドレスを32ビットの符号なし整数として格納します。ip6
: IPv6アドレスの標準16進表現の形式で入力を受け付けます。 IPアドレスを2つの64ビット値として格納します。ipaddress
:ip4
またはip6
のいずれかで有効な入力を受け入れます。
次の表に、ip4r
の上記3つの型の型変換を示します。
表のipX
は、前述の3つのデータ型のいずれかを表します。
ソースタイプ | 宛先タイプ | 構文 |
ソースタイプ | 宛先タイプ | 構文 |
ipX | text | テキスト (ipX) またはipX::text (explicit) |
text | ipX | ipX (テキスト) またはtext::ipX (明示的) |
ipX | cidr | cidr(ipX) またはipX::cidr (割り当て) |
inet | ipX | ipX(inet) またはinet::ipX (assignment) |
ipX | numeric | to_numeric(ipX) またはipX::numeric (explicit) |
numeric | ipX | ipX (数値) またはbigint::ipX (明示的) |
ip4 | bigint | to_bigint(ip4) またはip4::bigint (explicit) |
bigint | ip4 | ip4(bigint) またはbigint::ip4 (explicit) |
ip4 | float8 | to_double(ip4) またはip4::float8 (explicit) |
float8 | ip4 | ip4(float8) またはfloat8::ip4 (explicit) |
ipX | varbit | to_bit(ipX) またはipX::varbit (explicit) |
ビット (32) | ip4 | ip4 (ビット) またはビット::ip4 (明示的) |
bit(128) | ip6 | ip6 (ビット) またはビット::ip6 (明示的) |
varbit | ipX | ipX(varbit) またはvarbit::ipX (explicit) |
ipX | bytea | to_bytea(ipX) またはipX::bytea (明示的) |
bytea | ipX | ipX(bytea) またはbytea::ipX (explicit) |
ipX | ipXr | ipXr(ipX) またはipX::ipXr (implicit) |
ip4 | ipaddress | ipaddress(ip4) またはip4::ipaddress (implicit) |
ip6 | ipaddress | ipaddress(ip6) またはip6::ipaddress (implicit) |
ipaddress | ip4 | ip4(ipaddress) またはipaddress::ip4 (割り当て) |
ipaddress | ip6 | ip6(ipaddress) またはipaddress::ip6 (割り当て) |
ネットブロックのデータ型と型変換
ネットブロックの格納には、次の3つのデータ型が使用されます。
ip4r
:192.0.2.100-192.0.2.200
などのIPv4ネットブロックを格納するために使用されます。 また、192.0.2.0/24
などのCIDRブロックの形式で入力を受け付けます。これは192.0.2.0-192.0.2.255
に相当します。ip6r
:2001::1234-2001::2000:0000
などのIPv6ネットブロックを格納するために使用されます。 また、2001::/112
などのCIDRブロックの形式で入力を受け付けます。これは、2001::-2001::ffff
に相当します。iprange
:ip4r
またはip6r
のいずれかで有効な入力を受け入れます。
次の表に、ip4r
の上記3つの型の型変換を示します。
ipXr
は、上記の3つのデータ型のいずれかを表します。
ソースタイプ | 宛先タイプ | 構文 |
ソースタイプ | 宛先タイプ | 構文 |
ipX | ipXr | ipXr(ipX) またはipX::ipXr (implicit) |
ipXr | text | text(ipXr) またはipXr::text (explicit) |
text | ipXr | ipXr (テキスト) またはtext::ipXr (明示的) |
ipXr | cidr | cidr(ipXr) またはipXr::cidr (explicit) |
cidr | ipXr | ipXr(cidr) またはcidr::ipXr (割り当て) |
ipXr | varbit | to_bit(ipXr) またはipXr::varbit (explicit) |
varbit | ip4r | ip4r(varbit) またはvarbit::ip4r (explicit) |
varbit | ip6r | ip6r(varbit) またはvarbit::ip6r (explicit) |
使用法
ip4r拡張子の作成
CREATE EXTENSION ip4r;
テストテーブルの作成とテーブルへのデータのインポート
CREATE TABLE ipranges (r iprange, r4 ip4r, r6 ip6r);
INSERT INTO ipranges
SELECT r, null, r
FROM (
SELECT ip6r(regexp_replace(ls, E'(....(?!$))', E'\\1:', 'g')::ip6,
regexp_replace(substring(ls FOR n + 1) || substring(us FROM n + 2),
E'(....(?!$))', E'\\1:', 'g')::ip6) AS r
FROM (
SELECT md5(i || ' lower 1') AS ls,
md5(i || ' upper 1') AS us,
(i % 11) + (i/11 % 11) + (i/121 % 11) AS n
FROM generate_series(1,13310) i) s1) s2;
GiSTインデックスの作成
CREATE INDEX ipranges_r ON ipranges USING gist (r);
>>= (contains or equals) 演算子を使用する
EXPLAIN (COSTS OFF) SELECT * FROM ipranges WHERE r >>= '5555::' ORDER BY r;
QUERY PLAN
-----------------------------------------------------
Sort
Sort Key: r
-> Bitmap Heap Scan on ipranges
Recheck Cond: (r >>= '5555::'::iprange)
-> Bitmap Index Scan on ipranges_r
Index Cond: (r >>= '5555::'::iprange)
(6 rows)
拡張機能を削除するRemove the extension
DROP EXTENSION ip4r;