標準 SQL のネット関数

NET.IP_FROM_STRING

NET.IP_FROM_STRING(addr_str)
    

説明

IPv4 または IPv6 アドレスをネットワーク バイト順でテキスト形式(STRING)からバイナリ形式(BYTES)に変換します。

この関数は、addr_str で次の形式をサポートします。

この関数は 10.1.2.3/32 のような CIDR 表記をサポートしていません。

この関数は、NULL 入力を受け取ると NULL を返します。入力が無効と判断されると、OUT_OF_RANGE エラーが発生します。

戻りデータの型

BYTES

SELECT
      addr_str, FORMAT("%T", NET.IP_FROM_STRING(addr_str)) AS ip_from_string
    FROM UNNEST([
      '48.49.50.51',
      '::1',
      '3031:3233:3435:3637:3839:4041:4243:4445',
      '::ffff:192.0.2.128'
    ]) AS addr_str;
    
addr_str ip_from_string
48.49.50.51 b"0123"
::1 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"
3031:3233:3435:3637:3839:4041:4243:4445 b"0123456789@ABCDE"
::ffff:192.0.2.128 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc0\x00\x02\x80"

NET.SAFE_IP_FROM_STRING

NET.SAFE_IP_FROM_STRING(addr_str)
    

説明

NET.IP_FROM_STRING に似ていますが、入力が無効の場合にエラーを発生させず、NULL を返します。

戻りデータの型

BYTES

SELECT
      addr_str,
      FORMAT("%T", NET.SAFE_IP_FROM_STRING(addr_str)) AS safe_ip_from_string
    FROM UNNEST([
      '48.49.50.51',
      '::1',
      '3031:3233:3435:3637:3839:4041:4243:4445',
      '::ffff:192.0.2.128',
      '48.49.50.51/32',
      '48.49.50',
      '::wxyz'
    ]) AS addr_str;
    
addr_str safe_ip_from_string
48.49.50.51 b"0123"
::1 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"
3031:3233:3435:3637:3839:4041:4243:4445 b"0123456789@ABCDE"
::ffff:192.0.2.128 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc0\x00\x02\x80"
48.49.50.51/32 NULL
48.49.50 NULL
::wxyz NULL

NET.IP_TO_STRING

NET.IP_TO_STRING(addr_bin)
    

説明 IPv4 または IPv6 アドレスをネットワーク バイト順でバイナリ形式(BYTES)からテキスト形式(STRING)に変換します。

入力が 4 バイトの場合、この関数は IPv4 アドレスを STRING として返します。入力が 16 バイトの場合、IPv6 アドレスを STRING として返します。

この関数は、NULL 入力を受け取ると NULL を返します。入力の長さが 4 または 16 以外の場合、OUT_OF_RANGE エラーが発生します。

戻りデータの型

STRING

SELECT FORMAT("%T", x) AS addr_bin, NET.IP_TO_STRING(x) AS ip_to_string
    FROM UNNEST([
      b"0123",
      b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01",
      b"0123456789@ABCDE",
      b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc0\x00\x02\x80"
    ]) AS x;
    
addr_bin ip_to_string
b"0123" 48.49.50.51
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" ::1
b"0123456789@ABCDE" 3031:3233:3435:3637:3839:4041:4243:4445
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc0\x00\x02\x80" ::ffff:192.0.2.128

NET.IP_NET_MASK

NET.IP_NET_MASK(num_output_bytes, prefix_length)
    

説明

num_output_bytes の長さと等しいバイト シーケンスでネットワーク マスクを返します。最初の prefix_length ビットは 1 に設定され、他のビットは 0 に設定されます。num_output_bytesprefix_length は INT64 です。num_output_bytes が 4(IPv4 の場合)または 16(IPv6 の場合)でない場合、エラーが発生します。prefix_length が負の数または 8 * num_output_bytes よりも大きい場合にもエラーが発生します。

戻りデータの型

BYTES

SELECT x, y, FORMAT("%T", NET.IP_NET_MASK(x, y)) AS ip_net_mask
    FROM UNNEST([
      STRUCT(4 as x, 0 as y),
      (4, 20),
      (4, 32),
      (16, 0),
      (16, 1),
      (16, 128)
    ]);
    
x y ip_net_mask
4 0 b"\x00\x00\x00\x00"
4 20 b"\xff\xff\xf0\x00"
4 32 b"\xff\xff\xff\xff"
16 0 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
16 1 b"\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
16 128 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"

NET.IP_TRUNC

NET.IP_TRUNC(addr_bin, prefix_length)
    

