Categorias:

Funções de cadeia de caracteres e binários (General)

PARSE_IP

Retorna um objeto JSON que consiste em todos os componentes de uma cadeia de caracteres válida INET (protocolo de internet) ou CIDR (Roteamento entre domínios sem classes), seja IPv4 ou IPv6.

Sintaxe

PARSE_IP(<expr>, '<type>' [, <permissive>])
Copy

Argumentos

Obrigatório:

expr

Uma expressão de cadeia de caracteres.

type

Uma cadeia de caracteres que identifica o tipo de endereço IP. Oferece suporte a INET ou CIDR; o valor não diferencia letras maiúsculas e minúsculas.

Opcional:

permissive

Sinalizador que determina como os erros de análise são tratados:

  • Se ajustado para 0, os erros parciais fazem com que a função falhe.

  • Se definido como 1, erros de análise resultam em um objeto com o campo error definido para a respectiva mensagem de erro (e nenhum outro campo definido).

O valor padrão é 0.

Retornos

OBJECT.

Notas de uso

  • A função analisa um endereço IP e retorna um objeto JSON.

    Os seguintes elementos são sempre devolvidos:

    family

    Valor numérico. 4 (IPv4) ou 6 (IPv6).

    ip_type

    Valor da cadeia de caracteres. inet ou cidr a partir da entrada.

    host

    Valor da cadeia de caracteres. Endereço do host a partir da expressão de entrada.

    ip_fields

    Conjunto de 4 campos numéricos, cada um com um valor entre 0 e 4,294,967,295 (2^32 - 1), inclusive. Os valores dos bits desta matriz são mapeados para os bits brutos no endereço do host.

    • Endereços IPv4: exibe apenas os 32 bits mais à direita do endereço do host.

    • Endereços IPv6: exibe cada um dos campos de 32 bits que mapeiam para o endereço bruto do host de 128 bits da esquerda para a direita.

    Se uma máscara de sub-rede for inserida, os resultados incluem network_prefix_length, um valor numérico que identifica o comprimento da máscara de sub-rede.

    Os seguintes elementos são devolvidos para os endereços IPv4:

    ipv4

    Endereço IP numérico que corresponde ao primeiro campo em ip_fields.

    ipv4_range_start

    Endereço inicial numérico da rede, exibido quando uma máscara de sub-rede é incluída na entrada.

    ipv4_range_end

    Endereço final numérico da rede, exibido quando uma máscara de sub-rede é incluída na entrada.

    Os seguintes elementos são devolvidos para os endereços IPv6:

    hex_ipv6

    Endereço IP expresso como um valor hexadecimal totalmente preenchido, de tamanho fixo.

    hex_ipv6_range_start

    Endereço inicial hexadecimal da rede totalmente preenchido de tamanho fixo, exibido quando uma máscara de sub-rede é incluída na entrada.

    hex_ipv6_range_end

    Endereço final hexadecimal da rede totalmente preenchido de tamanho fixo, exibido quando uma máscara de sub-rede é incluída na entrada.

    O elemento snowflake$type é reservado para uso interno do Snowflake.

  • Para cálculos de intervalo do endereço IP ou buscas de máscara de sub-rede, consultar diretamente os elementos individuais JSON. Consulte os exemplos abaixo.

  • Ao inserir uma máscara de sub-rede, o Snowflake recomenda armazenar a saída da função em uma coluna VARIANT e consultar os elementos gerados para um melhor desempenho. Consulte os exemplos.

Exemplos

SELECT column1, PARSE_IP(column1, 'INET') FROM VALUES('192.168.242.188/24'), ('192.168.243.189/24');
--------------------+-----------------------------------+
 COLUMN1            | PARSE_IP(COLUMN1, 'INET')         |
--------------------+-----------------------------------|
 192.168.242.188/24 | {                                 |
                    |   "family": 4,                    |
                    |   "host": "192.168.242.188",      |
                    |   "ip_fields": [                  |
                    |     3232297660,                   |
                    |     0,                            |
                    |     0,                            |
                    |     0                             |
                    |   ],                              |
                    |   "ip_type": "inet",              |
                    |   "ipv4": 3232297660,             |
                    |   "ipv4_range_end": 3232297727,   |
                    |   "ipv4_range_start": 3232297472, |
                    |   "netmask_prefix_length": 24,    |
                    |   "snowflake$type": "ip_address"  |
                    | }                                 |
 192.168.243.189/24 | {                                 |
                    |   "family": 4,                    |
                    |   "host": "192.168.243.189",      |
                    |   "ip_fields": [                  |
                    |     3232297917,                   |
                    |     0,                            |
                    |     0,                            |
                    |     0                             |
                    |   ],                              |
                    |   "ip_type": "inet",              |
                    |   "ipv4": 3232297917,             |
                    |   "ipv4_range_end": 3232297983,   |
                    |   "ipv4_range_start": 3232297728, |
                    |   "netmask_prefix_length": 24,    |
                    |   "snowflake$type": "ip_address"  |
                    | }                                 |
--------------------+-----------------------------------+
Copy
SELECT PARSE_IP('fe80::20c:29ff:fe2c:429/64', 'INET');

