このトピックでは、ip4r 拡張の背景、データ型、および使用方法について説明します。
適用性
次のバージョンの PolarDB for PostgreSQL がサポートされています:
PostgreSQL 17 (マイナーエンジンバージョン 2.0.17.6.4.0 以降)
PostgreSQL 16 (マイナーエンジンバージョン 2.0.16.9.9.0 以降)
PostgreSQL 15 (マイナーエンジンバージョン 2.0.15.14.6.0 以降)
PostgreSQL 14 (マイナーエンジンバージョン 2.0.14.9.13.0 以降)
PostgreSQL 11 (マイナーエンジンバージョン 2.0.11.9.36.0 以降)
コンソール で、または SHOW polardb_version; ステートメントを実行して、マイナーエンジンバージョンを確認できます。マイナーエンジンバージョンが要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードしてください。
背景
ip4r は、PolarDB for PostgreSQL および がサポートするサードパーティの拡張です。IPv4 および IPv6 アドレスを格納するためのデータ型を提供します。PostgreSQL に組み込まれている inet と cidr のデータ型とは異なり、ip4r は contains 演算子 >>= を使用したインデックススキャンをサポートします。さらに、ip4r には、PostgreSQL の組み込みネットワークデータ型に比べて次の利点があります:
より明確なセマンティクス:ネットワークブロック と、ネットワークブロック内の特定の IP アドレス を区別します。
オーバーヘッドの低減:PostgreSQL は IPv6 データを格納するために可変長のデータ型を使用します。このため、IPv4 データのみを格納する必要がある場合に大きなオーバーヘッドが発生します。これに対し、
ip4rは単一アドレスには固定長のデータ型を使用します。
データ型
ip4r は、IPv4 または IPv6 データを格納し、表現するためのさまざまなデータ型を提供します:
データ型 | 説明 |
ip4 | 単一の IPv4 アドレス。 |
ip4r | 任意の IPv4 アドレス範囲。 |
ip6 | 単一の IPv6 アドレス。 |
ip6r | 任意の IPv6 アドレス範囲。 |
ipaddress | 単一の IPv4 または IPv6 アドレス。 |
iprange | 任意の IPv4 または IPv6 アドレス範囲。 |
単一アドレスのデータ型と型変換
単一の IP アドレスを格納するには、次の 3 つのデータ型を使用します:
ip4:nnn.nnn.nnn.nnn形式の入力を受け付けます。データは 32 ビットの符号なし整数として格納されます。ip6:IPv6 アドレスの標準 16 進数形式の入力を受け付けます。データは 2 つの 64 ビット値として格納されます。ipaddress:ip4形式またはip6形式の入力を受け付けます。
これら 3 つのデータ型について、ip4r は次の型変換ルールを提供します:
次の表では、ipX は上記で説明した 3 つのデータ型のいずれかを表します。
ソース型 | ターゲット型 | 形式 |
ipX | text | text(ipX) または ipX::text (明示的) |
text | ipX | ipX(text) または text::ipX (明示的) |
ipX | cidr | cidr(ipX) または ipX::cidr (代入) |
inet | ipX | ipX(inet) または inet::ipX (代入) |
ipX | numeric | to_numeric(ipX) または ipX::numeric (明示的) |
numeric | ipX | ipX(numeric) または bigint::ipX (明示的) |
ip4 | bigint | to_bigint(ip4) または ip4::bigint (明示的) |
bigint | ip4 | ip4(bigint) または bigint::ip4 (明示的) |
ip4 | float8 | to_double(ip4) または ip4::float8 (明示的) |
float8 | ip4 | ip4(float8) または float8::ip4 (明示的) |
ipX | varbit | to_bit(ipX) または ipX::varbit (明示的) |
bit(32) | ip4 | ip4(bit) または bit::ip4 (明示的) |
bit(128) | ip6 | ip6(bit) または bit::ip6 (明示的) |
varbit | ipX | ipX(varbit) または varbit::ipX (明示的) |
ipX | bytea | to_bytea(ipX) または ipX::bytea (明示的) |
bytea | ipX | ipX(bytea) または bytea::ipX (明示的) |
ipX | ipXr | ipXr(ipX) または ipX::ipXr (暗黙的) |
ip4 | ipaddress | ipaddress(ip4) または ip4::ipaddress (暗黙的) |
ip6 | ipaddress | ipaddress(ip6) または ip6::ipaddress (暗黙的) |
ipaddress | ip4 | ip4(ipaddress) または ipaddress::ip4 (代入) |
ipaddress | ip6 | ip6(ipaddress) または ipaddress::ip6 (代入) |
アドレス範囲のデータ型と型変換
IP アドレスの範囲を格納するには、次の 3 つのデータ型を使用します:
ip4r:IPv4 アドレス範囲を格納します。例:192.0.2.100-192.0.2.200。範囲192.0.2.0/24は192.0.2.0-192.0.2.255と同等です。ip6r:IPv6 アドレス範囲を格納します。例:2001::1234-2001::2000:0000。範囲2001::/112は2001::-2001::ffffと同等です。iprange:ip4r形式またはip6r形式の入力を受け付けます。
これら 3 つのデータ型について、ip4r は次の型変換ルールを提供します:
次の表では、ipXr は上記で説明した 3 つのデータ型のいずれかを表します。
ソース型 | ターゲット型 | 形式 |
ipX | ipXr | ipXr(ipX) または ipX::ipXr (暗黙的) |
ipXr | text | text(ipXr) または ipXr::text (明示的) |
text | ipXr | ipXr(text) または text::ipXr (明示的) |
ipXr | cidr | cidr(ipXr) または ipXr::cidr (明示的) |
cidr | ipXr | ipXr(cidr) または cidr::ipXr (代入) |
ipXr | varbit | to_bit(ipXr) または ipXr::varbit (明示的) |
varbit | ip4r | ip4r(varbit) または varbit::ip4r (明示的) |
varbit | ip6r | ip6r(varbit) または varbit::ip6r (明示的) |
使用方法
拡張の作成
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 演算子の使用
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)拡張のアンインストール
DROP EXTENSION ip4r;