- Categorias:
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>])
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
ouCIDR
; 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¶
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) ou6
(IPv6).ip_type
Valor da cadeia de caracteres.
inet
oucidr
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" | | } | --------------------+-----------------------------------+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" | } | ----------------------------------------------------------------+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" | | | } | ---------------+-------------------+-----------------------------------+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" | ------+------------------------------------+