Todos os produtos
Search
Central de documentação

PolarDB:ip4r (armazenamento de endereços de rede)

Última atualização: Jun 28, 2026

A extensão ip4r adiciona tipos de dados dedicados para armazenar endereços IPv4 e IPv6, além de faixas de endereços, no PolarDB for PostgreSQL (Compatible with Oracle). Sua principal vantagem sobre os tipos nativos inet e cidr do PostgreSQL é o suporte a índices GiST para o operador de contenção (>>=). Esse recurso permite buscar com eficiência todas as faixas de IP que contêm um determinado endereço — um padrão de consulta que os tipos nativos não conseguem indexar.

Versões suportadas

As seguintes versões do PolarDB for PostgreSQL (Compatible with Oracle) suportam a extensão ip4r:

  • Compatibilidade com sintaxe Oracle 2.0: versão secundária do mecanismo 2.0.14.9.13.0 ou posterior

  • Compatibilidade com sintaxe Oracle 1.0: versão secundária do mecanismo 2.0.11.9.36.0 ou posterior

Visualize sua versão secundária do mecanismo no console ou execute SHOW polardb_version; . Caso sua versão não atenda aos requisitos, atualize a versão secundária do mecanismo .

Por que usar o ip4r

Os tipos nativos inet e cidr do PostgreSQL apresentam duas limitações que a extensão ip4r resolve:

  • Ausência de suporte a índice para consultas de contenção: Os tipos nativos não utilizam índices em consultas no formato WHERE column >>= $1 (localizar todas as faixas que contêm um determinado IP). O ip4r suporta varreduras de índice GiST para esse operador, tornando viáveis as consultas de contenção em tabelas grandes com faixas de IP.

  • Sobrecarga de armazenamento de comprimento variável para cargas apenas com IPv4: O PostgreSQL utiliza armazenamento de comprimento variável para suportar tanto IPv4 quanto IPv6, o que gera sobrecarga quando você precisa apenas de endereços IPv4. A extensão ip4r usa tipos de comprimento fixo para endereços individuais.

O ip4r também estabelece uma distinção semântica mais clara entre um bloco de rede (uma faixa de endereços, como uma sub-rede) e um endereço IP específico dentro desse bloco, reduzindo ambiguidades no design do esquema.

Tipos de dados

A extensão ip4r fornece seis tipos de dados:

Tipo de dado

Descrição

ip4

Um único endereço IPv4

ip4r

Uma faixa arbitrária de endereços IPv4

ip6

Um único endereço IPv6

ip6r

Uma faixa arbitrária de endereços IPv6

ipaddress

Um único endereço IPv4 ou IPv6

iprange

Uma faixa arbitrária de endereços IPv4 ou IPv6

Tipos de endereço único

Os três tipos de endereço único armazenam endereços IP em formatos compactos de comprimento fixo:

  • ip4: Entrada no formato nnn.nnn.nnn.nnn, armazenada como um inteiro sem sinal de 32 bits.

  • ip6: Entrada como um endereço IPv6 hexadecimal padrão, armazenada como dois valores de 64 bits.

  • ipaddress: Aceita o formato ip4 ou ip6.

Conversões de tipo para tipos de endereço único

Na tabela a seguir, ipX representa qualquer um dos três tipos de endereço único (ip4, ip6 ou ipaddress).

Tipo de source

Tipo de destino

Formato

ipX

text

text(ipX) ou ipX::text (explícito)

text

ipX

ipX(text) ou text::ipX (explícito)

ipX

cidr

cidr(ipX) ou ipX::cidr (atribuição)

inet

ipX

ipX(inet) ou inet::ipX (atribuição)

ipX

numeric

to_numeric(ipX) ou ipX::numeric (explícito)

numeric

ipX

ipX(numeric) ou bigint::ipX (explícito)

ip4

bigint

to_bigint(ip4) ou ip4::bigint (explícito)

bigint

ip4

ip4(bigint) ou bigint::ip4 (explícito)

ip4

float8

to_double(ip4) ou ip4::float8 (explícito)

float8

ip4

ip4(float8) ou float8::ip4 (explícito)

ipX

varbit

to_bit(ipX) ou ipX::varbit (explícito)

bit(32)

ip4

ip4(bit) ou bit::ip4 (explícito)

bit(128)

ip6

ip6(bit) ou bit::ip6 (explícito)

varbit

ipX

ipX(varbit) ou varbit::ipX (explícito)

ipX

bytea

to_bytea(ipX) ou ipX::bytea (explícito)

bytea

ipX

ipX(bytea) ou bytea::ipX (explícito)

ipX

ipXr

ipXr(ipX) ou ipX::ipXr (implícito)

ip4

ipaddress

ipaddress(ip4) ou ip4::ipaddress (implícito)

ip6

ipaddress

ipaddress(ip6) ou ip6::ipaddress (implícito)

ipaddress

ip4

ip4(ipaddress) ou ipaddress::ip4 (atribuição)

ipaddress

ip6

ip6(ipaddress) ou ipaddress::ip6 (atribuição)

Tipos de faixa de endereços

Os três tipos de faixa de endereços armazenam intervalos de endereços IP:

  • ip4r: Faixa de endereços IPv4. Por exemplo, 192.0.2.100-192.0.2.200. A notação CIDR também é aceita: 192.0.2.0/24 equivale a 192.0.2.0-192.0.2.255.

  • ip6r: Faixa de endereços IPv6. Por exemplo, 2001::1234-2001::2000:0000. A notação CIDR também é aceita: 2001::/112 equivale a 2001::-2001::ffff.

  • iprange: Aceita o formato ip4r ou ip6r.

Conversões de tipo para tipos de faixa de endereços

Na tabela a seguir, ipXr representa qualquer um dos três tipos de faixa de endereços (ip4r, ip6r ou iprange).

Tipo de source

Tipo de destino

Formato

ipX

ipXr

ipXr(ipX) ou ipX::ipXr (implícito)

ipXr

text

text(ipXr) ou ipXr::text (explícito)

text

ipXr

ipXr(text) ou text::ipXr (explícito)

ipXr

cidr

cidr(ipXr) ou ipXr::cidr (explícito)

cidr

ipXr

ipXr(cidr) ou cidr::ipXr (atribuição)

ipXr

varbit

to_bit(ipXr) ou ipXr::varbit (explícito)

varbit

ip4r

ip4r(varbit) ou varbit::ip4r (explícito)

varbit

ip6r

ip6r(varbit) ou varbit::ip6r (explícito)

Uso

Crie a extensão

CREATE EXTENSION ip4r;

Crie uma tabela de teste e importe dados

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;

Crie um índice GiST

CREATE INDEX ipranges_r ON ipranges USING gist (r);

Verifique o uso do índice GiST

Para confirme se uma consulta de contenção utiliza o índice GiST, execute EXPLAIN:

EXPLAIN (COSTS OFF) SELECT * FROM ipranges WHERE r >>= '5555::' ORDER BY r;

O plano de consulta exibe uma varredura de índice Bitmap no índice GiST:

                     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)

Desinstalar a extensão

DROP EXTENSION ip4r;