- 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:
exprUma expressão de cadeia de caracteres.
typeUma cadeia de caracteres que identifica o tipo de endereço IP. É compatível com
INETouCIDR; o valor não diferencia maiúsculas de minúsculas.
Opcional:
permissiveSinalizador 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
errordefinido 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:
familyValor numérico.
4(IPv4) ou6(IPv6).ip_typeValor da cadeia de caracteres.
inetoucidra partir da entrada.hostValor da cadeia de caracteres. Endereço do host a partir da expressão de entrada.
ip_fieldsConjunto 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:
ipv4Endereço IP numérico que corresponde ao primeiro campo em
ip_fields.ipv4_range_startEndereço inicial numérico da rede, exibido quando uma máscara de sub-rede é incluída na entrada.
ipv4_range_endEndereç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_ipv6Endereço IP expresso como um valor hexadecimal totalmente preenchido, de tamanho fixo.
hex_ipv6_range_startEndereç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_endEndereç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" | ------+------------------------------------+