説明: ネットワーク バイト順のバイナリ形式(BYTES)で表した IPv4 または IPv6 アドレスである addr_bin を受け入れ、同じ形式でサブネット アドレスを返します。結果の長さは addr_bin と同じになります。最初の prefix_length ビットは addr_bin と等しくなり、残りのビットは 0 になります。

LENGTH(addr_bin) が 4 でも 16 でもない場合、あるいは prefix_len が負の数であるか LENGTH(addr_bin) * 8 より大きい場合、エラーが発生します。

戻りデータの型

BYTES

SELECT
      FORMAT("%T", x) as addr_bin, prefix_length,
      FORMAT("%T", NET.IP_TRUNC(x, prefix_length)) AS ip_trunc
    FROM UNNEST([
      STRUCT(b"\xAA\xBB\xCC\xDD" as x, 0 as prefix_length),
      (b"\xAA\xBB\xCC\xDD", 11), (b"\xAA\xBB\xCC\xDD", 12),
      (b"\xAA\xBB\xCC\xDD", 24), (b"\xAA\xBB\xCC\xDD", 32),
      (b'0123456789@ABCDE', 80)
    ]);
    
addr_bin prefix_length ip_trunc
b"\xaa\xbb\xcc\xdd" 0 b"\x00\x00\x00\x00"
b"\xaa\xbb\xcc\xdd" 11 b"\xaa\xa0\x00\x00"
b"\xaa\xbb\xcc\xdd" 12 b"\xaa\xb0\x00\x00"
b"\xaa\xbb\xcc\xdd" 24 b"\xaa\xbb\xcc\x00"
b"\xaa\xbb\xcc\xdd" 32 b"\xaa\xbb\xcc\xdd"
b"0123456789@ABCDE" 80 b"0123456789\x00\x00\x00\x00\x00\x00"

NET.IPV4_FROM_INT64

NET.IPV4_FROM_INT64(integer_value)
    

説明

IPv4 アドレスをネットワーク バイト順に整数形式からバイナリ形式(BYTES)に変換します。整数入力では、ホストまたはクライアントのアーキテクチャに関係なく、IP アドレスの最下位ビットが整数の最下位ビットに保存されます。たとえば、10.0.0.1 を意味し、0x1FF0.0.1.255 を意味します。

この関数は、最上位 32 ビットがすべて 0、または最上位 33 ビットがすべて 1 になっているかどうか確認します(32 ビット整数からの符号拡張)。つまり、入力が [-0x80000000, 0xFFFFFFFF] の範囲に入っていない場合にエラーが発生します。

この関数は IPv6 をサポートしていません。

戻りデータの型

BYTES

SELECT x, x_hex, FORMAT("%T", NET.IPV4_FROM_INT64(x)) AS ipv4_from_int64
    FROM (
      SELECT CAST(x_hex AS INT64) x, x_hex
      FROM UNNEST(["0x0", "0xABCDEF", "0xFFFFFFFF", "-0x1", "-0x2"]) AS x_hex
    );
    
x x_hex ipv4_from_int64
0 0x0 b"\x00\x00\x00\x00"
11259375 0xABCDEF b"\x00\xab\xcd\xef"
4294967295 0xFFFFFFFF b"\xff\xff\xff\xff"
-1 -0x1 b"\xff\xff\xff\xff"
-2 -0x2 b"\xff\xff\xff\xfe"

NET.IPV4_TO_INT64

NET.IPV4_TO_INT64(addr_bin)
    

説明

IPv4 アドレスをネットワーク バイト順にバイナリ形式(BYTES)から整数形式に変換します。整数出力では、ホストまたはクライアントのアーキテクチャに関係なく、IP アドレスの最下位ビットが整数の最下位ビットに保存されます。たとえば、10.0.0.1 を意味し、0x1FF0.0.1.255 を意味します。出力は範囲 [0, 0xFFFFFFFF] 内にあります。

入力長が 4 でない場合、エラーが発生します。

この関数は IPv6 をサポートしていません。

戻りデータの型

INT64

SELECT
      FORMAT("%T", x) AS addr_bin,
      FORMAT("0x%X", NET.IPV4_TO_INT64(x)) AS ipv4_to_int64
    FROM
    UNNEST([b"\x00\x00\x00\x00", b"\x00\xab\xcd\xef", b"\xff\xff\xff\xff"]) AS x;
    
addr_bin ipv4_to_int64
b"\x00\x00\x00\x00" 0x0
b"\x00\xab\xcd\xef" 0xABCDEF
b"\xff\xff\xff\xff" 0xFFFFFFFF

NET.HOST

NET.HOST(url)
    

説明

