この Topic では、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 アドレス範囲。 |
単一アドレスデータ型と型変換
次の 3 つのデータの型は、単一の IP アドレスを格納するために使用されます。
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 (割り当て) |
アドレス範囲データ型と型変換
以下の 3 つのデータ型は、IP アドレスの範囲を格納するために使用されます:
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;