----------------------------------------------------------------+
  PARSE_IP('FE80::20C:29FF:FE2C:429/64', 'INET')                |
----------------------------------------------------------------|
  {                                                             |
    "family": 6,                                                |
    "hex_ipv6": "FE80000000000000020C29FFFE2C0429",             |
    "hex_ipv6_range_end": "FE80000000000000FFFFFFFFFFFFFFFF",   |
    "hex_ipv6_range_start": "FE800000000000000000000000000000", |
    "host": "fe80::20c:29ff:fe2c:429",                          |
    "ip_fields": [                                              |
      4269801472,                                               |
      0,                                                        |
      34351615,                                                 |
      4264297513                                                |
    ],                                                          |
    "ip_type": "inet",                                          |
    "netmask_prefix_length": 64,                                |
    "snowflake$type": "ip_address"                              |
  }                                                             |
----------------------------------------------------------------+
Copy
WITH
lookup AS (
  SELECT column1 AS tag, PARSE_IP(column2, 'INET') AS obj FROM VALUES('San Francisco', '192.168.242.0/24'), ('New York', '192.168.243.0/24')
),
entries AS (
  SELECT PARSE_IP(column1, 'INET') AS ipv4 FROM VALUES('192.168.242.188/24'), ('192.168.243.189/24')
)
SELECT lookup.tag, entries.ipv4:host, entries.ipv4
FROM lookup, entries
WHERE lookup.tag = 'San Francisco'
AND entries.IPv4:ipv4 BETWEEN lookup.obj:ipv4_range_start AND lookup.obj:ipv4_range_end;

---------------+-------------------+-----------------------------------+
 TAG           | ENTRIES.IPV4:HOST | IPV4                              |
---------------+-------------------+-----------------------------------|
 San Francisco | "192.168.242.188" | {                                 |
               |                   |   "family": 4,                    |
               |                   |   "host": "192.168.242.188",      |
               |                   |   "ip_fields": [                  |
               |                   |     3232297660,                   |
               |                   |     0,                            |
               |                   |     0,                            |
               |                   |     0                             |
               |                   |   ],                              |
               |                   |   "ip_type": "inet",              |
               |                   |   "ipv4": 3232297660,             |
               |                   |   "ipv4_range_end": 3232297727,   |
               |                   |   "ipv4_range_start": 3232297472, |
               |                   |   "netmask_prefix_length": 24,    |
               |                   |   "snowflake$type": "ip_address"  |
               |                   | }                                 |
---------------+-------------------+-----------------------------------+
Copy
CREATE OR REPLACE TABLE ipv6_lookup (tag String, obj VARIANT);

-----------------------------------------+
 status                                  |
-----------------------------------------|
 Table IPV6_LOOKUP successfully created. |
-----------------------------------------+

INSERT INTO ipv6_lookup
    SELECT column1 AS tag, parse_ip(column2, 'INET') AS obj
    FROM VALUES('west', 'fe80:12:20c:29ff::/64'), ('east', 'fe80:12:1:29ff::/64');

-------------------------+
 number of rows inserted |
-------------------------|
                       2 |
-------------------------+

CREATE OR REPLACE TABLE ipv6_entries (obj VARIANT);
------------------------------------------+
 status                                   |
------------------------------------------|
 Table IPV6_ENTRIES successfully created. |
------------------------------------------+

INSERT INTO ipv6_entries
    SELECT parse_ip(column1, 'INET') as obj
    FROM VALUES
        ('fe80:12:20c:29ff:fe2c:430:370:2/64'),
        ('fe80:12:20c:29ff:fe2c:430:370:00F0/64'),
        ('fe80:12:20c:29ff:fe2c:430:370:0F00/64'),
        ('fe80:12:20c:29ff:fe2c:430:370:F000/64'),
        ('fe80:12:20c:29ff:fe2c:430:370:FFFF/64'),
        ('fe80:12:1:29ff:fe2c:430:370:FFFF/64'),
        ('fe80:12:1:29ff:fe2c:430:370:F000/64'),
        ('fe80:12:1:29ff:fe2c:430:370:0F00/64'),
        ('fe80:12:1:29ff:fe2c:430:370:00F0/64'),
        ('fe80:12:1:29ff:fe2c:430:370:2/64');

-------------------------+
 number of rows inserted |
-------------------------|
                      10 |
-------------------------+

SELECT lookup.tag, entries.obj:host
    FROM ipv6_lookup AS lookup, ipv6_entries AS entries
    WHERE lookup.tag = 'east'
    AND entries.obj:hex_ipv6 BETWEEN lookup.obj:hex_ipv6_range_start AND lookup.obj:hex_ipv6_range_end;

------+------------------------------------+
 TAG  | ENTRIES.OBJ:HOST                   |
------+------------------------------------|
 east | "fe80:12:1:29ff:fe2c:430:370:FFFF" |
 east | "fe80:12:1:29ff:fe2c:430:370:F000" |
 east | "fe80:12:1:29ff:fe2c:430:370:0F00" |
 east | "fe80:12:1:29ff:fe2c:430:370:00F0" |
 east | "fe80:12:1:29ff:fe2c:430:370:2"    |
------+------------------------------------+
Copy