URL を STRING として受け入れ、ホストを STRING として返します。最適な結果を得るには、URL 値が RFC 3986 で定義されている形式に準拠する必要があります。URL 値が RFC 3986 の形式設定に準拠していない場合、この関数は入力をベスト エフォートで解析し、関連する結果を返します。入力を解析できない場合は NULL を返します。

注: この関数は正規化を行いません。

戻りデータの型

STRING

SELECT
      FORMAT("%T", input) AS input,
      description,
      FORMAT("%T", NET.HOST(input)) AS host,
      FORMAT("%T", NET.PUBLIC_SUFFIX(input)) AS suffix,
      FORMAT("%T", NET.REG_DOMAIN(input)) AS domain
    FROM (
      SELECT "" AS input, "invalid input" AS description
      UNION ALL SELECT "http://abc.xyz", "standard URL"
      UNION ALL SELECT "//user:password@a.b:80/path?query",
                       "standard URL with relative scheme, port, path and query, but no public suffix"
      UNION ALL SELECT "https://[::1]:80", "standard URL with IPv6 host"
      UNION ALL SELECT "http://例子.卷筒纸.中国", "standard URL with internationalized domain name"
      UNION ALL SELECT "    www.Example.Co.UK    ",
                       "non-standard URL with spaces, upper case letters, and without scheme"
      UNION ALL SELECT "mailto:?to=&subject=&body=", "URI rather than URL--unsupported"
    );
    
入力 説明 ホスト サフィックス ドメイン
"" 無効な入力 NULL NULL NULL
"http://abc.xyz" 標準の URL "abc.xyz" "xyz" "abc.xyz"
"//user:password@a.b:80/path?query" 相対スキーム、ポート、パス、クエリを含む標準の URL。ただし、パブリック サフィックスはありません。 "a.b" NULL NULL
"https://[::1]:80" IPv6 ホスト付きの標準 URL "[::1]" NULL NULL
"http://例子.卷筒纸.中国" 国際化ドメイン名付きの標準 URL "例子.卷筒纸.中国" "中国" "卷筒纸.中国"
"    www.Example.Co.UK    " スペースと大文字を含み、スキームのない非標準 URL "www.Example.Co.UK" "Co.UK" "Example.Co.UK"
"mailto:?to=&subject=&body=" URL ではなく URI(サポート対象外) "mailto" NULL NULL

NET.PUBLIC_SUFFIX

NET.PUBLIC_SUFFIX(url)
    

説明

URL を STRING として受け入れ、そのパブリック サフィックス(comorgnet など)を STRING として返します。パブリック サフィックスは、publicsuffix.org に登録されている ICANN ドメインです。最適な結果を得るには、URL 値が RFC 3986 で定義されている形式に準拠する必要があります。URL 値が RFC 3986 の形式設定に準拠していない場合、この関数は入力をベスト エフォートで解析し、関連する結果を返します。

次の条件を満たす場合、この関数は NULL を返します。

  • 入力からホストを解析できない。
  • 解析したホストで、先頭または末尾以外の場所でドットが連続している。
  • 解析したホストにパブリック サフィックスが含まれていない。

パブリック サフィックスを検索する前に、この関数はホストを一時的に正規化します。その際、大文字の英字を小文字に変換し、ASCII 以外のすべての文字を Punycode でエンコードします。次に、正規化されたホストではなく、元のホストの一部としてパブリック サフィックスを返します。

注: この関数は Unicode の正規化を行いません。

注: publicsuffix.org のパブリック サフィックス データにはプライベート ドメインも含まれます。この関数はプライベート ドメインを無視します。

注: パブリック サフィックス データは変更される可能性があります。今後、NULL 結果を生成する入力で NULL 以外の値が生成される可能性があります。

戻りデータの型

STRING

SELECT
      FORMAT("%T", input) AS input,
      description,
      FORMAT("%T", NET.HOST(input)) AS host,
      FORMAT("%T", NET.PUBLIC_SUFFIX(input)) AS suffix,
      FORMAT("%T", NET.REG_DOMAIN(input)) AS domain
    FROM (
      SELECT "" AS input, "invalid input" AS description
      UNION ALL SELECT "http://abc.xyz", "standard URL"
      UNION ALL SELECT "//user:password@a.b:80/path?query",
                       "standard URL with relative scheme, port, path and query, but no public suffix"
      UNION ALL SELECT "https://[::1]:80", "standard URL with IPv6 host"
      UNION ALL SELECT "http://例子.卷筒纸.中国", "standard URL with internationalized domain name"
      UNION ALL SELECT "    www.Example.Co.UK    ",
                       "non-standard URL with spaces, upper case letters, and without scheme"
      UNION ALL SELECT "mailto:?to=&subject=&body=", "URI rather than URL--unsupported"
    );
    
入力 説明 ホスト サフィックス ドメイン
"" 無効な入力 NULL NULL NULL
"http://abc.xyz" 標準の URL "abc.xyz" "xyz" "abc.xyz"
"//user:password@a.b:80/path?query" 相対スキーム、ポート、パス、クエリを含む標準の URL。ただし、パブリック サフィックスはありません。 "a.b" NULL NULL
"https://[::1]:80" IPv6 ホスト付きの標準 URL "[::1]" NULL NULL
"http://例子.卷筒纸.中国" 国際化ドメイン名付きの標準 URL "例子.卷筒纸.中国" "中国" "卷筒纸.中国"
"    www.Example.Co.UK    " スペースと大文字を含み、スキームのない非標準 URL "www.Example.Co.UK" "Co.UK" "Example.Co.UK
"mailto:?to=&subject=&body=" URL ではなく URI(サポート対象外) "mailto" NULL NULL

NET.REG_DOMAIN

NET.REG_DOMAIN(url)
    

説明

URL を STRING として受け入れ、登録済みまたは登録可能なドメイン(パブリック サフィックスと 1 つ前のラベル)を STRING として返します。最適な結果を得るには、URL 値が RFC 3986 で定義されている形式に準拠する必要があります。URL 値が RFC 3986 の形式設定に準拠していない場合、この関数は入力をベスト エフォートで解析し、関連する結果を返します。

次の条件を満たす場合、この関数は NULL を返します。

  • 入力からホストを解析できない。
  • 解析したホストで、先頭または末尾以外の場所でドットが連続している。
  • 解析したホストにパブリック サフィックスが含まれていない。
  • 解析したホストにパブリック サフィックスが含まれているが、先頭にラベルがない。

パブリック サフィックスを検索する前に、この関数はホストを一時的に正規化します。その際、大文字の英字を小文字に変換し、ASCII 以外のすべての文字を Punycode でエンコードします。次に、正規化されたホストではなく、元のホストの一部として登録済みまたは登録可能なドメインを返します。

注: この関数は Unicode の正規化を行いません。

注: publicsuffix.org のパブリック サフィックス データにはプライベート ドメインも含まれます。この関数は、プライベート ドメインをパブリック サフィックスとして扱いません。たとえば「us.com」がパブリック サフィックス データ内のプライベート ドメインである場合、NET.REG_DOMAIN(「foo.us.com」)は、「foo.us.com」(プライベート ドメイン「us.com」および先行するラベル「foo」)ではなく、「us.com」(パブリック サフィックス「com」および先行するラベル「us」)を返します。

注: パブリック サフィックス データは変更される可能性があります。今後、NULL 結果を生成する入力で NULL 以外の値が生成される可能性があります。

戻りデータの型

STRING

SELECT
      FORMAT("%T", input) AS input,
      description,
      FORMAT("%T", NET.HOST(input)) AS host,
      FORMAT("%T", NET.PUBLIC_SUFFIX(input)) AS suffix,
      FORMAT("%T", NET.REG_DOMAIN(input)) AS domain
    FROM (
      SELECT "" AS input, "invalid input" AS description
      UNION ALL SELECT "http://abc.xyz", "standard URL"
      UNION ALL SELECT "//user:password@a.b:80/path?query",
                       "standard URL with relative scheme, port, path and query, but no public suffix"
      UNION ALL SELECT "https://[::1]:80", "standard URL with IPv6 host"
      UNION ALL SELECT "http://例子.卷筒纸.中国", "standard URL with internationalized domain name"
      UNION ALL SELECT "    www.Example.Co.UK    ",
                       "non-standard URL with spaces, upper case letters, and without scheme"
      UNION ALL SELECT "mailto:?to=&subject=&body=", "URI rather than URL--unsupported"
    );
    
入力 説明 ホスト サフィックス ドメイン
"" 無効な入力 NULL NULL NULL
"http://abc.xyz" 標準の URL "abc.xyz" "xyz" "abc.xyz"
"//user:password@a.b:80/path?query" 相対スキーム、ポート、パス、クエリを含む標準の URL。ただし、パブリック サフィックスはありません。 "a.b" NULL NULL
"https://[::1]:80" IPv6 ホスト付きの標準 URL "[::1]" NULL NULL
"http://例子.卷筒纸.中国" 国際化ドメイン名付きの標準 URL "例子.卷筒纸.中国" "中国" "卷筒纸.中国"
"    www.Example.Co.UK    " スペースと大文字を含み、スキームのない非標準 URL "www.Example.Co.UK" "Co.UK" "Example.Co.UK"
"mailto:?to=&subject=&body=" URL ではなく URI(サポート対象外) "mailto" NULL NULL