[
  {
    "path": ".dir-locals.el",
    "content": ";; largely stolen from pg itself\n\n((c-mode . ((c-basic-offset . 4)\n            (c-file-style . \"bsd\")\n\t    (c-file-offsets (case-label . +) (label . -) (statement-case-open . +))\n            (fill-column . 78)\n            (indent-tabs-mode . t)\n            (tab-width . 4)\n\t    (eval add-hook 'before-save-hook 'delete-trailing-whitespace nil t)))\n (css-mode . ((tab-width . 4)\n\t      (eval add-hook 'before-save-hook 'delete-trailing-whitespace nil t)))\n (dsssl-mode . ((indent-tabs-mode . nil)))\n (nxml-mode . ((indent-tabs-mode . nil))))\n\n;; c-file-offsets is not marked safe by default, but you can either\n;; accept the specific value given as safe always, or do something\n;; like this in your .emacs to accept only the simplest offset lists\n;; automatically:\n;; (defun my-safe-c-file-offsets-p (alist)\n;;  (catch 'break\n;;    (and (listp alist)\n;;         (dolist (elt alist t)\n;;           (pcase elt\n;;             (`(,(pred symbolp) . ,(or `+ `- `++ `-- `* `/)) t)\n;;             (`(,(pred symbolp) . ,(or (pred null) (pred integerp))) t)\n;;             (`(,(pred symbolp) . [ ,(pred integerp) ]) t)\n;;             (_ (throw 'break nil)))))))\n;; (put 'c-file-offsets 'safe-local-variable 'my-safe-c-file-offsets-p)\n"
  },
  {
    "path": ".editorconfig",
    "content": "\n[*]\ntab_width = 4\n\n[Makefile]\ntab_width = 8\n"
  },
  {
    "path": ".gitattributes",
    "content": "# gitattributes\n*\t\twhitespace=space-before-tab,trailing-space\n*.[chly]\twhitespace=space-before-tab,trailing-space,indent-with-non-tab,tabwidth=4\n*.[ch]\t\tlinguist-language=C\n\nsrc/*.h\t\tlinguist-language=C\nsrc/*.c\t\tlinguist-language=C\n\n# Test output files that contain extra whitespace\n*.out\t\t-whitespace\n"
  },
  {
    "path": ".github/workflows/regr_macos.yml",
    "content": "name: Build on MacOS\n\non:\n  push:\n    branches: [ master ]\n    tags:     [ REL_* ]\n  pull_request:\n    branches: [ master ]\n\njobs:\n  build:\n    runs-on: macos-latest\n\n    defaults:\n      run:\n        shell: sh\n\n    steps:\n    - name: checkout\n      uses: actions/checkout@v3\n\n    - name: start pg\n      run: |\n        brew services start postgresql\n\n    - name: build\n      run: |\n        make && sudo -E make install\n\n    - name: wait for pg\n      run: |\n        n=0\n        while ! pg_isready; do [ $(( n += 1 )) -gt 10 ] && exit 1; sleep $n; done\n\n    - name: test\n      run: |\n        time make installcheck\n\n    - name: show output\n      if: always()\n      run: |\n        cat regression.diffs || true\n"
  },
  {
    "path": ".github/workflows/regression.yml",
    "content": "name: Build\n\non:\n  push:\n    branches: [ master ]\n    tags:     [ REL_* ]\n  pull_request:\n    branches: [ master ]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    defaults:\n      run:\n        shell: sh\n\n    strategy:\n      matrix:\n        pgver:  [ 9.5, 9.6, 10, 11, 12, 13, 14, 15, 16 ]\n        include:\n          - pgrepo: \"\"\n          - pgver: 17\n            pgrepo: \"-pgdg-snapshot\"\n\n    env:\n      PG:       ${{ matrix.pgver }}\n      PGREPO:   ${{ matrix.pgrepo }}\n\n    steps:\n    - name: checkout\n      uses: actions/checkout@v3\n\n    - name: cleanup pg\n      run: |\n        sudo apt-get -y --purge --no-upgrade remove postgresql libpq-dev libpq5 postgresql-client-common postgresql-common\n        curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -\n        sudo sh -c 'echo \"deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main\" >/etc/apt/sources.list.d/pgdg.list'\n        sudo sh -c 'echo \"deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg-snapshot main 17\" >/etc/apt/sources.list.d/pgdg-snap.list'\n        sudo apt-get update -qq\n        sudo rm -rf /var/lib/postgresql\n\n    - name: install pg\n      run: |\n        sudo apt-get -y \\\n               -o Dpkg::Options::=--force-confdef \\\n               -o Dpkg::Options::=--force-confnew \\\n               ${PGREPO:+-t \"$(lsb_release -cs)$PGREPO\"} \\\n               install postgresql-${PG:?} postgresql-server-dev-${PG:?}\n        sudo -u postgres createuser -s \"$USER\"\n\n    - name: build and test\n      run: |\n        make && sudo -E make install && time make installcheck\n\n    - name: show output\n      if: always()\n      run: |\n        cat regression.diffs || true\n"
  },
  {
    "path": ".gitignore",
    "content": "*.o\n*.so\n*.so.[0-9]\n*.so.[0-9].[0-9]\n*.sl\n*.sl.[0-9]\n*.sl.[0-9].[0-9]\n*.dylib\n*.dll\n*.a\n*.mo\n*.bc\nobjfiles.txt\n.deps/\n*.gcno\n*.gcda\n*.gcov\n*.gcov.out\nlcov.info\ncoverage/\n/results/\n/ip4r.sql\n/ip4r.sql.in\n/sql/ip4r-legacy.sql\n/expected/ip4r-legacy.out\n/build*/\n"
  },
  {
    "path": "LICENSE",
    "content": "PostgreSQL License\n\nCopyright (c) 2004-2019, Andrew Gierth\nCopyright (c) 2003, Steve Atkins\nCopyright (c) 2000-2003, PostgreSQL Global Development Group\n\nPermission to use, copy, modify, and distribute this software and its\ndocumentation for any purpose, without fee, and without a written agreement is\nhereby granted, provided that the above copyright notice and this paragraph\nand the following two paragraphs appear in all copies.\n\nIN NO EVENT SHALL THE AUTHORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,\nSPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING\nOUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS\nHAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nTHE AUTHORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN \"AS IS\" BASIS,\nAND THE AUTHORS HAVE NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,\nENHANCEMENTS, OR MODIFICATIONS.\n\n"
  },
  {
    "path": "Makefile",
    "content": "\nEXTENSION= ip4r\n\nMODULE_big = ip4r\n\nSRC_SQL\t= ip4r--2.4.sql \\\n\t  ip4r--2.2--2.4.sql \\\n\t  ip4r--2.1--2.2.sql \\\n\t  ip4r--2.0--2.1.sql \\\n\t  $(if $(call version_ge,$(MAJORVERSION),13),,$(SRC_OLD))\n# \"FROM unpackaged\" was removed in pg13\nSRC_OLD = ip4r--unpackaged2.1--2.1.sql \\\n\t  ip4r--unpackaged2.0--2.0.sql \\\n\t  ip4r--unpackaged1--2.0.sql\nDATA\t= $(addprefix scripts/, $(SRC_SQL))\n\nobjdir\t= src\n\nDOCS\t= README.ip4r\nOBJS_C\t= ip4r_module.o ip4r.o ip6r.o ipaddr.o iprange.o raw_io.o\nOBJS\t= $(addprefix src/, $(OBJS_C))\nINCS\t= ipr.h ipr_internal.h\n\nHEADERS = src/ipr.h\n\nREGRESS = ip4r \\\n\t  $(REGRESS_BY_VERSION)\nREGRESS_V11 := ip4r-v11\nREGRESS_V16 := ip4r-softerr\n\ndefine REGRESS_BY_VERSION\n$(strip $(foreach v,$(filter REGRESS_V%,$(.VARIABLES)),\n           $(if $(call version_ge,$(MAJORVERSION),$(subst REGRESS_V,,$(v))),\n                $($(v)))))\nendef\n\n# if VPATH is not already set, but the makefile is not in the current\n# dir, then assume a vpath build using the makefile's directory as\n# source. PGXS will set $(srcdir) accordingly.\nifndef VPATH\nifneq ($(realpath $(CURDIR)),$(realpath $(dir $(firstword $(MAKEFILE_LIST)))))\nVPATH := $(dir $(firstword $(MAKEFILE_LIST)))\nendif\nendif\n\nmklibdir := $(if $(VPATH),$(VPATH)/tools,tools)\ninclude $(mklibdir)/numeric.mk\n\nPG_CONFIG ?= pg_config\nPGXS = $(shell $(PG_CONFIG) --pgxs)\ninclude $(PGXS)\n\nifeq ($(call version_ge,$(MAJORVERSION),9.1),)\n$(error unsupported PostgreSQL version)\nendif\n\n$(OBJS): $(addprefix $(srcdir)/src/, $(INCS))\n\n# for a vpath build, we need src/ to exist in the build dir before\n# building any objects.\nifdef VPATH\nall: vpath-mkdirs\n.PHONY: vpath-mkdirs\n$(OBJS): | vpath-mkdirs\n\nvpath-mkdirs:\n\t$(MKDIR_P) $(objdir)\nendif # VPATH\n\n\n# end\n"
  },
  {
    "path": "README.ip4r",
    "content": "\nIP4R  - IPv4/v6 and IPv4/v6 range index type for PostgreSQL\n===========================================================\n\nCHANGES in version 2.4.2:\n=========================\n\n * Support pg 16, including soft-error handling for input.\n\n * Check for lower < upper in binary format input and correct\n   if necessary.\n\n * Remove support for some long-obsolete PG versions\n\n * Remove support for old-style (pre-extension) building.\n\nCHANGES in version 2.4.1:\n=========================\n\n * No functional changes.\n\n * Adjust regression tests for PostgreSQL 12.\n\nCHANGES in version 2.4:\n=======================\n\n * Add new cidr_split functions to decompose an arbitrary range into\n   a set of CIDR blocks.\n\n * Add casts to and from bit and bytea types.\n\n * Support new hash functions for hash partitioning.\n\n * Support window function RANGE offsets in pg11+, including a special\n   case where negative offset values are treated as CIDR prefix lengths\n   (so RANGE BETWEEN -16 PRECEDING AND -16 FOLLOWING includes in the\n   window frame all rows in the same /16 as the current row).\n\n * Fix a historical oversight with the hash function for iprange, in which\n   it would return different values for ip6 cidr ranges than the ip6r hash\n   function. This was not a bug in that no queries would give wrong\n   answers, but it would prevent any future reorganization of the opclass\n   to handle cross-type comparisons. Since allowing hash partitioning has\n   the practical effect of casting the hash function in stone (far more so\n   than hash indexes do), best to fix this now.\n\n   The result of the function iprangehash(iprange) is NOT changed by this\n   update, on the assumption that it might have been in use for\n   inheritance partitioning or other explicit uses. Instead, a new hash\n   function is added for the opclass to use.\n\n   NOTE: This version requires any hash indexes on iprange columns to be\n   rebuilt. An ALTER EXTENSION ... UPDATE command will refuse to run if it\n   detects any such indexes (it will report the offending indexes in INFO\n   messages to the client). You can automatically drop or recreate\n   affected indexes by performing one of these commands before the ALTER\n   EXTENSION:\n\n     SET ip4r.update_indexes = 'drop';\n     SET ip4r.update_indexes = 'rebuild';\n\n   (on pg 9.1 you will have to add 'ip4r' to custom_variable_classes\n   in postgresql.conf and restart before doing this)\n\n   The value 'drop' will drop any iprange hash indexes and complete the\n   upgrade. The DROP commands will be done with RESTRICT: if there are any\n   additional dependencies on the indexes in question, the upgrade will\n   not proceed; these will have to be dealt with manually. If any indexes\n   were dropped the upgrade will leave behind a new table named\n   ip4r_update_to_2_4.update_indexes containing the affected table and\n   index information, including the CREATE INDEX command as obtained by\n   pg_get_indexdef(). This table is not part of the extension and can be\n   dropped when the data is no longer needed. The value 'rebuild' will\n   cause the update script to perform the needed CREATE INDEX commands\n   itself (which of course may take some time).\n\nCHANGES in version 2.3:\n=======================\n\n * Fix build for changes in PostgreSQL 11.\n\n * Fix long-standing bug in binary-mode I/O of iprange type\n   (other types were not affected).\n\nCHANGES in version 2.2:\n=======================\n\n * Updating to this version should fix the pg_dump issue that affects\n   certain older installs that have been updated to 2.1, where a\n   poorly written catalog update to fix old function signatures broke\n   pg_dump.\n\nCHANGES in version 2.1:\n=======================\n\n * Index-only scans are now supported (on pg 9.5 or later)\n\n * Downward casts from ipaddress to ip4/ip6, and iprange to\n   ip4r/ip6r, are now allowed as assignment casts as well as\n   explicit casts.\n\n * parallel-safe is set on all functions in pg 9.6 or later.\n\n * Support for pre-9.1 versions of postgres (back to 8.4), and\n   non-extension builds on any version, is maintained in this release\n   (and some glaring bugs fixed), but should be considered\n   deprecated. Future releases will likely abandon support for\n   non-extension packaging.\n\n * Vestigial (and apparently non-functional) support for versions\n   prior to 8.4 is removed.\n\nCHANGES in version 2.0:\n=======================\n\n * 9.1+ extension packaging mechanism is the default for this version\n   (use NO_EXTENSION=1 to build on pre-9.1 or without packaging)\n\n * New types for ip6, ip6r, ipaddress, iprange\n\n * ip4 input no longer accepts spurious leading whitespace\n\nUPGRADING\n=========\n\nIf upgrading from ip4r-2.0 installed outside the extension mechanism, use:\n\nCREATE EXTENSION ip4r FROM \"unpackaged2.0\";\n\nIf upgrading from ip4r-1.x, use:\n\nCREATE EXTENSION ip4r FROM unpackaged1;\n\n\nRATIONALE\n=========\n\nWhile PostgreSQL already has builtin types 'inet' and 'cidr', the\nauthors of this module found that they had a number of requirements\nthat were not addressed by the builtin type.\n\nFirstly and most importantly, the builtin types have no good support\nfor index lookups of the form (column >>= parameter), i.e. where you\nhave a table of IP address ranges and wish to find which ones include\na given IP address.  This requires an rtree or gist index to do\nefficiently, and also requires a way to represent IP address ranges\nthat do not fall precisely on CIDR boundaries.\n\n(While newer versions of PostgreSQL do now have support for gist\nindexes on the inet type, the performance is very poor compared to\nthis module.)\n\nSecondly, the builtin inet/cidr are somewhat overloaded with\nsemantics, with inet combining two distinct concepts (a netblock, and\na specific IP within that netblock). Furthermore, they are variable\nlength types (to support ipv6) with non-trivial overheads, and the\nauthors (whose applications mainly deal in large volumes of single\nIPv4 addresses) wanted a more lightweight representation.\n\nIP4R therefore supports six distinct data types:\n\n  ip4   - a single IPv4 address\n  ip4r  - an arbitrary range of IPv4 addresses\n  ip6   - a single IPv6 address\n  ip6r  - an arbitrary range of IPv6 addresses\n  ipaddress  - a single IPv4 or IPv6 address\n  iprange    - an arbitrary range of IPv4 or IPv6 addresses\n\nSimple usage examples:\n\nCREATE TABLE ipranges (range ip4r primary key, description text not null);\nCREATE INDEX ipranges_range_idx ON ipranges USING gist (range);\nINSERT INTO ipranges VALUES ('10.0.0.0/8','rfc1918 block 1');\nINSERT INTO ipranges VALUES ('172.16.0.0/12','rfc1918 block 2');\nINSERT INTO ipranges VALUES ('192.168.0.0/16','rfc1918 block 3');\nINSERT INTO ipranges VALUES ('0.0.0.0/1','classical class A space');\nINSERT INTO ipranges VALUES ('10.0.1.10-10.0.1.20','my internal network');\nINSERT INTO ipranges VALUES ('127.0.0.1','localhost');\n\nCREATE TABLE access_log (id serial primary key, ip ip4 not null);\nCREATE INDEX access_log_ip_idx ON access_log (ip);\nINSERT INTO access_log(ip) VALUES ('10.0.1.15');\nINSERT INTO access_log(ip) VALUES ('24.1.2.3');\nINSERT INTO access_log(ip) VALUES ('192.168.10.20');\nINSERT INTO access_log(ip) VALUES ('127.0.0.1');\n\n-- find all accesses from 10.0.0.0/8\nSELECT * FROM access_log WHERE ip BETWEEN '10.0.0.0' AND '10.255.255.255';\n\n-- find all applicable descriptions for all entry in the access log\n-- returns multiple rows for each entry if there are overlapping ranges\nSELECT id,ip,range,description FROM access_log, ipranges WHERE ip <<= range;\n\n-- find only the most specific description for all IPs in the access log\nSELECT DISTINCT ON (ip) ip,range,description\n  FROM access_log, ipranges\n WHERE ip <<= range\n ORDER BY ip, @ range;\n\n\nINSTALLATION\n============\n\nip4r can be installed via the pgxs mechanism (which is now the default).\nUnpack the distribution and do:\n\nmake\nmake install\n\n(as with PostgreSQL itself, this requires GNU Make. The second command\nwill usually need to be run as root.)\n\nPRE-9.1 SYSTEMS\n===============\n\nOn versions before 9.1, or to build without extension packaging, use:\n\nmake NO_EXTENSION=1\nmake NO_EXTENSION=1 install\n\nand execute the ip4r.sql file manually in the same way as for contrib\nmodules (see the postgres manual).\n\n\nUSAGE\n=====\n\nTypes \"ip4\", \"ip6\", \"ipaddress\"\n-------------------------------\n\n\"ip4\" accepts input in the form 'nnn.nnn.nnn.nnn' in decimal base only\n(no hex, octal, etc.).  An ip4 value is a single IP address, and is\nstored as a 32-bit unsigned integer.\n\n\"ip6\" accepts input in the standard hexadecimal representation for\nIPv6 addresses, e.g. '2001:1234:aa55::2323'. \"Mixed\" format input\n(using an IPv4 dotted-decimal for the last two words) is accepted. An\nip6 value is a single IP address, and is stored as two 64-bit values\nfor convenience. Output is represented according to the specification\nin RFC 5952 (including output in mixed format for v4-mapped addresses).\n\n\"ipaddress\" accepts any input which is valid for either ip4 or ip6. An\nipaddress value is a single IP address, either v4 or v6. The v4 and v6\nranges are treated as disjoint - all v4 addresses are considered lower\nthan all v6 addresses, and '1.2.3.4' and '::ffff:1.2.3.4' are not equal.\n\n\"ipX\" will be used below to represent any of the above three types.\n\nThe following type conversions are supported:\n\n  Source type   | Dest type  |  Form\n----------------|------------|-------------------------------------------------\n  ipX           |  text      |  text(ipX)  or  ipX::text  (explicit)\n  text          |  ipX       |  ipX(text)  or  text::ipX  (explicit)\n  ipX           |  cidr      |  cidr(ipX)  or  ipX::cidr  (assignment)\n  inet          |  ipX       |  ipX(inet)  or  inet::ipX  (assignment)\n  ipX           |  numeric   |  to_numeric(ipX) or  ipX::numeric (explicit)\n  numeric       |  ipX       |  ipX(numeric)    or  bigint::ipX  (explicit)\n  ip4           |  bigint    |  to_bigint(ip4)  or  ip4::bigint  (explicit)\n  bigint        |  ip4       |  ip4(bigint)     or  bigint::ip4  (explicit)\n  ip4           |  float8    |  to_double(ip4)  or  ip4::float8  (explicit)\n  float8        |  ip4       |  ip4(float8)     or  float8::ip4  (explicit)\n  ipX           |  varbit    |  to_bit(ipX)     or  ipX::varbit  (explicit)\n  bit(32)       |  ip4       |  ip4(bit)        or  bit::ip4     (explicit)\n  bit(128)      |  ip6       |  ip6(bit)        or  bit::ip6     (explicit)\n  varbit        |  ipX       |  ipX(varbit)     or  varbit::ipX  (explicit)\n  ipX           |  bytea     |  to_bytea(ipX)   or  ipX::bytea   (explicit)\n  bytea         |  ipX       |  ipX(bytea)      or  bytea::ipX   (explicit)\n  ipX           |  ipXr      |  ipXr(ipX)  or  ipX::ipXr  (implicit)\n  ip4           |  ipaddress |  ipaddress(ip4)  or  ip4::ipaddress (implicit)\n  ip6           |  ipaddress |  ipaddress(ip6)  or  ip6::ipaddress (implicit)\n  ipaddress     |  ip4       |  ip4(ipaddress)  or  ipaddress::ip4 (assignment)\n  ipaddress     |  ip6       |  ip6(ipaddress)  or  ipaddress::ip6 (assignment)\n\nThe conversions from bigint and float8 are available only for ip4, and\naccept values which are exact integers in the range 0 .. 2^32-1, which\nare converted to IPs in the range 0.0.0.0 - 255.255.255.255 in the\nobvious way. This is useful for conversions from applications which\nstore IPs in numeric form, as is often done for performance in certain\nother databases.\n\nConversions to and from the 'numeric' type are available for all\nformats with the obvious behaviour.\n\nThe conversion to cidr always results in a /32 (for v4) or /128 (for v6).\nThe conversion from inet ignores any prefix length and just takes the\nspecific IP address.\n\nAn ipX value implicitly converts to either the corresponding range\ntype (ip4 -> ip4r, ip6 -> ip6r), or to the iprange type, producing a\nrange containing only the single IP address.\n\nipX supports the following operators with the conventional meanings:\n=, <>, <, >, <=, >=, and supports ORDER BY and btree indexes in the\nobvious fashion. However, the planner does not understand how to\ntransform a query of the form\n\n  WHERE ipcolumn <<= value\n\ninto a btree range scan (it does this transformation for the builtin\ninet type using a function which is not extensible by plugins). As a\nworkaround, use the following form instead:\n\n  WHERE ipcolumn BETWEEN lower(value) AND upper(value)\n\nwhich will use a btree range scan.\n\nipX supports the following additional operators and functions:\n\n family(ipX) returns integer\n | returns the value 4 or 6 depending on address family\n\n ip4_netmask(integer) returns ip4\n | returns an ip4 value that represents a netmask for a prefix length\n\n ip6_netmask(integer) returns ip6\n | returns an ip6 value that represents a netmask for a prefix length\n\n ipX_net_lower(ipX, integer) returns ipX\n | returns the lowest address in the cidr block of the specified prefix\n | length, containing the specified IP\n | equivalent to: network(set_masklen(cidr(ipX),integer))\n\n ipX_net_upper(ipX, integer) returns ipX\n | returns the highest address in the cidr block of the specified prefix\n | length, containing the specified IP\n | equivalent to: broadcast(set_masklen(cidr(ip4),integer))\n\n  Operator        | Description\n------------------|--------------------------------------------------------\n ipX + integer    | add the given integer to the IP \n ipX - integer    | subtract the given integer from the IP \n ipX + bigint     | add the given integer to the IP \n ipX - bigint     | subtract the given integer from the IP \n ipX + numeric    | add the given integer to the IP \n ipX - numeric    | subtract the given integer from the IP \n ipX - ipX        | (returns bigint or numeric) difference between two IPs\n ipX & ipX        | bitwise-AND the two values\n ipX | ipX        | bitwise-OR the two values\n ipX # ipX        | bitwise-XOR the two values\n ~ ipX            | bitwise-NOT the value\n\nArithmetic on ip4 values does not wrap below 0.0.0.0 or above\n255.255.255.255 - attempting to go beyond these limits raises an\nerror.\n\nMore complex arithmetic on IP addresses can be performed by converting\nthe IPs to numeric first; the above are only intended to cover the\ncommon cases without requiring casts.\n\n\nTypes \"ip4r\", \"ip6r\", \"iprange\"\n-------------------------------\n\nAn \"ip4r\" value denotes a single range of one or more IPv4 addresses,\nfor example '192.0.2.100-192.0.2.200'. Arbitrary ranges are allowed,\nthough input can also be in the form of CIDR netblocks, e.g.\n'192.0.2.0/24' is equivalent to '192.0.2.0-192.0.2.255'. A single\nvalue such as '192.0.2.25' represents a range containing only that\nvalue.\n\nAn \"ip6r\" value denotes a single range of one or more IPv6 addresses,\nfor example '2001::1234-2001::2000:0000'. Arbitrary ranges are\nallowed, though input can also be in the form of CIDR netblocks, e.g.\n'2001::/112' is equivalent to '2001::-2001::ffff'. A single value such\nas '2001::1234' represents a range containing only that value. Output\nformatting is as specified in RFC 5952.\n\nAn \"iprange\" value denotes either an IPv4 range or an IPv6 range, or\nthe special value '-' which includes all of both IPv4 and IPv6 space.\nMixing of address families is not otherwise supported.\n\nFor all of the above types, values are displayed in CIDR form if they\nrepresent a CIDR range, otherwise in range form.\n\nCurrently, abbreviated CIDR forms for IPv4 are not accepted at all,\ni.e. all octets must be supplied. For IPv6, words may only be omitted\nfrom the address as permitted by the zero-compression rules of RFC 5952.\n\n\"ipXr\" will be used below to represent any one of the above three types.\n\nAn ipXr value can be constructed from two IPs explicitly using the\nfunction ipXr(ipX,ipX). The ends of the range can be specified in\neither order.\n\nAn ipXr value can be constructed from an IP and a prefix length\nusing the / operator (see below). For backward compatibility, the\nfunction names ipXr_net_prefix and ipXr_net_mask are still accepted\nfor this operator.\n\nipXr supports the following type conversions:\n\n  Source type   | Dest type |  Form\n----------------|-----------|----------------------------------------------\n  ipX           |  ipXr     |  ipXr(ipX)  or  ipX::ipXr  (implicit)\n  ipXr          |  text     |  text(ipXr) or  ipXr::text (explicit)\n  text          |  ipXr     |  ipXr(text) or  text::ipXr (explicit)\n  ipXr          |  cidr     |  cidr(ipXr) or  ipXr::cidr (explicit)\n  cidr          |  ipXr     |  ipXr(cidr) or  cidr::ipXr (assignment)\n  ipXr          |  varbit   |  to_bit(ipXr) or ipXr::varbit  (explicit)\n  varbit        |  ip4r     |  ip4r(varbit) or varbit::ip4r  (explicit)\n  varbit        |  ip6r     |  ip6r(varbit) or varbit::ip6r  (explicit)\n\nThe conversion cidr(ipXr) returns NULL if the ipXr value does not\nrepresent a valid CIDR range.\n\nIn addition, type conversions between ip4r, ip6r and iprange are permitted\nin all valid combinations.\n\nipXr supports the following functions:\n\n  family(ipXr) returns integer\n  |  returns 4 or 6 according to address family, or NULL for '-'::iprange\n\n  is_cidr(ipXr) returns boolean\n  |  returns TRUE if the ipXr value is a valid CIDR range\n\n  lower(ipXr) returns ipX\n  |  returns the lower end of the ipXr range, as an ipX value\n\n  upper(ipXr) returns ipX\n  |  returns the upper end of the ipXr range, as an ipX value\n\n  cidr_split(ipXr) returns setof ipXr\n  |  splits the range up into separate CIDR blocks, and returns each one\n  |  as a separate row\n\nipXr supports the following operators:\n\n  Operator        | Description\n------------------|--------------------------------------------------------\n  a = b           | exact equality\n  a <> b          | exact inequality\n  a < b           | note [1]\n  a <= b          | note [1]\n  a > b           | note [1]\n  a >= b          | note [1]\n  a >>= b         | a contains b or is equal to b\n  a >> b          | a strictly contains b\n  a <<= b         | a is contained in b or is equal to b\n  a << b          | a is strictly contained in b\n  a && b          | a and b overlap\n  @ a             | approximate size of a (returns double)\n  @@ a            | exact size of a (returns numeric)\n  a / n           | construct CIDR range from address a length n\n  a / b           | construct CIDR range from address a netmask b\n\n[1]: the operators <, <=, >, >= implement an ordering for the purposes of\nbtree indexes, DISTINCT and ORDER BY; the ordering is not necessarily\nuseful for applications. The ordering used is a lexicographic ordering\nof (lower,upper).\n\nFor testing whether an ipXr range contains a specified single ip, use the\n>>= operator, i.e.  ipXr >>= ipX.  The implicit conversion from ipX to ipXr\nhandles this case.\n\n\nipXr Indexes\n------------\n\nipXr values can be indexed in several ways.\n\nA conventional btree index on ipXr values will work for the purposes of\nunique/primary key constraints, ordering, and equality lookups (i.e.\nWHERE column = value). Btree indexes are created in the usual way and\nare the default index type.\n\nHowever, ipXr's utility comes from its ability to use gist indexes to\nsupport the following lookup types:\n\n  WHERE column >>= value      (or >>)\n  WHERE column <<= value      (or <<)\n  WHERE column && value\n\nThese lookups require a GiST index. This can be created as follows:\n\nCREATE INDEX indexname ON tablename USING gist (column);\n\nIt is also possible to create a functional ip4r index over a column of\n'cidr' type as follows:\n\nCREATE INDEX indexname ON tablename USING gist (iprange(cidrcolumn));\n\n(ip4r(column) or ip6r(column) can also be used if the column is constrained\nto contain only values of the specified address family)\n\nThis can then be used for queries of the form:\n\n  WHERE iprange(cidrcolumn) >>= value    (or >>, <<=, && etc)\n\nOne advantage of this method is that the ip4r type can be dropped and\nrecreated without losing data. This is useful for accelerating queries\non an existing table designed without ip4r in mind.\n\nAnother idiom sometimes seen for representation of ranges of IP\naddresses is for applications to create two integer columns, and do\nrange queries of the form:\n\n  WHERE value BETWEEN column1 and column2\n\nThis is an attempt to get some use out of a btree index, but it performs\npoorly in most cases. This can also be converted to use a functional ip4r\nindex as follows:\n\nCREATE INDEX indexname ON tablename\n   USING gist (ip4r(column1::ip4,column2::ip4));\n\nand then doing queries of the form:\n\n  WHERE ip4r(column1::ip4,column2::ip4) >>= value\n\nThis method is not usually practical for IPv6.\n\nA common requirement is to get the longest-prefix (most specific)\nmatch to an IP address from a table of ranges or CIDR prefixes.\nThis can usually be best achieved using ORDER BY @ column,\nfor example:\n\nSELECT * FROM tablename\n WHERE column >>= value\n ORDER BY @ column\n LIMIT 1\n\nThe use of @ column (approximate size) is sufficient if the values are\nIPv4 ranges or are always CIDR prefixes. If arbitrary IPv6 ranges are\npresent, then overlapping ranges with small size differences might\ncompare equal; in this case use ORDER BY @@ column.\n\nWhen looking up multiple IPs, one can do queries of the following\nform:\n\nSELECT DISTINCT ON (ips.ip) ips.ip, ranges.range\n  FROM ips, ranges\n WHERE ranges.range >>= ips.ip\n ORDER BY ips.ip, @ ranges.range\n\n\nChoosing an index method\n------------------------\n\nAs with any data type, the choice of what index method to use (in this\ncase, btree vs. GiST) is generally dictated by what comparison\noperators you want to use on the data. So a condition of the form\nWHERE clientip = $1 or WHERE clientip BETWEEN lower($1) AND upper($1)\nwould make use of a btree index, whereas a for a condition like\nWHERE range >>= $1 then a GiST index would be indicated.\n\nGiST indexes are defined by this module only for ranges of addresses\n(ip4r, ip6r, iprange), so you would almost always use btree indexes\nfor columns storing a single address. The sole exception to this would\nbe if you need a multicolumn GiST index that combines an ip address\nwith columns of other GiST-indexable types (such as PostGIS geometry),\nin which case it may make sense to cast the address to a range\ncontaining only the single address.\n\n\nAUTHORS\n=======\n\nthis code by andrew@tao11.riddles.org.uk Oct 2004 - 2018\nderived from 'ipr' by Steve Atkins <steve@blighty.com> August 2003\nderived from the 'seg' type distributed with PostgreSQL.\n\nDistributed under the same terms as PostgreSQL itself.\n\nCurrently maintained at:\n  http://github.com/RhodiumToad/ip4r\n\n"
  },
  {
    "path": "expected/ip4r-softerr.out",
    "content": "-- Tests for pg16+\n--valid and invalid ip4\nselect v.i, v.t, pg_input_is_valid(v.t,'ip4') as valid, ierr.*\n  from (values (1, '1.2.3.4'),\n\t       (2, '0.0.0.0'),\n\t       (3, '255.255.255.255'),\n\t       -- invalid\n\t       (4, '1.2.3'),\n\t       (5, '0'),\n\t       (6, ' 1.2.3.4'),\n\t       (7, '1.2.3.4 '),\n\t       (8, '0.0.0.256'),\n\t       (9 , '0.0.256'),\n\t       (10, '0..255.0'),\n\t       (11, '+0.255.0.0'),\n\t       (12, '1.2.3.4-1.2.3.4')) v(i,t)\n  left join lateral (select * from pg_input_error_info(v.t,'ip4')) ierr\n\t\t on true;\n i  |        t        | valid |               message                | detail | hint | sql_error_code \n----+-----------------+-------+--------------------------------------+--------+------+----------------\n  1 | 1.2.3.4         | t     |                                      |        |      | \n  2 | 0.0.0.0         | t     |                                      |        |      | \n  3 | 255.255.255.255 | t     |                                      |        |      | \n  4 | 1.2.3           | f     | invalid IP4 value: '1.2.3'           |        |      | 22023\n  5 | 0               | f     | invalid IP4 value: '0'               |        |      | 22023\n  6 |  1.2.3.4        | f     | invalid IP4 value: ' 1.2.3.4'        |        |      | 22023\n  7 | 1.2.3.4         | f     | invalid IP4 value: '1.2.3.4 '        |        |      | 22023\n  8 | 0.0.0.256       | f     | invalid IP4 value: '0.0.0.256'       |        |      | 22023\n  9 | 0.0.256         | f     | invalid IP4 value: '0.0.256'         |        |      | 22023\n 10 | 0..255.0        | f     | invalid IP4 value: '0..255.0'        |        |      | 22023\n 11 | +0.255.0.0      | f     | invalid IP4 value: '+0.255.0.0'      |        |      | 22023\n 12 | 1.2.3.4-1.2.3.4 | f     | invalid IP4 value: '1.2.3.4-1.2.3.4' |        |      | 22023\n(12 rows)\n\n--valid and invalid ip4r\nselect v.i, v.t, pg_input_is_valid(v.t,'ip4r') as valid, ierr.*\n  from (values (1, '1.2.3.4'),\n\t       (2, '255.255.255.255/32'),\n\t       (3, '128.0.0.0/1'),\n\t       (4, '0.0.0.0/0'),\n\t       (5, '1.2.3.4-5.6.7.8'),\n\t       (6, '5.6.7.8-1.2.3.4'),\n\t       -- invalid\n\t       (7, '1.2.3'),\n\t       (8, '255.255.255.255.255.255.255.255.255'),\n\t       (9, '255.255.255.255.255-255.255.255.255.255'),\n\t       (10, '255.255.255.255-1.2.3.4.5'),\n\t       (11, '0.0.0.1/31'),\n\t       (12, '128.0.0.0/0'),\n\t       (13, '0.0.0.0/33'),\n\t       (14, '0.0.0.0/3.0'),\n\t       (15, '0.0.0.0/+33')\n\t       ) v(i,t)\n  left join lateral (select * from pg_input_error_info(v.t,'ip4r')) ierr\n\t\t on true;\n i  |                    t                    | valid |                            message                            | detail | hint | sql_error_code \n----+-----------------------------------------+-------+---------------------------------------------------------------+--------+------+----------------\n  1 | 1.2.3.4                                 | t     |                                                               |        |      | \n  2 | 255.255.255.255/32                      | t     |                                                               |        |      | \n  3 | 128.0.0.0/1                             | t     |                                                               |        |      | \n  4 | 0.0.0.0/0                               | t     |                                                               |        |      | \n  5 | 1.2.3.4-5.6.7.8                         | t     |                                                               |        |      | \n  6 | 5.6.7.8-1.2.3.4                         | t     |                                                               |        |      | \n  7 | 1.2.3                                   | f     | invalid IP4R value: \"1.2.3\"                                   |        |      | 22023\n  8 | 255.255.255.255.255.255.255.255.255     | f     | invalid IP4R value: \"255.255.255.255.255.255.255.255.255\"     |        |      | 22023\n  9 | 255.255.255.255.255-255.255.255.255.255 | f     | invalid IP4R value: \"255.255.255.255.255-255.255.255.255.255\" |        |      | 22023\n 10 | 255.255.255.255-1.2.3.4.5               | f     | invalid IP4R value: \"255.255.255.255-1.2.3.4.5\"               |        |      | 22023\n 11 | 0.0.0.1/31                              | f     | invalid IP4R value: \"0.0.0.1/31\"                              |        |      | 22023\n 12 | 128.0.0.0/0                             | f     | invalid IP4R value: \"128.0.0.0/0\"                             |        |      | 22023\n 13 | 0.0.0.0/33                              | f     | invalid IP4R value: \"0.0.0.0/33\"                              |        |      | 22023\n 14 | 0.0.0.0/3.0                             | f     | invalid IP4R value: \"0.0.0.0/3.0\"                             |        |      | 22023\n 15 | 0.0.0.0/+33                             | f     | invalid IP4R value: \"0.0.0.0/+33\"                             |        |      | 22023\n(15 rows)\n\n--valid and invalid ip6\nselect v.i, v.t, pg_input_is_valid(v.t,'ip6') as valid, ierr.*\n  from (values (1, '0000:0000:0000:0000:0000:0000:0000:0000'),\n\t       (2, '0000:0000:0000:0000:0000:0000:0000:0001'),\n\t       (3, '0:0:0:0:0:0:0:0'),\n\t       (4, '0:0:0:0:0:0:0:1'),\n\t       (5, '0:0:0:0:0:0:13.1.68.3'),\n\t       (6, '0:0:0:0:0:FFFF:129.144.52.38'),\n\t       (7, '0::0'),\n\t       (8, '1:2:3:4:5:6:1.2.3.4'),\n\t       -- invalid\n\t       (9, ''),\n\t       (10, '02001:0000:1234:0000:0000:C1C0:ABCD:0876'),\n\t       (11, '1.2.3.4:1111:2222:3333:4444::5555'),\n\t       (12, '123'),\n\t       (13, '12345::6:7:8'),\n\t       (14, '::1.2.256.4'),\n\t       (15, 'FF01::101::2'),\n\t       (16, 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'),\n\t       (17, 'ldkfj')\n       ) v(i,t)\n  left join lateral (select * from pg_input_error_info(v.t,'ip6')) ierr\n\t\t on true;\n i  |                      t                       | valid |                              message                              | detail | hint | sql_error_code \n----+----------------------------------------------+-------+-------------------------------------------------------------------+--------+------+----------------\n  1 | 0000:0000:0000:0000:0000:0000:0000:0000      | t     |                                                                   |        |      | \n  2 | 0000:0000:0000:0000:0000:0000:0000:0001      | t     |                                                                   |        |      | \n  3 | 0:0:0:0:0:0:0:0                              | t     |                                                                   |        |      | \n  4 | 0:0:0:0:0:0:0:1                              | t     |                                                                   |        |      | \n  5 | 0:0:0:0:0:0:13.1.68.3                        | t     |                                                                   |        |      | \n  6 | 0:0:0:0:0:FFFF:129.144.52.38                 | t     |                                                                   |        |      | \n  7 | 0::0                                         | t     |                                                                   |        |      | \n  8 | 1:2:3:4:5:6:1.2.3.4                          | t     |                                                                   |        |      | \n  9 |                                              | f     | invalid IP6 value: ''                                             |        |      | 22023\n 10 | 02001:0000:1234:0000:0000:C1C0:ABCD:0876     | f     | invalid IP6 value: '02001:0000:1234:0000:0000:C1C0:ABCD:0876'     |        |      | 22023\n 11 | 1.2.3.4:1111:2222:3333:4444::5555            | f     | invalid IP6 value: '1.2.3.4:1111:2222:3333:4444::5555'            |        |      | 22023\n 12 | 123                                          | f     | invalid IP6 value: '123'                                          |        |      | 22023\n 13 | 12345::6:7:8                                 | f     | invalid IP6 value: '12345::6:7:8'                                 |        |      | 22023\n 14 | ::1.2.256.4                                  | f     | invalid IP6 value: '::1.2.256.4'                                  |        |      | 22023\n 15 | FF01::101::2                                 | f     | invalid IP6 value: 'FF01::101::2'                                 |        |      | 22023\n 16 | FF02:0000:0000:0000:0000:0000:0000:0000:0001 | f     | invalid IP6 value: 'FF02:0000:0000:0000:0000:0000:0000:0000:0001' |        |      | 22023\n 17 | ldkfj                                        | f     | invalid IP6 value: 'ldkfj'                                        |        |      | 22023\n(17 rows)\n\n--valid and invalid ip6r\nselect v.i, v.t, pg_input_is_valid(v.t,'ip6r') as valid, ierr.*\n  from (values (1, '::'),\n\t       (2, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'),\n\t       (3, '1::2'),\n\t       (4, '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'),\n\t       (5, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'),\n\t       (6, '1::2-3::4'),\n\t       (7, '3::4-3::4'),\n\t       (8, '3::4-1::2'),\n\t       -- invalid\n\t       (9, '::-::-::'),\n\t       (10, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff'),\n\t       (11, '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'),\n\t       (12, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'),\n\t       (13, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'),\n\t       (14, '0000:0000:0000:0000:0000:0000:0000:0001/127'),\n\t       (15, '0800:0000:0000:0000:0000:0000:0000:0000/4'),\n\t       (16, '8000:0000:0000:0000:0000:0000:0000:0000/0'),\n\t       (17, '::/129'),\n\t       (18, '::/255'),\n\t       (19, '::/256'),\n\t       (20, '::/+0'),\n\t       (21, '::/0-0'),\n\t       (22, '::-::/0')\n       ) v(i,t)\n  left join lateral (select * from pg_input_error_info(v.t,'ip6r')) ierr\n\t\t on true;\n i  |                        t                         | valid |                                message                                 | detail | hint | sql_error_code \n----+--------------------------------------------------+-------+------------------------------------------------------------------------+--------+------+----------------\n  1 | ::                                               | t     |                                                                        |        |      | \n  2 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff          | t     |                                                                        |        |      | \n  3 | 1::2                                             | t     |                                                                        |        |      | \n  4 | ::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff       | t     |                                                                        |        |      | \n  5 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::       | t     |                                                                        |        |      | \n  6 | 1::2-3::4                                        | t     |                                                                        |        |      | \n  7 | 3::4-3::4                                        | t     |                                                                        |        |      | \n  8 | 3::4-1::2                                        | t     |                                                                        |        |      | \n  9 | ::-::-::                                         | f     | invalid IP6R value: \"::-::-::\"                                         |        |      | 22023\n 10 | ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff          | f     | invalid IP6R value: \"ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff\"          |        |      | 22023\n 11 | ::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff  | f     | invalid IP6R value: \"::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\"  |        |      | 22023\n 12 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::  | f     | invalid IP6R value: \"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::\"  |        |      | 22023\n 13 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128 | f     | invalid IP6R value: \"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128\" |        |      | 22023\n 14 | 0000:0000:0000:0000:0000:0000:0000:0001/127      | f     | invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/127\"      |        |      | 22023\n 15 | 0800:0000:0000:0000:0000:0000:0000:0000/4        | f     | invalid IP6R value: \"0800:0000:0000:0000:0000:0000:0000:0000/4\"        |        |      | 22023\n 16 | 8000:0000:0000:0000:0000:0000:0000:0000/0        | f     | invalid IP6R value: \"8000:0000:0000:0000:0000:0000:0000:0000/0\"        |        |      | 22023\n 17 | ::/129                                           | f     | invalid IP6R value: \"::/129\"                                           |        |      | 22023\n 18 | ::/255                                           | f     | invalid IP6R value: \"::/255\"                                           |        |      | 22023\n 19 | ::/256                                           | f     | invalid IP6R value: \"::/256\"                                           |        |      | 22023\n 20 | ::/+0                                            | f     | invalid IP6R value: \"::/+0\"                                            |        |      | 22023\n 21 | ::/0-0                                           | f     | invalid IP6R value: \"::/0-0\"                                           |        |      | 22023\n 22 | ::-::/0                                          | f     | invalid IP6R value: \"::-::/0\"                                          |        |      | 22023\n(22 rows)\n\n--valid and invalid ipaddress\nselect v.i, v.t, pg_input_is_valid(v.t,'ipaddress') as valid, ierr.*\n  from (values (1, '1.2.3.4'),\n\t       (2, '0.0.0.0'),\n\t       (3, '255.255.255.255'),\n\t       (4, '1::8'),\n\t       (5, '2001:0000:1234:0000:0000:C1C0:ABCD:0876'),\n\t       (6, '2001:0db8:0000:0000:0000:0000:1428:57ab'),\n\t       -- invalid\n\t       (7, '1.2.3'),\n\t       (8, '0'),\n\t       (9, ' 1.2.3.4'),\n\t       (10, '1.2.3.4 '),\n\t       (11, '0.0.0.256'),\n\t       (12, ''),\n\t       (13, '02001:0000:1234:0000:0000:C1C0:ABCD:0876'),\n\t       (14, '1.2.3.4:1111:2222:3333:4444::5555'),\n\t       (15, '::ffff:2.3.4'),\n\t       (16, '::ffff:257.1.2.3'),\n\t       (17, 'FF01::101::2'),\n\t       (18, 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'),\n\t       (19, 'ldkfj')\n       ) v(i,t)\n  left join lateral (select * from pg_input_error_info(v.t,'ipaddress')) ierr\n\t\t on true;\n i  |                      t                       | valid |                             message                              | detail | hint | sql_error_code \n----+----------------------------------------------+-------+------------------------------------------------------------------+--------+------+----------------\n  1 | 1.2.3.4                                      | t     |                                                                  |        |      | \n  2 | 0.0.0.0                                      | t     |                                                                  |        |      | \n  3 | 255.255.255.255                              | t     |                                                                  |        |      | \n  4 | 1::8                                         | t     |                                                                  |        |      | \n  5 | 2001:0000:1234:0000:0000:C1C0:ABCD:0876      | t     |                                                                  |        |      | \n  6 | 2001:0db8:0000:0000:0000:0000:1428:57ab      | t     |                                                                  |        |      | \n  7 | 1.2.3                                        | f     | invalid IP value: '1.2.3'                                        |        |      | 22023\n  8 | 0                                            | f     | invalid IP value: '0'                                            |        |      | 22023\n  9 |  1.2.3.4                                     | f     | invalid IP value: ' 1.2.3.4'                                     |        |      | 22023\n 10 | 1.2.3.4                                      | f     | invalid IP value: '1.2.3.4 '                                     |        |      | 22023\n 11 | 0.0.0.256                                    | f     | invalid IP value: '0.0.0.256'                                    |        |      | 22023\n 12 |                                              | f     | invalid IP value: ''                                             |        |      | 22023\n 13 | 02001:0000:1234:0000:0000:C1C0:ABCD:0876     | f     | invalid IP value: '02001:0000:1234:0000:0000:C1C0:ABCD:0876'     |        |      | 22023\n 14 | 1.2.3.4:1111:2222:3333:4444::5555            | f     | invalid IP value: '1.2.3.4:1111:2222:3333:4444::5555'            |        |      | 22023\n 15 | ::ffff:2.3.4                                 | f     | invalid IP value: '::ffff:2.3.4'                                 |        |      | 22023\n 16 | ::ffff:257.1.2.3                             | f     | invalid IP value: '::ffff:257.1.2.3'                             |        |      | 22023\n 17 | FF01::101::2                                 | f     | invalid IP value: 'FF01::101::2'                                 |        |      | 22023\n 18 | FF02:0000:0000:0000:0000:0000:0000:0000:0001 | f     | invalid IP value: 'FF02:0000:0000:0000:0000:0000:0000:0000:0001' |        |      | 22023\n 19 | ldkfj                                        | f     | invalid IP value: 'ldkfj'                                        |        |      | 22023\n(19 rows)\n\n--valid and invalid iprange\nselect v.i, v.t, pg_input_is_valid(v.t,'iprange') as valid, ierr.*\n  from (values (1, '-'),\n\t       (2, '1.2.3.4'),\n\t       (3, '255.255.255.255/32'),\n\t       (4, '128.0.0.0/1'),\n\t       (5, '0.0.0.0/0'),\n\t       (6, '1.2.3.4-5.6.7.8'),\n\t       (7, '5.6.7.8-1.2.3.4'),\n\t       (8, '1.2.3.4-1.2.3.4'),\n\t       (9, '::'),\n\t       (10, '1::2'),\n\t       (11, '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'),\n\t       (12, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'),\n\t       (13, '1::2-3::4'),\n\t       (14, '3::4-3::4'),\n\t       (15, '3::4-1::2'),\n\t       (16, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'),\n\t       (17, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127'),\n\t       (18, '8000:0000:0000:0000:0000:0000:0000:0000/1'),\n\t       (19, '0000:0000:0000:0000:0000:0000:0000:0000/0'),\n\t       -- invalid\n\t       (20, '1.2.3'),\n\t       (21, '255.255.255.255.255.255.255.255.255'),\n\t       (22, '255.255.255.255.255-255.255.255.255.255'),\n\t       (23, '255.255.255.255-1.2.3.4.5'),\n\t       (24, '255.255.255.255-1.2.3'),\n\t       (25, '0.0.0.1/31'),\n\t       (26, '64.0.0.0/1'),\n\t       (27, '128.0.0.0/0'),\n\t       (28, '0.0.0.0/33'),\n\t       (29, '0.0.0.0/3.0'),\n\t       (30, '0.0.0.0/+33'),\n\t       (31, '::-::-::'),\n\t       (32, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff'),\n\t       (33, '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'),\n\t       (34, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'),\n\t       (35, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'),\n\t       (36, '0000:0000:0000:0000:0000:0000:0000:0001/127'),\n\t       (37, '0800:0000:0000:0000:0000:0000:0000:0000/4'),\n\t       (38, '8000:0000:0000:0000:0000:0000:0000:0000/0'),\n\t       (39, '::/129'),\n\t       (40, '::/255'),\n\t       (41, '::/256'),\n\t       (42, '::/+0'),\n\t       (43, '::/0-0'),\n\t       (44, '::-::/0'),\n\t       (45, '-::'),\n\t       (46, '-1.2.3.4'),\n\t       (47, '1.2.3.4-')\n       ) v(i,t)\n  left join lateral (select * from pg_input_error_info(v.t,'iprange')) ierr\n\t\t on true;\n i  |                        t                         | valid |                                message                                 | detail | hint | sql_error_code \n----+--------------------------------------------------+-------+------------------------------------------------------------------------+--------+------+----------------\n  1 | -                                                | t     |                                                                        |        |      | \n  2 | 1.2.3.4                                          | t     |                                                                        |        |      | \n  3 | 255.255.255.255/32                               | t     |                                                                        |        |      | \n  4 | 128.0.0.0/1                                      | t     |                                                                        |        |      | \n  5 | 0.0.0.0/0                                        | t     |                                                                        |        |      | \n  6 | 1.2.3.4-5.6.7.8                                  | t     |                                                                        |        |      | \n  7 | 5.6.7.8-1.2.3.4                                  | t     |                                                                        |        |      | \n  8 | 1.2.3.4-1.2.3.4                                  | t     |                                                                        |        |      | \n  9 | ::                                               | t     |                                                                        |        |      | \n 10 | 1::2                                             | t     |                                                                        |        |      | \n 11 | ::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff       | t     |                                                                        |        |      | \n 12 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::       | t     |                                                                        |        |      | \n 13 | 1::2-3::4                                        | t     |                                                                        |        |      | \n 14 | 3::4-3::4                                        | t     |                                                                        |        |      | \n 15 | 3::4-1::2                                        | t     |                                                                        |        |      | \n 16 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128      | t     |                                                                        |        |      | \n 17 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127      | t     |                                                                        |        |      | \n 18 | 8000:0000:0000:0000:0000:0000:0000:0000/1        | t     |                                                                        |        |      | \n 19 | 0000:0000:0000:0000:0000:0000:0000:0000/0        | t     |                                                                        |        |      | \n 20 | 1.2.3                                            | f     | invalid IP4R value: \"1.2.3\"                                            |        |      | 22023\n 21 | 255.255.255.255.255.255.255.255.255              | f     | invalid IP4R value: \"255.255.255.255.255.255.255.255.255\"              |        |      | 22023\n 22 | 255.255.255.255.255-255.255.255.255.255          | f     | invalid IP4R value: \"255.255.255.255.255-255.255.255.255.255\"          |        |      | 22023\n 23 | 255.255.255.255-1.2.3.4.5                        | f     | invalid IP4R value: \"255.255.255.255-1.2.3.4.5\"                        |        |      | 22023\n 24 | 255.255.255.255-1.2.3                            | f     | invalid IP4R value: \"255.255.255.255-1.2.3\"                            |        |      | 22023\n 25 | 0.0.0.1/31                                       | f     | invalid IP4R value: \"0.0.0.1/31\"                                       |        |      | 22023\n 26 | 64.0.0.0/1                                       | f     | invalid IP4R value: \"64.0.0.0/1\"                                       |        |      | 22023\n 27 | 128.0.0.0/0                                      | f     | invalid IP4R value: \"128.0.0.0/0\"                                      |        |      | 22023\n 28 | 0.0.0.0/33                                       | f     | invalid IP4R value: \"0.0.0.0/33\"                                       |        |      | 22023\n 29 | 0.0.0.0/3.0                                      | f     | invalid IP4R value: \"0.0.0.0/3.0\"                                      |        |      | 22023\n 30 | 0.0.0.0/+33                                      | f     | invalid IP4R value: \"0.0.0.0/+33\"                                      |        |      | 22023\n 31 | ::-::-::                                         | f     | invalid IP6R value: \"::-::-::\"                                         |        |      | 22023\n 32 | ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff          | f     | invalid IP6R value: \"ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff\"          |        |      | 22023\n 33 | ::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff  | f     | invalid IP6R value: \"::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\"  |        |      | 22023\n 34 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::  | f     | invalid IP6R value: \"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::\"  |        |      | 22023\n 35 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128 | f     | invalid IP6R value: \"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128\" |        |      | 22023\n 36 | 0000:0000:0000:0000:0000:0000:0000:0001/127      | f     | invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/127\"      |        |      | 22023\n 37 | 0800:0000:0000:0000:0000:0000:0000:0000/4        | f     | invalid IP6R value: \"0800:0000:0000:0000:0000:0000:0000:0000/4\"        |        |      | 22023\n 38 | 8000:0000:0000:0000:0000:0000:0000:0000/0        | f     | invalid IP6R value: \"8000:0000:0000:0000:0000:0000:0000:0000/0\"        |        |      | 22023\n 39 | ::/129                                           | f     | invalid IP6R value: \"::/129\"                                           |        |      | 22023\n 40 | ::/255                                           | f     | invalid IP6R value: \"::/255\"                                           |        |      | 22023\n 41 | ::/256                                           | f     | invalid IP6R value: \"::/256\"                                           |        |      | 22023\n 42 | ::/+0                                            | f     | invalid IP6R value: \"::/+0\"                                            |        |      | 22023\n 43 | ::/0-0                                           | f     | invalid IP6R value: \"::/0-0\"                                           |        |      | 22023\n 44 | ::-::/0                                          | f     | invalid IP6R value: \"::-::/0\"                                          |        |      | 22023\n 45 | -::                                              | f     | invalid IP6R value: \"-::\"                                              |        |      | 22023\n 46 | -1.2.3.4                                         | f     | invalid IP4R value: \"-1.2.3.4\"                                         |        |      | 22023\n 47 | 1.2.3.4-                                         | f     | invalid IP4R value: \"1.2.3.4-\"                                         |        |      | 22023\n(47 rows)\n\n-- end\n"
  },
  {
    "path": "expected/ip4r-v11.out",
    "content": "-- Tests for pg11+\n-- RANGE support\nselect a4,\n       array_agg(a4) over (order by a4 range between 268435456 preceding and 268435456 following)\n  from ipaddrs\n where a4 is not null;\n       a4        |                          array_agg                          \n-----------------+-------------------------------------------------------------\n 12.174.29.15    | {12.174.29.15}\n 33.8.16.211     | {33.8.16.211}\n 55.224.125.146  | {55.224.125.146}\n 73.239.169.71   | {73.239.169.71,76.178.38.194}\n 76.178.38.194   | {73.239.169.71,76.178.38.194}\n 96.76.124.246   | {96.76.124.246,104.175.11.72}\n 104.175.11.72   | {96.76.124.246,104.175.11.72}\n 163.145.90.183  | {163.145.90.183}\n 189.85.58.60    | {189.85.58.60,195.58.214.186,203.156.110.93}\n 195.58.214.186  | {189.85.58.60,195.58.214.186,203.156.110.93}\n 203.156.110.93  | {189.85.58.60,195.58.214.186,203.156.110.93}\n 223.213.219.214 | {223.213.219.214,235.64.97.205}\n 235.64.97.205   | {223.213.219.214,235.64.97.205,240.116.30.226}\n 240.116.30.226  | {235.64.97.205,240.116.30.226,254.251.8.237,255.226.130.53}\n 254.251.8.237   | {240.116.30.226,254.251.8.237,255.226.130.53}\n 255.226.130.53  | {240.116.30.226,254.251.8.237,255.226.130.53}\n(16 rows)\n\nselect a4,\n       array_agg(a4) over (order by a4 range between ip4 '16.0.0.0' preceding and ip4 '16.0.0.0' following)\n  from ipaddrs\n where a4 is not null;\n       a4        |                          array_agg                          \n-----------------+-------------------------------------------------------------\n 12.174.29.15    | {12.174.29.15}\n 33.8.16.211     | {33.8.16.211}\n 55.224.125.146  | {55.224.125.146}\n 73.239.169.71   | {73.239.169.71,76.178.38.194}\n 76.178.38.194   | {73.239.169.71,76.178.38.194}\n 96.76.124.246   | {96.76.124.246,104.175.11.72}\n 104.175.11.72   | {96.76.124.246,104.175.11.72}\n 163.145.90.183  | {163.145.90.183}\n 189.85.58.60    | {189.85.58.60,195.58.214.186,203.156.110.93}\n 195.58.214.186  | {189.85.58.60,195.58.214.186,203.156.110.93}\n 203.156.110.93  | {189.85.58.60,195.58.214.186,203.156.110.93}\n 223.213.219.214 | {223.213.219.214,235.64.97.205}\n 235.64.97.205   | {223.213.219.214,235.64.97.205,240.116.30.226}\n 240.116.30.226  | {235.64.97.205,240.116.30.226,254.251.8.237,255.226.130.53}\n 254.251.8.237   | {240.116.30.226,254.251.8.237,255.226.130.53}\n 255.226.130.53  | {240.116.30.226,254.251.8.237,255.226.130.53}\n(16 rows)\n\nselect a4,\n       array_agg(a4) over (order by a4 range between -3 preceding and -3 following)\n  from ipaddrs\n where a4 is not null;\n       a4        |                          array_agg                          \n-----------------+-------------------------------------------------------------\n 12.174.29.15    | {12.174.29.15}\n 33.8.16.211     | {33.8.16.211,55.224.125.146}\n 55.224.125.146  | {33.8.16.211,55.224.125.146}\n 73.239.169.71   | {73.239.169.71,76.178.38.194}\n 76.178.38.194   | {73.239.169.71,76.178.38.194}\n 96.76.124.246   | {96.76.124.246,104.175.11.72}\n 104.175.11.72   | {96.76.124.246,104.175.11.72}\n 163.145.90.183  | {163.145.90.183,189.85.58.60}\n 189.85.58.60    | {163.145.90.183,189.85.58.60}\n 195.58.214.186  | {195.58.214.186,203.156.110.93,223.213.219.214}\n 203.156.110.93  | {195.58.214.186,203.156.110.93,223.213.219.214}\n 223.213.219.214 | {195.58.214.186,203.156.110.93,223.213.219.214}\n 235.64.97.205   | {235.64.97.205,240.116.30.226,254.251.8.237,255.226.130.53}\n 240.116.30.226  | {235.64.97.205,240.116.30.226,254.251.8.237,255.226.130.53}\n 254.251.8.237   | {235.64.97.205,240.116.30.226,254.251.8.237,255.226.130.53}\n 255.226.130.53  | {235.64.97.205,240.116.30.226,254.251.8.237,255.226.130.53}\n(16 rows)\n\nselect a6,\n       array_agg(a6) over (order by a6 range between -10 preceding and -10 following)\n  from ipaddrs\n where a6 is not null;\n                   a6                    |                                                        array_agg                                                         \n-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------\n 73:3c34:57a:2a84:b1df:81b0:eb40:61cd    | {73:3c34:57a:2a84:b1df:81b0:eb40:61cd}\n b6:8ebc:c326:48a6:5615:a65e:e87a:25d7   | {b6:8ebc:c326:48a6:5615:a65e:e87a:25d7}\n 166:b8ea:1fc5:8913:17ea:d6a0:ac2b:90e1  | {166:b8ea:1fc5:8913:17ea:d6a0:ac2b:90e1}\n 227:b768:d43b:773d:6168:5133:867c:13f2  | {227:b768:d43b:773d:6168:5133:867c:13f2}\n 453:2d:fbd3:191:95c6:3751:eb62:e90      | {453:2d:fbd3:191:95c6:3751:eb62:e90}\n 4a6:7a28:b05b:f9b4:cc5b:9c4c:eefe:3e06  | {4a6:7a28:b05b:f9b4:cc5b:9c4c:eefe:3e06}\n 550:fe90:bd02:a3ed:35a2:3254:e280:cd20  | {550:fe90:bd02:a3ed:35a2:3254:e280:cd20}\n 75d:e701:5702:6087:a69a:1a2d:376e:4eb   | {75d:e701:5702:6087:a69a:1a2d:376e:4eb}\n 7e1:a608:dadd:684d:679e:698b:4db:c8c2   | {7e1:a608:dadd:684d:679e:698b:4db:c8c2}\n 9ec:8fec:9a0e:3f2a:66e2:9b5c:498a:1090  | {9ec:8fec:9a0e:3f2a:66e2:9b5c:498a:1090}\n a4b:4e55:7510:69b9:ba73:6550:eaa7:f16e  | {a4b:4e55:7510:69b9:ba73:6550:eaa7:f16e}\n bdb:15d3:fbaf:4bf6:194e:4d0d:4cb2:26c2  | {bdb:15d3:fbaf:4bf6:194e:4d0d:4cb2:26c2}\n cc6:3030:8e26:ed4a:ae48:4496:63c3:94d0  | {cc6:3030:8e26:ed4a:ae48:4496:63c3:94d0,ce0:f080:aff1:6780:4951:55a7:4c23:f108}\n ce0:f080:aff1:6780:4951:55a7:4c23:f108  | {cc6:3030:8e26:ed4a:ae48:4496:63c3:94d0,ce0:f080:aff1:6780:4951:55a7:4c23:f108}\n d6b:f94a:4040:ba81:2347:d486:ac79:96f7  | {d6b:f94a:4040:ba81:2347:d486:ac79:96f7}\n d9a:933a:3c47:801a:51d4:5a48:13bb:f59b  | {d9a:933a:3c47:801a:51d4:5a48:13bb:f59b}\n ded:898a:e003:6046:72e6:5584:1012:62cc  | {ded:898a:e003:6046:72e6:5584:1012:62cc}\n f47:6def:21e4:4620:3bc:9abc:8abd:aba2   | {f47:6def:21e4:4620:3bc:9abc:8abd:aba2}\n 1009:d4ec:fe15:7946:eff2:6827:349e:6f0c | {1009:d4ec:fe15:7946:eff2:6827:349e:6f0c}\n 10a5:994f:884d:9f98:4920:408d:1504:561d | {10a5:994f:884d:9f98:4920:408d:1504:561d}\n 1378:f0c0:8ca:c76d:f062:4b7a:2573:5710  | {1378:f0c0:8ca:c76d:f062:4b7a:2573:5710}\n 1395:59cf:33f6:988:1cf8:5ef3:3c2f:64dc  | {1395:59cf:33f6:988:1cf8:5ef3:3c2f:64dc}\n 13d9:9e39:ff4a:875f:82a0:77bc:1559:cf8d | {13d9:9e39:ff4a:875f:82a0:77bc:1559:cf8d,13fb:9738:a243:f879:730:2b72:783f:75e9}\n 13fb:9738:a243:f879:730:2b72:783f:75e9  | {13d9:9e39:ff4a:875f:82a0:77bc:1559:cf8d,13fb:9738:a243:f879:730:2b72:783f:75e9}\n 14fd:6de8:95f:fade:a20c:81d3:98da:c560  | {14fd:6de8:95f:fade:a20c:81d3:98da:c560}\n 1520:c2bc:8426:2927:9e12:5f90:f4b0:30e6 | {1520:c2bc:8426:2927:9e12:5f90:f4b0:30e6}\n 163a:503e:a2d7:c0d8:f5ee:657e:7f23:ea52 | {163a:503e:a2d7:c0d8:f5ee:657e:7f23:ea52}\n 1685:dcd3:5113:5d84:2e64:d9e2:a602:aab7 | {1685:dcd3:5113:5d84:2e64:d9e2:a602:aab7}\n 1839:8d68:ec5f:a4e7:711d:124e:150b:cddf | {1839:8d68:ec5f:a4e7:711d:124e:150b:cddf}\n 1863:bf8e:aef5:1ac4:f85a:6683:8f7c:d191 | {1863:bf8e:aef5:1ac4:f85a:6683:8f7c:d191}\n 18e8:f97:72d0:5444:c94:99fe:4a9e:f657   | {18e8:f97:72d0:5444:c94:99fe:4a9e:f657,18eb:378d:f12f:6114:34d2:ce03:e0d8:cffc}\n 18eb:378d:f12f:6114:34d2:ce03:e0d8:cffc | {18e8:f97:72d0:5444:c94:99fe:4a9e:f657,18eb:378d:f12f:6114:34d2:ce03:e0d8:cffc}\n 1962:ff9f:665f:ba25:d25a:f530:a391:5ab7 | {1962:ff9f:665f:ba25:d25a:f530:a391:5ab7}\n 1b96:6d23:348f:a5f2:1869:1cd5:eff5:d09a | {1b96:6d23:348f:a5f2:1869:1cd5:eff5:d09a}\n 1bc2:3fea:257c:553e:eb87:d8c7:ef94:4c9  | {1bc2:3fea:257c:553e:eb87:d8c7:ef94:4c9,1be9:3504:b341:17a8:10ec:e646:b0:433}\n 1be9:3504:b341:17a8:10ec:e646:b0:433    | {1bc2:3fea:257c:553e:eb87:d8c7:ef94:4c9,1be9:3504:b341:17a8:10ec:e646:b0:433}\n 1c3e:17b6:1bfd:77ea:2185:9748:38d:ac80  | {1c3e:17b6:1bfd:77ea:2185:9748:38d:ac80}\n 1c90:5c1b:9431:11ea:f6dd:bb7c:c57f:6cc6 | {1c90:5c1b:9431:11ea:f6dd:bb7c:c57f:6cc6}\n 1cc5:18d6:116d:d727:86b:9655:f44d:4fb7  | {1cc5:18d6:116d:d727:86b:9655:f44d:4fb7}\n 1dbf:c6d8:ce1a:e3e3:c9a2:8458:3674:f6b  | {1dbf:c6d8:ce1a:e3e3:c9a2:8458:3674:f6b}\n 1f38:cd00:b368:80e5:7579:df75:3c50:b21b | {1f38:cd00:b368:80e5:7579:df75:3c50:b21b}\n 204f:510d:e7e9:9c02:9576:48b1:bfb7:468  | {204f:510d:e7e9:9c02:9576:48b1:bfb7:468}\n 21ef:74a4:2571:e430:47b1:a582:9723:9b14 | {21ef:74a4:2571:e430:47b1:a582:9723:9b14}\n 2394:74d2:f34d:3801:3a23:f022:dc17:2cf  | {2394:74d2:f34d:3801:3a23:f022:dc17:2cf}\n 23fd:5d2:8e6a:628:b4e:3ff2:d386:d2b0    | {23fd:5d2:8e6a:628:b4e:3ff2:d386:d2b0}\n 2408:f23d:d1ac:746d:2c8f:3dd6:7ed0:5507 | {2408:f23d:d1ac:746d:2c8f:3dd6:7ed0:5507}\n 25d9:67f6:f409:c774:60ad:9d6a:b95b:4ad2 | {25d9:67f6:f409:c774:60ad:9d6a:b95b:4ad2,25f0:72d:e515:bc9b:f9a2:6061:b18b:758e}\n 25f0:72d:e515:bc9b:f9a2:6061:b18b:758e  | {25d9:67f6:f409:c774:60ad:9d6a:b95b:4ad2,25f0:72d:e515:bc9b:f9a2:6061:b18b:758e}\n 2689:eae5:4101:f97c:628a:58fa:f0b5:159  | {2689:eae5:4101:f97c:628a:58fa:f0b5:159,26a3:7ac5:3ce2:cb2d:994d:8f10:82b6:419d,26ad:4d5b:192c:f85a:71db:38be:c6ca:19de}\n 26a3:7ac5:3ce2:cb2d:994d:8f10:82b6:419d | {2689:eae5:4101:f97c:628a:58fa:f0b5:159,26a3:7ac5:3ce2:cb2d:994d:8f10:82b6:419d,26ad:4d5b:192c:f85a:71db:38be:c6ca:19de}\n 26ad:4d5b:192c:f85a:71db:38be:c6ca:19de | {2689:eae5:4101:f97c:628a:58fa:f0b5:159,26a3:7ac5:3ce2:cb2d:994d:8f10:82b6:419d,26ad:4d5b:192c:f85a:71db:38be:c6ca:19de}\n 28a6:2032:8a38:de85:f6f3:47bd:5124:7dc8 | {28a6:2032:8a38:de85:f6f3:47bd:5124:7dc8}\n 28e7:4441:e0a4:bf30:4cf4:edb0:638d:ad72 | {28e7:4441:e0a4:bf30:4cf4:edb0:638d:ad72}\n 29a4:a288:457e:57a9:bbb3:2a76:b117:b1e8 | {29a4:a288:457e:57a9:bbb3:2a76:b117:b1e8,29b2:d3c1:26c4:86b6:19b5:14dc:ab2d:bc67}\n 29b2:d3c1:26c4:86b6:19b5:14dc:ab2d:bc67 | {29a4:a288:457e:57a9:bbb3:2a76:b117:b1e8,29b2:d3c1:26c4:86b6:19b5:14dc:ab2d:bc67}\n 2a8a:5b38:cbdd:5d1c:e1b0:d627:f31f:285a | {2a8a:5b38:cbdd:5d1c:e1b0:d627:f31f:285a}\n 2b47:da0e:8c52:cc33:afaa:f85f:f143:88c6 | {2b47:da0e:8c52:cc33:afaa:f85f:f143:88c6}\n 2ee9:6428:5482:9721:9e51:ca52:ba3:99eb  | {2ee9:6428:5482:9721:9e51:ca52:ba3:99eb}\n 2f48:4d4b:443c:6de6:9cbe:9766:fd5:c88b  | {2f48:4d4b:443c:6de6:9cbe:9766:fd5:c88b}\n 2ff2:b6b6:ffd1:dc5f:fc2:defe:fd16:a414  | {2ff2:b6b6:ffd1:dc5f:fc2:defe:fd16:a414}\n 3138:9022:3412:4cfb:fc2a:729a:651c:40f9 | {3138:9022:3412:4cfb:fc2a:729a:651c:40f9}\n 318f:1162:8f48:3397:cb9a:f54e:f1e8:d05d | {318f:1162:8f48:3397:cb9a:f54e:f1e8:d05d}\n 32ca:6639:c07e:c474:fa11:c83:2886:516c  | {32ca:6639:c07e:c474:fa11:c83:2886:516c}\n 35f1:eb03:921c:f397:cd41:9201:f7e0:dfad | {35f1:eb03:921c:f397:cd41:9201:f7e0:dfad,35f3:d696:b49e:1a25:375:5e28:15c9:96ce}\n 35f3:d696:b49e:1a25:375:5e28:15c9:96ce  | {35f1:eb03:921c:f397:cd41:9201:f7e0:dfad,35f3:d696:b49e:1a25:375:5e28:15c9:96ce}\n 3902:4c48:d872:37bd:2e53:678d:3a0a:3cf6 | {3902:4c48:d872:37bd:2e53:678d:3a0a:3cf6,390b:b7a:6606:af43:233b:2e27:8336:5b2e}\n 390b:b7a:6606:af43:233b:2e27:8336:5b2e  | {3902:4c48:d872:37bd:2e53:678d:3a0a:3cf6,390b:b7a:6606:af43:233b:2e27:8336:5b2e}\n 39ec:d6ba:1f45:64d0:f4d2:3f0f:78e:a404  | {39ec:d6ba:1f45:64d0:f4d2:3f0f:78e:a404}\n 3af7:2de9:30a7:818d:9715:3eaf:d8f7:2583 | {3af7:2de9:30a7:818d:9715:3eaf:d8f7:2583}\n 3b13:802b:cfd:15ef:bab3:f337:8b00:5744  | {3b13:802b:cfd:15ef:bab3:f337:8b00:5744}\n 3bc9:de98:c700:5aa:d993:223e:dad:1949   | {3bc9:de98:c700:5aa:d993:223e:dad:1949}\n 4068:6d06:7463:589:3262:86d1:f1f1:f088  | {4068:6d06:7463:589:3262:86d1:f1f1:f088}\n 4111:e35f:ce3:c4de:dc4e:8764:8cd:1686   | {4111:e35f:ce3:c4de:dc4e:8764:8cd:1686,4131:d8b6:82af:797d:25fd:7bd4:b94d:ce34}\n 4131:d8b6:82af:797d:25fd:7bd4:b94d:ce34 | {4111:e35f:ce3:c4de:dc4e:8764:8cd:1686,4131:d8b6:82af:797d:25fd:7bd4:b94d:ce34}\n 42e2:d76f:c784:7a61:67c1:b931:6f49:32c5 | {42e2:d76f:c784:7a61:67c1:b931:6f49:32c5}\n 4430:8b98:82c8:3d6c:dbd6:579e:c3fc:ec9d | {4430:8b98:82c8:3d6c:dbd6:579e:c3fc:ec9d,4439:44b6:c04:de6a:c0af:cf35:d9f3:f8ee}\n 4439:44b6:c04:de6a:c0af:cf35:d9f3:f8ee  | {4430:8b98:82c8:3d6c:dbd6:579e:c3fc:ec9d,4439:44b6:c04:de6a:c0af:cf35:d9f3:f8ee}\n 450b:493b:a4d7:f0d3:6fe4:6da0:b550:f4ca | {450b:493b:a4d7:f0d3:6fe4:6da0:b550:f4ca}\n 454c:20ee:35b9:b48b:a59f:e4bc:7b76:f228 | {454c:20ee:35b9:b48b:a59f:e4bc:7b76:f228,454e:bfa0:ed21:4983:7572:22c9:413d:d4db}\n 454e:bfa0:ed21:4983:7572:22c9:413d:d4db | {454c:20ee:35b9:b48b:a59f:e4bc:7b76:f228,454e:bfa0:ed21:4983:7572:22c9:413d:d4db}\n 4620:c642:9985:6a1f:6c66:50c0:2108:10d3 | {4620:c642:9985:6a1f:6c66:50c0:2108:10d3}\n 4647:353:5292:8bef:e5b5:c13a:1176:deef  | {4647:353:5292:8bef:e5b5:c13a:1176:deef}\n 4bd6:2076:745e:acbe:c511:3786:60be:b51d | {4bd6:2076:745e:acbe:c511:3786:60be:b51d}\n 4d6a:edd6:a446:6d89:e2a3:ab27:79ec:e148 | {4d6a:edd6:a446:6d89:e2a3:ab27:79ec:e148}\n 4ee3:bfaa:5f22:2c05:573e:e87c:a6c2:81e0 | {4ee3:bfaa:5f22:2c05:573e:e87c:a6c2:81e0}\n 53ad:31ab:bc5e:c535:bc7c:5762:c11e:fcec | {53ad:31ab:bc5e:c535:bc7c:5762:c11e:fcec}\n 53d6:7f94:6b26:59cb:9c16:2aa:9722:b8ef  | {53d6:7f94:6b26:59cb:9c16:2aa:9722:b8ef}\n 5412:a54d:dbd8:8448:4728:5fb0:ec6f:4381 | {5412:a54d:dbd8:8448:4728:5fb0:ec6f:4381}\n 5466:93e3:8343:3686:394:778:79ac:772    | {5466:93e3:8343:3686:394:778:79ac:772}\n 54b6:4a85:c1a5:89b0:b7ff:5306:32be:d30f | {54b6:4a85:c1a5:89b0:b7ff:5306:32be:d30f}\n 5637:5e57:c050:53fe:e182:697:ab46:21cc  | {5637:5e57:c050:53fe:e182:697:ab46:21cc}\n 56fd:83db:3ff7:b0b:7d5:8378:a486:f20    | {56fd:83db:3ff7:b0b:7d5:8378:a486:f20}\n 5721:3c79:a6ff:c8d8:5e3:c785:808:e40    | {5721:3c79:a6ff:c8d8:5e3:c785:808:e40}\n 5889:8398:cb90:8df:b3d6:3f5c:72cb:cd64  | {5889:8398:cb90:8df:b3d6:3f5c:72cb:cd64}\n 599b:9e01:9a22:aebf:a731:ce57:fefb:8ed  | {599b:9e01:9a22:aebf:a731:ce57:fefb:8ed}\n 5a0b:33a9:3407:aa9c:f1c7:a538:2f25:bf14 | {5a0b:33a9:3407:aa9c:f1c7:a538:2f25:bf14,5a3f:b436:785f:32a4:8c86:13f8:e682:8b6a}\n 5a3f:b436:785f:32a4:8c86:13f8:e682:8b6a | {5a0b:33a9:3407:aa9c:f1c7:a538:2f25:bf14,5a3f:b436:785f:32a4:8c86:13f8:e682:8b6a}\n 5d63:9613:7b87:5c26:5c80:bbd3:14b5:1e63 | {5d63:9613:7b87:5c26:5c80:bbd3:14b5:1e63}\n 5e52:9aa9:8f83:2a67:5959:720d:f6ba:5d42 | {5e52:9aa9:8f83:2a67:5959:720d:f6ba:5d42}\n 5ee2:4fab:1073:b2f5:61c1:eea6:302f:685  | {5ee2:4fab:1073:b2f5:61c1:eea6:302f:685}\n 5fa8:25bb:15e8:5b35:758c:2044:d194:1962 | {5fa8:25bb:15e8:5b35:758c:2044:d194:1962}\n 61f2:afe0:d1af:18e9:5d40:7a4d:f112:2d09 | {61f2:afe0:d1af:18e9:5d40:7a4d:f112:2d09}\n 6251:ab4b:3b37:d71f:6b5f:1b2d:bd55:3a3c | {6251:ab4b:3b37:d71f:6b5f:1b2d:bd55:3a3c}\n 62b8:256d:637a:82bf:3b69:420:eea5:300b  | {62b8:256d:637a:82bf:3b69:420:eea5:300b}\n 62db:eab9:a54e:3cea:46f3:b7c2:cb9c:6e5d | {62db:eab9:a54e:3cea:46f3:b7c2:cb9c:6e5d}\n 6656:e87d:865c:3237:8d42:ff01:a82b:f308 | {6656:e87d:865c:3237:8d42:ff01:a82b:f308}\n 6a93:ccd3:5002:233f:1c5f:400e:601c:75a  | {6a93:ccd3:5002:233f:1c5f:400e:601c:75a}\n 6b0c:4791:ccea:c286:437e:d268:87ef:b6ad | {6b0c:4791:ccea:c286:437e:d268:87ef:b6ad}\n 6e1b:5e9c:f623:6134:7754:fdac:323a:dba2 | {6e1b:5e9c:f623:6134:7754:fdac:323a:dba2}\n 6e81:4a6a:d383:140d:8416:c09b:af3b:5b45 | {6e81:4a6a:d383:140d:8416:c09b:af3b:5b45,6e9d:66e:27c5:c7c4:aefe:ecfc:6568:ccf}\n 6e9d:66e:27c5:c7c4:aefe:ecfc:6568:ccf   | {6e81:4a6a:d383:140d:8416:c09b:af3b:5b45,6e9d:66e:27c5:c7c4:aefe:ecfc:6568:ccf}\n 6ff2:94f5:5755:164d:1301:28ce:8a04:eac0 | {6ff2:94f5:5755:164d:1301:28ce:8a04:eac0}\n 72c4:104f:960c:baf1:8ef7:60d2:c58:8b03  | {72c4:104f:960c:baf1:8ef7:60d2:c58:8b03}\n 7341:d21f:e576:f226:f690:a99c:6b55:9933 | {7341:d21f:e576:f226:f690:a99c:6b55:9933}\n 739b:8093:31c6:a42f:a604:d5cb:1350:2d2f | {739b:8093:31c6:a42f:a604:d5cb:1350:2d2f}\n 7524:1f76:fe52:991e:667b:a302:dfd5:dbd6 | {7524:1f76:fe52:991e:667b:a302:dfd5:dbd6}\n 7608:50bf:a29a:6805:c760:9ae3:1216:8e4a | {7608:50bf:a29a:6805:c760:9ae3:1216:8e4a}\n 78c8:1cde:4b95:55d8:b211:a95d:37e0:7d92 | {78c8:1cde:4b95:55d8:b211:a95d:37e0:7d92}\n 7924:9e5b:2c7:3920:9c9f:bfb6:369d:fa4f  | {7924:9e5b:2c7:3920:9c9f:bfb6:369d:fa4f}\n 798f:ea8:61f6:5d79:1656:d8d8:9b6e:57f0  | {798f:ea8:61f6:5d79:1656:d8d8:9b6e:57f0}\n 79c9:d301:92cd:c774:abbb:2f7d:92c3:3ccd | {79c9:d301:92cd:c774:abbb:2f7d:92c3:3ccd,79eb:6133:5173:8f43:87d4:cb1d:906b:e8c9}\n 79eb:6133:5173:8f43:87d4:cb1d:906b:e8c9 | {79c9:d301:92cd:c774:abbb:2f7d:92c3:3ccd,79eb:6133:5173:8f43:87d4:cb1d:906b:e8c9}\n 7cba:a835:f850:6409:dba7:1300:f2b8:1db3 | {7cba:a835:f850:6409:dba7:1300:f2b8:1db3}\n 7cdf:1ed8:690e:9e54:6f39:613e:f187:8ef2 | {7cdf:1ed8:690e:9e54:6f39:613e:f187:8ef2}\n 7dcc:877b:8e07:aeb4:d891:581e:c10c:af54 | {7dcc:877b:8e07:aeb4:d891:581e:c10c:af54}\n 7e1f:eb76:49c9:39f8:deb9:c447:b40c:a13d | {7e1f:eb76:49c9:39f8:deb9:c447:b40c:a13d}\n 7ec8:2b00:5994:7f0f:d765:5e16:c274:5645 | {7ec8:2b00:5994:7f0f:d765:5e16:c274:5645}\n 7f3d:d8ea:7a7c:8700:5b81:412f:c33a:d6ba | {7f3d:d8ea:7a7c:8700:5b81:412f:c33a:d6ba}\n 7fa2:dbdb:e889:e24b:4d30:962e:89f3:676f | {7fa2:dbdb:e889:e24b:4d30:962e:89f3:676f}\n 8119:1220:b888:3d8a:1250:ce77:b2b9:bdcd | {8119:1220:b888:3d8a:1250:ce77:b2b9:bdcd,8129:3e9c:70ff:1df1:f26f:86aa:c7ba:8245}\n 8129:3e9c:70ff:1df1:f26f:86aa:c7ba:8245 | {8119:1220:b888:3d8a:1250:ce77:b2b9:bdcd,8129:3e9c:70ff:1df1:f26f:86aa:c7ba:8245}\n 8172:4609:d700:5bd2:24a2:8f78:f1cc:c1a0 | {8172:4609:d700:5bd2:24a2:8f78:f1cc:c1a0}\n 8241:abe3:7537:de41:ef5a:7d2a:9e57:833b | {8241:abe3:7537:de41:ef5a:7d2a:9e57:833b}\n 828e:fa1d:9bb1:ad4c:4874:9da8:40bf:25b5 | {828e:fa1d:9bb1:ad4c:4874:9da8:40bf:25b5,8298:9399:271f:a3fe:270c:21cf:7c34:7340}\n 8298:9399:271f:a3fe:270c:21cf:7c34:7340 | {828e:fa1d:9bb1:ad4c:4874:9da8:40bf:25b5,8298:9399:271f:a3fe:270c:21cf:7c34:7340}\n 82ed:ac69:4ea7:5301:b005:3e17:f541:4fbc | {82ed:ac69:4ea7:5301:b005:3e17:f541:4fbc}\n 8357:a24:2f6e:f909:3853:899a:68af:b48   | {8357:a24:2f6e:f909:3853:899a:68af:b48}\n 8474:e00a:5b49:6e2a:5074:ecd5:cece:7dad | {8474:e00a:5b49:6e2a:5074:ecd5:cece:7dad}\n 84fe:7351:7b39:349e:1bb7:e333:daec:141a | {84fe:7351:7b39:349e:1bb7:e333:daec:141a}\n 8586:595:7bdd:359b:2fd9:1ffa:49ef:a947  | {8586:595:7bdd:359b:2fd9:1ffa:49ef:a947}\n 86fa:3a3:6a26:5ce3:fd8d:6267:b3c:4bf0   | {86fa:3a3:6a26:5ce3:fd8d:6267:b3c:4bf0}\n 874b:a74e:e292:c13:cf80:778c:35b4:d37c  | {874b:a74e:e292:c13:cf80:778c:35b4:d37c}\n 88bb:cf40:1f19:c897:f001:2d56:8f4f:ac68 | {88bb:cf40:1f19:c897:f001:2d56:8f4f:ac68}\n 8909:5e3:cff9:483c:1fb7:2ee2:ab05:222a  | {8909:5e3:cff9:483c:1fb7:2ee2:ab05:222a,890b:aa44:e2b1:ff61:eb7a:c4df:5a25:2eaf}\n 890b:aa44:e2b1:ff61:eb7a:c4df:5a25:2eaf | {8909:5e3:cff9:483c:1fb7:2ee2:ab05:222a,890b:aa44:e2b1:ff61:eb7a:c4df:5a25:2eaf}\n 8a1f:674e:63cd:f241:8f53:aec9:d8db:8e5c | {8a1f:674e:63cd:f241:8f53:aec9:d8db:8e5c}\n 8b0c:b103:3302:90bb:bac:809e:9c7d:3569  | {8b0c:b103:3302:90bb:bac:809e:9c7d:3569}\n 8b61:6b31:d02c:87d3:22cf:f01c:c045:b822 | {8b61:6b31:d02c:87d3:22cf:f01c:c045:b822}\n 8b87:864a:8e83:6783:c552:cb07:8e96:c0e5 | {8b87:864a:8e83:6783:c552:cb07:8e96:c0e5}\n 8c86:2c19:c38d:626b:b5a4:e0cb:bbaf:476b | {8c86:2c19:c38d:626b:b5a4:e0cb:bbaf:476b}\n 8ec2:3493:ad95:cb7e:ae1c:8c2c:6a34:eccb | {8ec2:3493:ad95:cb7e:ae1c:8c2c:6a34:eccb,8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1}\n 8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1 | {8ec2:3493:ad95:cb7e:ae1c:8c2c:6a34:eccb,8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1}\n 8f7a:5e8b:f526:a8ba:8c6f:3cae:7b7e:1a5  | {8f7a:5e8b:f526:a8ba:8c6f:3cae:7b7e:1a5}\n 8fa1:e604:6ad4:c318:ba8f:eaec:76be:ad4b | {8fa1:e604:6ad4:c318:ba8f:eaec:76be:ad4b,8fac:3b7e:463d:1b38:2f59:6fdf:3bef:4aaf}\n 8fac:3b7e:463d:1b38:2f59:6fdf:3bef:4aaf | {8fa1:e604:6ad4:c318:ba8f:eaec:76be:ad4b,8fac:3b7e:463d:1b38:2f59:6fdf:3bef:4aaf}\n 933f:d5b:d307:c3e0:5e0:b947:1cb5:6928   | {933f:d5b:d307:c3e0:5e0:b947:1cb5:6928}\n 9520:88f9:9498:8a73:ac7a:dc77:4495:3dfc | {9520:88f9:9498:8a73:ac7a:dc77:4495:3dfc}\n 9631:3557:7591:6ade:1882:6dad:8413:c3b3 | {9631:3557:7591:6ade:1882:6dad:8413:c3b3}\n 977b:de6f:3ef9:3cad:fb02:fb07:458c:e88e | {977b:de6f:3ef9:3cad:fb02:fb07:458c:e88e}\n 982a:e6d8:49bc:49a7:80b:4417:45f7:4fb7  | {982a:e6d8:49bc:49a7:80b:4417:45f7:4fb7}\n 9943:4095:cf6c:bf1d:f1b4:7883:f929:a315 | {9943:4095:cf6c:bf1d:f1b4:7883:f929:a315}\n 99b7:bba0:206c:6042:6778:2f3b:9a:6393   | {99b7:bba0:206c:6042:6778:2f3b:9a:6393}\n 9b3d:56d7:b18e:21b9:7448:3cea:2ec:77f8  | {9b3d:56d7:b18e:21b9:7448:3cea:2ec:77f8}\n 9c51:8c1b:a051:a87e:c65a:cc8:a38e:4953  | {9c51:8c1b:a051:a87e:c65a:cc8:a38e:4953}\n 9d35:9c4f:517d:2391:f59c:af03:1681:6d9b | {9d35:9c4f:517d:2391:f59c:af03:1681:6d9b}\n 9da1:e3ce:660a:cde4:7576:554:55cc:38ad  | {9da1:e3ce:660a:cde4:7576:554:55cc:38ad}\n 9ee9:65bd:81d2:b2c6:c3c4:b36b:16a2:fc9e | {9ee9:65bd:81d2:b2c6:c3c4:b36b:16a2:fc9e}\n a0d3:f0b5:7a50:2d3e:923e:3832:76c0:b15d | {a0d3:f0b5:7a50:2d3e:923e:3832:76c0:b15d}\n a252:248:a123:3287:680f:a67c:2fcd:b2a0  | {a252:248:a123:3287:680f:a67c:2fcd:b2a0}\n a300:d184:bf44:e8f1:4a80:723c:909:f178  | {a300:d184:bf44:e8f1:4a80:723c:909:f178,a335:f1a7:be5c:b341:5325:e8d3:2631:74ae}\n a335:f1a7:be5c:b341:5325:e8d3:2631:74ae | {a300:d184:bf44:e8f1:4a80:723c:909:f178,a335:f1a7:be5c:b341:5325:e8d3:2631:74ae}\n a42d:662e:1816:1fe3:a392:9190:7d4e:f418 | {a42d:662e:1816:1fe3:a392:9190:7d4e:f418}\n a52f:f73a:413e:a43a:5000:cd8f:ef1f:3603 | {a52f:f73a:413e:a43a:5000:cd8f:ef1f:3603}\n a75b:c708:8e74:b252:f8e8:7269:c214:dc07 | {a75b:c708:8e74:b252:f8e8:7269:c214:dc07}\n a87b:8920:6e0:9c1b:92a8:3a1e:f074:1ee2  | {a87b:8920:6e0:9c1b:92a8:3a1e:f074:1ee2}\n a884:9796:ca7c:ec37:9cb4:4158:ce4c:ced5 | {a884:9796:ca7c:ec37:9cb4:4158:ce4c:ced5}\n a9e9:74a5:864a:dfeb:a5f0:4424:d294:95a1 | {a9e9:74a5:864a:dfeb:a5f0:4424:d294:95a1}\n ac4c:23a6:9c5f:8a2a:ccfc:ea69:48cd:dffc | {ac4c:23a6:9c5f:8a2a:ccfc:ea69:48cd:dffc,ac71:fd2c:4352:c28a:2f4b:3cd1:4d6f:927b}\n ac71:fd2c:4352:c28a:2f4b:3cd1:4d6f:927b | {ac4c:23a6:9c5f:8a2a:ccfc:ea69:48cd:dffc,ac71:fd2c:4352:c28a:2f4b:3cd1:4d6f:927b}\n ad73:992f:b3d8:31f7:306d:a418:fdcf:3e60 | {ad73:992f:b3d8:31f7:306d:a418:fdcf:3e60}\n ae64:d6a3:11d7:b6bc:aa3:60c6:b16f:4305  | {ae64:d6a3:11d7:b6bc:aa3:60c6:b16f:4305}\n af5a:6507:2c50:f0a8:b211:fc0d:425e:bd47 | {af5a:6507:2c50:f0a8:b211:fc0d:425e:bd47}\n afeb:a771:735e:1a18:9297:e9f4:2e53:c5e1 | {afeb:a771:735e:1a18:9297:e9f4:2e53:c5e1}\n b105:5518:a963:9a0a:d10d:b42b:dfd1:96a2 | {b105:5518:a963:9a0a:d10d:b42b:dfd1:96a2,b113:66f:e222:f032:7161:1f27:b080:2111}\n b113:66f:e222:f032:7161:1f27:b080:2111  | {b105:5518:a963:9a0a:d10d:b42b:dfd1:96a2,b113:66f:e222:f032:7161:1f27:b080:2111}\n b218:c6f2:4929:7d70:8b4d:5458:fc85:d0fc | {b218:c6f2:4929:7d70:8b4d:5458:fc85:d0fc,b237:dac3:62d7:725e:d772:c88c:af71:cec5}\n b237:dac3:62d7:725e:d772:c88c:af71:cec5 | {b218:c6f2:4929:7d70:8b4d:5458:fc85:d0fc,b237:dac3:62d7:725e:d772:c88c:af71:cec5}\n b310:3d72:ea86:6ee:45fc:d57f:4a7a:bb43  | {b310:3d72:ea86:6ee:45fc:d57f:4a7a:bb43}\n b3da:187b:cc2e:3c78:e060:aab6:63cb:1780 | {b3da:187b:cc2e:3c78:e060:aab6:63cb:1780}\n b408:9874:22a3:9f56:35f:cfd1:b00:ddac   | {b408:9874:22a3:9f56:35f:cfd1:b00:ddac}\n b48c:eccb:32f4:2b4:e2ee:e787:a16f:8647  | {b48c:eccb:32f4:2b4:e2ee:e787:a16f:8647}\n b8ef:17e2:febe:431d:9d8c:88c6:6604:a678 | {b8ef:17e2:febe:431d:9d8c:88c6:6604:a678}\n ba0d:d2d4:b5e3:573f:98f4:98e:aac1:47fa  | {ba0d:d2d4:b5e3:573f:98f4:98e:aac1:47fa}\n baf9:2948:a8a1:8865:912a:839f:45e8:78d3 | {baf9:2948:a8a1:8865:912a:839f:45e8:78d3}\n bb1b:6a20:8513:14e4:5fc6:c0e9:17df:9c0  | {bb1b:6a20:8513:14e4:5fc6:c0e9:17df:9c0}\n bc1d:d3ba:50da:14d3:f496:6847:3b91:2830 | {bc1d:d3ba:50da:14d3:f496:6847:3b91:2830}\n bc52:8171:9377:d593:1c0a:75e4:e2d:5e1a  | {bc52:8171:9377:d593:1c0a:75e4:e2d:5e1a}\n bd6f:44b9:45d3:529f:84c7:612:b25c:aaf8  | {bd6f:44b9:45d3:529f:84c7:612:b25c:aaf8}\n bdc5:94f5:8249:7120:8132:ca25:d3fc:c394 | {bdc5:94f5:8249:7120:8132:ca25:d3fc:c394}\n c0fc:f3ee:3707:19dc:62c1:5c9a:df3d:1b58 | {c0fc:f3ee:3707:19dc:62c1:5c9a:df3d:1b58}\n c2e3:4cea:30dd:cb39:c5a0:86e7:8b05:3f7  | {c2e3:4cea:30dd:cb39:c5a0:86e7:8b05:3f7}\n c36f:f4fd:4853:a07c:c25d:349f:3af4:3432 | {c36f:f4fd:4853:a07c:c25d:349f:3af4:3432}\n c504:481e:2756:3ca2:f0c:a26a:4e64:7804  | {c504:481e:2756:3ca2:f0c:a26a:4e64:7804}\n c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d | {c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d}\n c8c0:5117:331a:f029:8d24:6775:fe7d:5976 | {c8c0:5117:331a:f029:8d24:6775:fe7d:5976}\n c963:10d0:1586:d1d4:79bc:d7af:5486:43e5 | {c963:10d0:1586:d1d4:79bc:d7af:5486:43e5}\n c99c:bd43:6161:d17d:2fdd:ab61:922:ba62  | {c99c:bd43:6161:d17d:2fdd:ab61:922:ba62}\n cb2f:b8da:ba34:1c5c:4839:710a:f75b:bdd0 | {cb2f:b8da:ba34:1c5c:4839:710a:f75b:bdd0}\n cb70:a0cc:6919:db7f:8fc8:cb69:6fcc:5f5b | {cb70:a0cc:6919:db7f:8fc8:cb69:6fcc:5f5b}\n cc17:3814:d80f:41a1:1309:35d3:ea0a:d31e | {cc17:3814:d80f:41a1:1309:35d3:ea0a:d31e}\n ce47:e5eb:41f3:23af:6209:5ade:82ce:3b00 | {ce47:e5eb:41f3:23af:6209:5ade:82ce:3b00}\n cfb9:d37e:2427:af8d:b728:8f90:f54c:9141 | {cfb9:d37e:2427:af8d:b728:8f90:f54c:9141}\n d066:f25b:e8a5:4ae6:4c99:2a98:8cb7:2530 | {d066:f25b:e8a5:4ae6:4c99:2a98:8cb7:2530}\n d105:1597:c912:51c7:e5b6:f628:cae:1d0f  | {d105:1597:c912:51c7:e5b6:f628:cae:1d0f}\n d2de:7aa1:975:e510:dfa1:2a3:89bc:eedb   | {d2de:7aa1:975:e510:dfa1:2a3:89bc:eedb}\n d33e:e847:b4c6:d5ca:f75:216b:342c:3d04  | {d33e:e847:b4c6:d5ca:f75:216b:342c:3d04}\n d395:c008:43a4:48d9:15a7:ce74:6546:c56b | {d395:c008:43a4:48d9:15a7:ce74:6546:c56b}\n d452:6fb9:f2b0:d387:80ca:47d5:330f:577  | {d452:6fb9:f2b0:d387:80ca:47d5:330f:577}\n d524:77db:2a21:e05b:68c4:575c:f04b:b0b7 | {d524:77db:2a21:e05b:68c4:575c:f04b:b0b7}\n d6d1:e96c:cd2f:8396:23f2:c96d:9376:54cb | {d6d1:e96c:cd2f:8396:23f2:c96d:9376:54cb}\n d76b:986d:d38b:252a:e6a2:254e:b0f7:db24 | {d76b:986d:d38b:252a:e6a2:254e:b0f7:db24}\n d9f3:2018:6aa2:7ee4:64be:e2d:c32c:2d15  | {d9f3:2018:6aa2:7ee4:64be:e2d:c32c:2d15}\n da3e:c57c:ccc8:edbf:f66e:85a5:e252:a3a4 | {da3e:c57c:ccc8:edbf:f66e:85a5:e252:a3a4}\n da52:3791:27b8:f773:7a59:1414:6d76:bd8a | {da52:3791:27b8:f773:7a59:1414:6d76:bd8a}\n da97:ecc5:bf17:1bb2:5710:f753:604c:7cf6 | {da97:ecc5:bf17:1bb2:5710:f753:604c:7cf6}\n dc61:8bf4:4b82:90a4:8af0:6a43:a917:14ee | {dc61:8bf4:4b82:90a4:8af0:6a43:a917:14ee}\n dd3b:ad95:1e55:a555:daae:8218:99d7:7bce | {dd3b:ad95:1e55:a555:daae:8218:99d7:7bce}\n defd:c729:62b4:8959:6ad1:7b1f:5835:8ffb | {defd:c729:62b4:8959:6ad1:7b1f:5835:8ffb}\n dfe2:c097:49ae:1d60:e3db:26c1:bb5d:c4e0 | {dfe2:c097:49ae:1d60:e3db:26c1:bb5d:c4e0}\n e11c:4f21:dd57:c814:af4e:3f55:4adf:f1a0 | {e11c:4f21:dd57:c814:af4e:3f55:4adf:f1a0}\n e199:2ea0:f3b4:3a31:5d15:dfc9:68cd:c948 | {e199:2ea0:f3b4:3a31:5d15:dfc9:68cd:c948}\n e57b:76e8:3f3a:3020:a22a:38b7:9c02:5db4 | {e57b:76e8:3f3a:3020:a22a:38b7:9c02:5db4}\n e6da:dc3c:a935:a718:4744:a216:84bd:cfa9 | {e6da:dc3c:a935:a718:4744:a216:84bd:cfa9}\n e7a7:adbe:d6de:41ba:a34f:d10b:46a7:a4cf | {e7a7:adbe:d6de:41ba:a34f:d10b:46a7:a4cf}\n e86d:edb4:8702:1774:c97d:cbee:394:a083  | {e86d:edb4:8702:1774:c97d:cbee:394:a083}\n e97f:c466:f346:cf67:23e4:bd36:72be:af44 | {e97f:c466:f346:cf67:23e4:bd36:72be:af44}\n ec36:7c6d:3077:267e:399a:d47:55a4:218a  | {ec36:7c6d:3077:267e:399a:d47:55a4:218a}\n ee1d:a078:25d4:94e3:9a89:707d:6fae:7573 | {ee1d:a078:25d4:94e3:9a89:707d:6fae:7573,ee34:9ba:9281:593c:ab74:57fa:e439:e0f3}\n ee34:9ba:9281:593c:ab74:57fa:e439:e0f3  | {ee1d:a078:25d4:94e3:9a89:707d:6fae:7573,ee34:9ba:9281:593c:ab74:57fa:e439:e0f3}\n ee76:e9ac:dd2:66c1:380:5f1e:1c4d:2867   | {ee76:e9ac:dd2:66c1:380:5f1e:1c4d:2867}\n eea0:9aef:71b:3cfd:e2ad:864c:41b8:938c  | {eea0:9aef:71b:3cfd:e2ad:864c:41b8:938c}\n ef15:3aa9:3c5b:b993:5209:a130:2d37:3a64 | {ef15:3aa9:3c5b:b993:5209:a130:2d37:3a64}\n ef9a:b980:e9:d50a:d867:8a88:2cae:8aa1   | {ef9a:b980:e9:d50a:d867:8a88:2cae:8aa1}\n effb:1a90:1dd5:e52c:1d7f:c716:3744:170a | {effb:1a90:1dd5:e52c:1d7f:c716:3744:170a}\n f0a1:e730:68b9:2e1c:649a:5450:a256:4665 | {f0a1:e730:68b9:2e1c:649a:5450:a256:4665}\n f3df:f155:d5c6:d664:c93c:13fa:9d77:6bf2 | {f3df:f155:d5c6:d664:c93c:13fa:9d77:6bf2}\n f499:668f:fbb8:f0dc:8e41:d43b:c025:26a  | {f499:668f:fbb8:f0dc:8e41:d43b:c025:26a}\n f57a:a3dc:3b11:f28a:8b25:8d5b:ec2f:c729 | {f57a:a3dc:3b11:f28a:8b25:8d5b:ec2f:c729}\n f7b8:dfc:496c:9718:ae3c:5c3e:b98a:4c5f  | {f7b8:dfc:496c:9718:ae3c:5c3e:b98a:4c5f}\n fa78:68ce:4fb1:d54c:2007:1820:ffe2:8235 | {fa78:68ce:4fb1:d54c:2007:1820:ffe2:8235}\n fbb6:2d70:42eb:55ab:6235:6867:2b3:8d47  | {fbb6:2d70:42eb:55ab:6235:6867:2b3:8d47}\n fcea:f739:a97d:cefc:49c4:b3c3:c7b4:99d6 | {fcea:f739:a97d:cefc:49c4:b3c3:c7b4:99d6}\n fda3:3e75:37c5:c1f:912b:5e32:6aa9:aeb2  | {fda3:3e75:37c5:c1f:912b:5e32:6aa9:aeb2}\n ff3d:7d5b:b0fe:c30:9e6c:23e0:7b5:e9de   | {ff3d:7d5b:b0fe:c30:9e6c:23e0:7b5:e9de}\n ff4a:cbbf:695a:9e46:f27c:e1be:861f:9e7  | {ff4a:cbbf:695a:9e46:f27c:e1be:861f:9e7,ff6b:af36:5fc2:93d9:ebf3:3c62:a19f:307f}\n ff6b:af36:5fc2:93d9:ebf3:3c62:a19f:307f | {ff4a:cbbf:695a:9e46:f27c:e1be:861f:9e7,ff6b:af36:5fc2:93d9:ebf3:3c62:a19f:307f}\n(256 rows)\n\nselect a6,\n       array_agg(a6) over (order by a6 range between ip6 '0010::' preceding and ip6 '0010::' following)\n  from ipaddrs\n where a6 is not null;\n                   a6                    |                                     array_agg                                     \n-----------------------------------------+-----------------------------------------------------------------------------------\n 73:3c34:57a:2a84:b1df:81b0:eb40:61cd    | {73:3c34:57a:2a84:b1df:81b0:eb40:61cd}\n b6:8ebc:c326:48a6:5615:a65e:e87a:25d7   | {b6:8ebc:c326:48a6:5615:a65e:e87a:25d7}\n 166:b8ea:1fc5:8913:17ea:d6a0:ac2b:90e1  | {166:b8ea:1fc5:8913:17ea:d6a0:ac2b:90e1}\n 227:b768:d43b:773d:6168:5133:867c:13f2  | {227:b768:d43b:773d:6168:5133:867c:13f2}\n 453:2d:fbd3:191:95c6:3751:eb62:e90      | {453:2d:fbd3:191:95c6:3751:eb62:e90}\n 4a6:7a28:b05b:f9b4:cc5b:9c4c:eefe:3e06  | {4a6:7a28:b05b:f9b4:cc5b:9c4c:eefe:3e06}\n 550:fe90:bd02:a3ed:35a2:3254:e280:cd20  | {550:fe90:bd02:a3ed:35a2:3254:e280:cd20}\n 75d:e701:5702:6087:a69a:1a2d:376e:4eb   | {75d:e701:5702:6087:a69a:1a2d:376e:4eb}\n 7e1:a608:dadd:684d:679e:698b:4db:c8c2   | {7e1:a608:dadd:684d:679e:698b:4db:c8c2}\n 9ec:8fec:9a0e:3f2a:66e2:9b5c:498a:1090  | {9ec:8fec:9a0e:3f2a:66e2:9b5c:498a:1090}\n a4b:4e55:7510:69b9:ba73:6550:eaa7:f16e  | {a4b:4e55:7510:69b9:ba73:6550:eaa7:f16e}\n bdb:15d3:fbaf:4bf6:194e:4d0d:4cb2:26c2  | {bdb:15d3:fbaf:4bf6:194e:4d0d:4cb2:26c2}\n cc6:3030:8e26:ed4a:ae48:4496:63c3:94d0  | {cc6:3030:8e26:ed4a:ae48:4496:63c3:94d0}\n ce0:f080:aff1:6780:4951:55a7:4c23:f108  | {ce0:f080:aff1:6780:4951:55a7:4c23:f108}\n d6b:f94a:4040:ba81:2347:d486:ac79:96f7  | {d6b:f94a:4040:ba81:2347:d486:ac79:96f7}\n d9a:933a:3c47:801a:51d4:5a48:13bb:f59b  | {d9a:933a:3c47:801a:51d4:5a48:13bb:f59b}\n ded:898a:e003:6046:72e6:5584:1012:62cc  | {ded:898a:e003:6046:72e6:5584:1012:62cc}\n f47:6def:21e4:4620:3bc:9abc:8abd:aba2   | {f47:6def:21e4:4620:3bc:9abc:8abd:aba2}\n 1009:d4ec:fe15:7946:eff2:6827:349e:6f0c | {1009:d4ec:fe15:7946:eff2:6827:349e:6f0c}\n 10a5:994f:884d:9f98:4920:408d:1504:561d | {10a5:994f:884d:9f98:4920:408d:1504:561d}\n 1378:f0c0:8ca:c76d:f062:4b7a:2573:5710  | {1378:f0c0:8ca:c76d:f062:4b7a:2573:5710}\n 1395:59cf:33f6:988:1cf8:5ef3:3c2f:64dc  | {1395:59cf:33f6:988:1cf8:5ef3:3c2f:64dc}\n 13d9:9e39:ff4a:875f:82a0:77bc:1559:cf8d | {13d9:9e39:ff4a:875f:82a0:77bc:1559:cf8d}\n 13fb:9738:a243:f879:730:2b72:783f:75e9  | {13fb:9738:a243:f879:730:2b72:783f:75e9}\n 14fd:6de8:95f:fade:a20c:81d3:98da:c560  | {14fd:6de8:95f:fade:a20c:81d3:98da:c560}\n 1520:c2bc:8426:2927:9e12:5f90:f4b0:30e6 | {1520:c2bc:8426:2927:9e12:5f90:f4b0:30e6}\n 163a:503e:a2d7:c0d8:f5ee:657e:7f23:ea52 | {163a:503e:a2d7:c0d8:f5ee:657e:7f23:ea52}\n 1685:dcd3:5113:5d84:2e64:d9e2:a602:aab7 | {1685:dcd3:5113:5d84:2e64:d9e2:a602:aab7}\n 1839:8d68:ec5f:a4e7:711d:124e:150b:cddf | {1839:8d68:ec5f:a4e7:711d:124e:150b:cddf}\n 1863:bf8e:aef5:1ac4:f85a:6683:8f7c:d191 | {1863:bf8e:aef5:1ac4:f85a:6683:8f7c:d191}\n 18e8:f97:72d0:5444:c94:99fe:4a9e:f657   | {18e8:f97:72d0:5444:c94:99fe:4a9e:f657,18eb:378d:f12f:6114:34d2:ce03:e0d8:cffc}\n 18eb:378d:f12f:6114:34d2:ce03:e0d8:cffc | {18e8:f97:72d0:5444:c94:99fe:4a9e:f657,18eb:378d:f12f:6114:34d2:ce03:e0d8:cffc}\n 1962:ff9f:665f:ba25:d25a:f530:a391:5ab7 | {1962:ff9f:665f:ba25:d25a:f530:a391:5ab7}\n 1b96:6d23:348f:a5f2:1869:1cd5:eff5:d09a | {1b96:6d23:348f:a5f2:1869:1cd5:eff5:d09a}\n 1bc2:3fea:257c:553e:eb87:d8c7:ef94:4c9  | {1bc2:3fea:257c:553e:eb87:d8c7:ef94:4c9}\n 1be9:3504:b341:17a8:10ec:e646:b0:433    | {1be9:3504:b341:17a8:10ec:e646:b0:433}\n 1c3e:17b6:1bfd:77ea:2185:9748:38d:ac80  | {1c3e:17b6:1bfd:77ea:2185:9748:38d:ac80}\n 1c90:5c1b:9431:11ea:f6dd:bb7c:c57f:6cc6 | {1c90:5c1b:9431:11ea:f6dd:bb7c:c57f:6cc6}\n 1cc5:18d6:116d:d727:86b:9655:f44d:4fb7  | {1cc5:18d6:116d:d727:86b:9655:f44d:4fb7}\n 1dbf:c6d8:ce1a:e3e3:c9a2:8458:3674:f6b  | {1dbf:c6d8:ce1a:e3e3:c9a2:8458:3674:f6b}\n 1f38:cd00:b368:80e5:7579:df75:3c50:b21b | {1f38:cd00:b368:80e5:7579:df75:3c50:b21b}\n 204f:510d:e7e9:9c02:9576:48b1:bfb7:468  | {204f:510d:e7e9:9c02:9576:48b1:bfb7:468}\n 21ef:74a4:2571:e430:47b1:a582:9723:9b14 | {21ef:74a4:2571:e430:47b1:a582:9723:9b14}\n 2394:74d2:f34d:3801:3a23:f022:dc17:2cf  | {2394:74d2:f34d:3801:3a23:f022:dc17:2cf}\n 23fd:5d2:8e6a:628:b4e:3ff2:d386:d2b0    | {23fd:5d2:8e6a:628:b4e:3ff2:d386:d2b0,2408:f23d:d1ac:746d:2c8f:3dd6:7ed0:5507}\n 2408:f23d:d1ac:746d:2c8f:3dd6:7ed0:5507 | {23fd:5d2:8e6a:628:b4e:3ff2:d386:d2b0,2408:f23d:d1ac:746d:2c8f:3dd6:7ed0:5507}\n 25d9:67f6:f409:c774:60ad:9d6a:b95b:4ad2 | {25d9:67f6:f409:c774:60ad:9d6a:b95b:4ad2}\n 25f0:72d:e515:bc9b:f9a2:6061:b18b:758e  | {25f0:72d:e515:bc9b:f9a2:6061:b18b:758e}\n 2689:eae5:4101:f97c:628a:58fa:f0b5:159  | {2689:eae5:4101:f97c:628a:58fa:f0b5:159}\n 26a3:7ac5:3ce2:cb2d:994d:8f10:82b6:419d | {26a3:7ac5:3ce2:cb2d:994d:8f10:82b6:419d,26ad:4d5b:192c:f85a:71db:38be:c6ca:19de}\n 26ad:4d5b:192c:f85a:71db:38be:c6ca:19de | {26a3:7ac5:3ce2:cb2d:994d:8f10:82b6:419d,26ad:4d5b:192c:f85a:71db:38be:c6ca:19de}\n 28a6:2032:8a38:de85:f6f3:47bd:5124:7dc8 | {28a6:2032:8a38:de85:f6f3:47bd:5124:7dc8}\n 28e7:4441:e0a4:bf30:4cf4:edb0:638d:ad72 | {28e7:4441:e0a4:bf30:4cf4:edb0:638d:ad72}\n 29a4:a288:457e:57a9:bbb3:2a76:b117:b1e8 | {29a4:a288:457e:57a9:bbb3:2a76:b117:b1e8,29b2:d3c1:26c4:86b6:19b5:14dc:ab2d:bc67}\n 29b2:d3c1:26c4:86b6:19b5:14dc:ab2d:bc67 | {29a4:a288:457e:57a9:bbb3:2a76:b117:b1e8,29b2:d3c1:26c4:86b6:19b5:14dc:ab2d:bc67}\n 2a8a:5b38:cbdd:5d1c:e1b0:d627:f31f:285a | {2a8a:5b38:cbdd:5d1c:e1b0:d627:f31f:285a}\n 2b47:da0e:8c52:cc33:afaa:f85f:f143:88c6 | {2b47:da0e:8c52:cc33:afaa:f85f:f143:88c6}\n 2ee9:6428:5482:9721:9e51:ca52:ba3:99eb  | {2ee9:6428:5482:9721:9e51:ca52:ba3:99eb}\n 2f48:4d4b:443c:6de6:9cbe:9766:fd5:c88b  | {2f48:4d4b:443c:6de6:9cbe:9766:fd5:c88b}\n 2ff2:b6b6:ffd1:dc5f:fc2:defe:fd16:a414  | {2ff2:b6b6:ffd1:dc5f:fc2:defe:fd16:a414}\n 3138:9022:3412:4cfb:fc2a:729a:651c:40f9 | {3138:9022:3412:4cfb:fc2a:729a:651c:40f9}\n 318f:1162:8f48:3397:cb9a:f54e:f1e8:d05d | {318f:1162:8f48:3397:cb9a:f54e:f1e8:d05d}\n 32ca:6639:c07e:c474:fa11:c83:2886:516c  | {32ca:6639:c07e:c474:fa11:c83:2886:516c}\n 35f1:eb03:921c:f397:cd41:9201:f7e0:dfad | {35f1:eb03:921c:f397:cd41:9201:f7e0:dfad,35f3:d696:b49e:1a25:375:5e28:15c9:96ce}\n 35f3:d696:b49e:1a25:375:5e28:15c9:96ce  | {35f1:eb03:921c:f397:cd41:9201:f7e0:dfad,35f3:d696:b49e:1a25:375:5e28:15c9:96ce}\n 3902:4c48:d872:37bd:2e53:678d:3a0a:3cf6 | {3902:4c48:d872:37bd:2e53:678d:3a0a:3cf6,390b:b7a:6606:af43:233b:2e27:8336:5b2e}\n 390b:b7a:6606:af43:233b:2e27:8336:5b2e  | {3902:4c48:d872:37bd:2e53:678d:3a0a:3cf6,390b:b7a:6606:af43:233b:2e27:8336:5b2e}\n 39ec:d6ba:1f45:64d0:f4d2:3f0f:78e:a404  | {39ec:d6ba:1f45:64d0:f4d2:3f0f:78e:a404}\n 3af7:2de9:30a7:818d:9715:3eaf:d8f7:2583 | {3af7:2de9:30a7:818d:9715:3eaf:d8f7:2583}\n 3b13:802b:cfd:15ef:bab3:f337:8b00:5744  | {3b13:802b:cfd:15ef:bab3:f337:8b00:5744}\n 3bc9:de98:c700:5aa:d993:223e:dad:1949   | {3bc9:de98:c700:5aa:d993:223e:dad:1949}\n 4068:6d06:7463:589:3262:86d1:f1f1:f088  | {4068:6d06:7463:589:3262:86d1:f1f1:f088}\n 4111:e35f:ce3:c4de:dc4e:8764:8cd:1686   | {4111:e35f:ce3:c4de:dc4e:8764:8cd:1686}\n 4131:d8b6:82af:797d:25fd:7bd4:b94d:ce34 | {4131:d8b6:82af:797d:25fd:7bd4:b94d:ce34}\n 42e2:d76f:c784:7a61:67c1:b931:6f49:32c5 | {42e2:d76f:c784:7a61:67c1:b931:6f49:32c5}\n 4430:8b98:82c8:3d6c:dbd6:579e:c3fc:ec9d | {4430:8b98:82c8:3d6c:dbd6:579e:c3fc:ec9d,4439:44b6:c04:de6a:c0af:cf35:d9f3:f8ee}\n 4439:44b6:c04:de6a:c0af:cf35:d9f3:f8ee  | {4430:8b98:82c8:3d6c:dbd6:579e:c3fc:ec9d,4439:44b6:c04:de6a:c0af:cf35:d9f3:f8ee}\n 450b:493b:a4d7:f0d3:6fe4:6da0:b550:f4ca | {450b:493b:a4d7:f0d3:6fe4:6da0:b550:f4ca}\n 454c:20ee:35b9:b48b:a59f:e4bc:7b76:f228 | {454c:20ee:35b9:b48b:a59f:e4bc:7b76:f228,454e:bfa0:ed21:4983:7572:22c9:413d:d4db}\n 454e:bfa0:ed21:4983:7572:22c9:413d:d4db | {454c:20ee:35b9:b48b:a59f:e4bc:7b76:f228,454e:bfa0:ed21:4983:7572:22c9:413d:d4db}\n 4620:c642:9985:6a1f:6c66:50c0:2108:10d3 | {4620:c642:9985:6a1f:6c66:50c0:2108:10d3}\n 4647:353:5292:8bef:e5b5:c13a:1176:deef  | {4647:353:5292:8bef:e5b5:c13a:1176:deef}\n 4bd6:2076:745e:acbe:c511:3786:60be:b51d | {4bd6:2076:745e:acbe:c511:3786:60be:b51d}\n 4d6a:edd6:a446:6d89:e2a3:ab27:79ec:e148 | {4d6a:edd6:a446:6d89:e2a3:ab27:79ec:e148}\n 4ee3:bfaa:5f22:2c05:573e:e87c:a6c2:81e0 | {4ee3:bfaa:5f22:2c05:573e:e87c:a6c2:81e0}\n 53ad:31ab:bc5e:c535:bc7c:5762:c11e:fcec | {53ad:31ab:bc5e:c535:bc7c:5762:c11e:fcec}\n 53d6:7f94:6b26:59cb:9c16:2aa:9722:b8ef  | {53d6:7f94:6b26:59cb:9c16:2aa:9722:b8ef}\n 5412:a54d:dbd8:8448:4728:5fb0:ec6f:4381 | {5412:a54d:dbd8:8448:4728:5fb0:ec6f:4381}\n 5466:93e3:8343:3686:394:778:79ac:772    | {5466:93e3:8343:3686:394:778:79ac:772}\n 54b6:4a85:c1a5:89b0:b7ff:5306:32be:d30f | {54b6:4a85:c1a5:89b0:b7ff:5306:32be:d30f}\n 5637:5e57:c050:53fe:e182:697:ab46:21cc  | {5637:5e57:c050:53fe:e182:697:ab46:21cc}\n 56fd:83db:3ff7:b0b:7d5:8378:a486:f20    | {56fd:83db:3ff7:b0b:7d5:8378:a486:f20}\n 5721:3c79:a6ff:c8d8:5e3:c785:808:e40    | {5721:3c79:a6ff:c8d8:5e3:c785:808:e40}\n 5889:8398:cb90:8df:b3d6:3f5c:72cb:cd64  | {5889:8398:cb90:8df:b3d6:3f5c:72cb:cd64}\n 599b:9e01:9a22:aebf:a731:ce57:fefb:8ed  | {599b:9e01:9a22:aebf:a731:ce57:fefb:8ed}\n 5a0b:33a9:3407:aa9c:f1c7:a538:2f25:bf14 | {5a0b:33a9:3407:aa9c:f1c7:a538:2f25:bf14}\n 5a3f:b436:785f:32a4:8c86:13f8:e682:8b6a | {5a3f:b436:785f:32a4:8c86:13f8:e682:8b6a}\n 5d63:9613:7b87:5c26:5c80:bbd3:14b5:1e63 | {5d63:9613:7b87:5c26:5c80:bbd3:14b5:1e63}\n 5e52:9aa9:8f83:2a67:5959:720d:f6ba:5d42 | {5e52:9aa9:8f83:2a67:5959:720d:f6ba:5d42}\n 5ee2:4fab:1073:b2f5:61c1:eea6:302f:685  | {5ee2:4fab:1073:b2f5:61c1:eea6:302f:685}\n 5fa8:25bb:15e8:5b35:758c:2044:d194:1962 | {5fa8:25bb:15e8:5b35:758c:2044:d194:1962}\n 61f2:afe0:d1af:18e9:5d40:7a4d:f112:2d09 | {61f2:afe0:d1af:18e9:5d40:7a4d:f112:2d09}\n 6251:ab4b:3b37:d71f:6b5f:1b2d:bd55:3a3c | {6251:ab4b:3b37:d71f:6b5f:1b2d:bd55:3a3c}\n 62b8:256d:637a:82bf:3b69:420:eea5:300b  | {62b8:256d:637a:82bf:3b69:420:eea5:300b}\n 62db:eab9:a54e:3cea:46f3:b7c2:cb9c:6e5d | {62db:eab9:a54e:3cea:46f3:b7c2:cb9c:6e5d}\n 6656:e87d:865c:3237:8d42:ff01:a82b:f308 | {6656:e87d:865c:3237:8d42:ff01:a82b:f308}\n 6a93:ccd3:5002:233f:1c5f:400e:601c:75a  | {6a93:ccd3:5002:233f:1c5f:400e:601c:75a}\n 6b0c:4791:ccea:c286:437e:d268:87ef:b6ad | {6b0c:4791:ccea:c286:437e:d268:87ef:b6ad}\n 6e1b:5e9c:f623:6134:7754:fdac:323a:dba2 | {6e1b:5e9c:f623:6134:7754:fdac:323a:dba2}\n 6e81:4a6a:d383:140d:8416:c09b:af3b:5b45 | {6e81:4a6a:d383:140d:8416:c09b:af3b:5b45}\n 6e9d:66e:27c5:c7c4:aefe:ecfc:6568:ccf   | {6e9d:66e:27c5:c7c4:aefe:ecfc:6568:ccf}\n 6ff2:94f5:5755:164d:1301:28ce:8a04:eac0 | {6ff2:94f5:5755:164d:1301:28ce:8a04:eac0}\n 72c4:104f:960c:baf1:8ef7:60d2:c58:8b03  | {72c4:104f:960c:baf1:8ef7:60d2:c58:8b03}\n 7341:d21f:e576:f226:f690:a99c:6b55:9933 | {7341:d21f:e576:f226:f690:a99c:6b55:9933}\n 739b:8093:31c6:a42f:a604:d5cb:1350:2d2f | {739b:8093:31c6:a42f:a604:d5cb:1350:2d2f}\n 7524:1f76:fe52:991e:667b:a302:dfd5:dbd6 | {7524:1f76:fe52:991e:667b:a302:dfd5:dbd6}\n 7608:50bf:a29a:6805:c760:9ae3:1216:8e4a | {7608:50bf:a29a:6805:c760:9ae3:1216:8e4a}\n 78c8:1cde:4b95:55d8:b211:a95d:37e0:7d92 | {78c8:1cde:4b95:55d8:b211:a95d:37e0:7d92}\n 7924:9e5b:2c7:3920:9c9f:bfb6:369d:fa4f  | {7924:9e5b:2c7:3920:9c9f:bfb6:369d:fa4f}\n 798f:ea8:61f6:5d79:1656:d8d8:9b6e:57f0  | {798f:ea8:61f6:5d79:1656:d8d8:9b6e:57f0}\n 79c9:d301:92cd:c774:abbb:2f7d:92c3:3ccd | {79c9:d301:92cd:c774:abbb:2f7d:92c3:3ccd}\n 79eb:6133:5173:8f43:87d4:cb1d:906b:e8c9 | {79eb:6133:5173:8f43:87d4:cb1d:906b:e8c9}\n 7cba:a835:f850:6409:dba7:1300:f2b8:1db3 | {7cba:a835:f850:6409:dba7:1300:f2b8:1db3}\n 7cdf:1ed8:690e:9e54:6f39:613e:f187:8ef2 | {7cdf:1ed8:690e:9e54:6f39:613e:f187:8ef2}\n 7dcc:877b:8e07:aeb4:d891:581e:c10c:af54 | {7dcc:877b:8e07:aeb4:d891:581e:c10c:af54}\n 7e1f:eb76:49c9:39f8:deb9:c447:b40c:a13d | {7e1f:eb76:49c9:39f8:deb9:c447:b40c:a13d}\n 7ec8:2b00:5994:7f0f:d765:5e16:c274:5645 | {7ec8:2b00:5994:7f0f:d765:5e16:c274:5645}\n 7f3d:d8ea:7a7c:8700:5b81:412f:c33a:d6ba | {7f3d:d8ea:7a7c:8700:5b81:412f:c33a:d6ba}\n 7fa2:dbdb:e889:e24b:4d30:962e:89f3:676f | {7fa2:dbdb:e889:e24b:4d30:962e:89f3:676f}\n 8119:1220:b888:3d8a:1250:ce77:b2b9:bdcd | {8119:1220:b888:3d8a:1250:ce77:b2b9:bdcd}\n 8129:3e9c:70ff:1df1:f26f:86aa:c7ba:8245 | {8129:3e9c:70ff:1df1:f26f:86aa:c7ba:8245}\n 8172:4609:d700:5bd2:24a2:8f78:f1cc:c1a0 | {8172:4609:d700:5bd2:24a2:8f78:f1cc:c1a0}\n 8241:abe3:7537:de41:ef5a:7d2a:9e57:833b | {8241:abe3:7537:de41:ef5a:7d2a:9e57:833b}\n 828e:fa1d:9bb1:ad4c:4874:9da8:40bf:25b5 | {828e:fa1d:9bb1:ad4c:4874:9da8:40bf:25b5,8298:9399:271f:a3fe:270c:21cf:7c34:7340}\n 8298:9399:271f:a3fe:270c:21cf:7c34:7340 | {828e:fa1d:9bb1:ad4c:4874:9da8:40bf:25b5,8298:9399:271f:a3fe:270c:21cf:7c34:7340}\n 82ed:ac69:4ea7:5301:b005:3e17:f541:4fbc | {82ed:ac69:4ea7:5301:b005:3e17:f541:4fbc}\n 8357:a24:2f6e:f909:3853:899a:68af:b48   | {8357:a24:2f6e:f909:3853:899a:68af:b48}\n 8474:e00a:5b49:6e2a:5074:ecd5:cece:7dad | {8474:e00a:5b49:6e2a:5074:ecd5:cece:7dad}\n 84fe:7351:7b39:349e:1bb7:e333:daec:141a | {84fe:7351:7b39:349e:1bb7:e333:daec:141a}\n 8586:595:7bdd:359b:2fd9:1ffa:49ef:a947  | {8586:595:7bdd:359b:2fd9:1ffa:49ef:a947}\n 86fa:3a3:6a26:5ce3:fd8d:6267:b3c:4bf0   | {86fa:3a3:6a26:5ce3:fd8d:6267:b3c:4bf0}\n 874b:a74e:e292:c13:cf80:778c:35b4:d37c  | {874b:a74e:e292:c13:cf80:778c:35b4:d37c}\n 88bb:cf40:1f19:c897:f001:2d56:8f4f:ac68 | {88bb:cf40:1f19:c897:f001:2d56:8f4f:ac68}\n 8909:5e3:cff9:483c:1fb7:2ee2:ab05:222a  | {8909:5e3:cff9:483c:1fb7:2ee2:ab05:222a,890b:aa44:e2b1:ff61:eb7a:c4df:5a25:2eaf}\n 890b:aa44:e2b1:ff61:eb7a:c4df:5a25:2eaf | {8909:5e3:cff9:483c:1fb7:2ee2:ab05:222a,890b:aa44:e2b1:ff61:eb7a:c4df:5a25:2eaf}\n 8a1f:674e:63cd:f241:8f53:aec9:d8db:8e5c | {8a1f:674e:63cd:f241:8f53:aec9:d8db:8e5c}\n 8b0c:b103:3302:90bb:bac:809e:9c7d:3569  | {8b0c:b103:3302:90bb:bac:809e:9c7d:3569}\n 8b61:6b31:d02c:87d3:22cf:f01c:c045:b822 | {8b61:6b31:d02c:87d3:22cf:f01c:c045:b822}\n 8b87:864a:8e83:6783:c552:cb07:8e96:c0e5 | {8b87:864a:8e83:6783:c552:cb07:8e96:c0e5}\n 8c86:2c19:c38d:626b:b5a4:e0cb:bbaf:476b | {8c86:2c19:c38d:626b:b5a4:e0cb:bbaf:476b}\n 8ec2:3493:ad95:cb7e:ae1c:8c2c:6a34:eccb | {8ec2:3493:ad95:cb7e:ae1c:8c2c:6a34:eccb,8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1}\n 8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1 | {8ec2:3493:ad95:cb7e:ae1c:8c2c:6a34:eccb,8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1}\n 8f7a:5e8b:f526:a8ba:8c6f:3cae:7b7e:1a5  | {8f7a:5e8b:f526:a8ba:8c6f:3cae:7b7e:1a5}\n 8fa1:e604:6ad4:c318:ba8f:eaec:76be:ad4b | {8fa1:e604:6ad4:c318:ba8f:eaec:76be:ad4b,8fac:3b7e:463d:1b38:2f59:6fdf:3bef:4aaf}\n 8fac:3b7e:463d:1b38:2f59:6fdf:3bef:4aaf | {8fa1:e604:6ad4:c318:ba8f:eaec:76be:ad4b,8fac:3b7e:463d:1b38:2f59:6fdf:3bef:4aaf}\n 933f:d5b:d307:c3e0:5e0:b947:1cb5:6928   | {933f:d5b:d307:c3e0:5e0:b947:1cb5:6928}\n 9520:88f9:9498:8a73:ac7a:dc77:4495:3dfc | {9520:88f9:9498:8a73:ac7a:dc77:4495:3dfc}\n 9631:3557:7591:6ade:1882:6dad:8413:c3b3 | {9631:3557:7591:6ade:1882:6dad:8413:c3b3}\n 977b:de6f:3ef9:3cad:fb02:fb07:458c:e88e | {977b:de6f:3ef9:3cad:fb02:fb07:458c:e88e}\n 982a:e6d8:49bc:49a7:80b:4417:45f7:4fb7  | {982a:e6d8:49bc:49a7:80b:4417:45f7:4fb7}\n 9943:4095:cf6c:bf1d:f1b4:7883:f929:a315 | {9943:4095:cf6c:bf1d:f1b4:7883:f929:a315}\n 99b7:bba0:206c:6042:6778:2f3b:9a:6393   | {99b7:bba0:206c:6042:6778:2f3b:9a:6393}\n 9b3d:56d7:b18e:21b9:7448:3cea:2ec:77f8  | {9b3d:56d7:b18e:21b9:7448:3cea:2ec:77f8}\n 9c51:8c1b:a051:a87e:c65a:cc8:a38e:4953  | {9c51:8c1b:a051:a87e:c65a:cc8:a38e:4953}\n 9d35:9c4f:517d:2391:f59c:af03:1681:6d9b | {9d35:9c4f:517d:2391:f59c:af03:1681:6d9b}\n 9da1:e3ce:660a:cde4:7576:554:55cc:38ad  | {9da1:e3ce:660a:cde4:7576:554:55cc:38ad}\n 9ee9:65bd:81d2:b2c6:c3c4:b36b:16a2:fc9e | {9ee9:65bd:81d2:b2c6:c3c4:b36b:16a2:fc9e}\n a0d3:f0b5:7a50:2d3e:923e:3832:76c0:b15d | {a0d3:f0b5:7a50:2d3e:923e:3832:76c0:b15d}\n a252:248:a123:3287:680f:a67c:2fcd:b2a0  | {a252:248:a123:3287:680f:a67c:2fcd:b2a0}\n a300:d184:bf44:e8f1:4a80:723c:909:f178  | {a300:d184:bf44:e8f1:4a80:723c:909:f178}\n a335:f1a7:be5c:b341:5325:e8d3:2631:74ae | {a335:f1a7:be5c:b341:5325:e8d3:2631:74ae}\n a42d:662e:1816:1fe3:a392:9190:7d4e:f418 | {a42d:662e:1816:1fe3:a392:9190:7d4e:f418}\n a52f:f73a:413e:a43a:5000:cd8f:ef1f:3603 | {a52f:f73a:413e:a43a:5000:cd8f:ef1f:3603}\n a75b:c708:8e74:b252:f8e8:7269:c214:dc07 | {a75b:c708:8e74:b252:f8e8:7269:c214:dc07}\n a87b:8920:6e0:9c1b:92a8:3a1e:f074:1ee2  | {a87b:8920:6e0:9c1b:92a8:3a1e:f074:1ee2,a884:9796:ca7c:ec37:9cb4:4158:ce4c:ced5}\n a884:9796:ca7c:ec37:9cb4:4158:ce4c:ced5 | {a87b:8920:6e0:9c1b:92a8:3a1e:f074:1ee2,a884:9796:ca7c:ec37:9cb4:4158:ce4c:ced5}\n a9e9:74a5:864a:dfeb:a5f0:4424:d294:95a1 | {a9e9:74a5:864a:dfeb:a5f0:4424:d294:95a1}\n ac4c:23a6:9c5f:8a2a:ccfc:ea69:48cd:dffc | {ac4c:23a6:9c5f:8a2a:ccfc:ea69:48cd:dffc}\n ac71:fd2c:4352:c28a:2f4b:3cd1:4d6f:927b | {ac71:fd2c:4352:c28a:2f4b:3cd1:4d6f:927b}\n ad73:992f:b3d8:31f7:306d:a418:fdcf:3e60 | {ad73:992f:b3d8:31f7:306d:a418:fdcf:3e60}\n ae64:d6a3:11d7:b6bc:aa3:60c6:b16f:4305  | {ae64:d6a3:11d7:b6bc:aa3:60c6:b16f:4305}\n af5a:6507:2c50:f0a8:b211:fc0d:425e:bd47 | {af5a:6507:2c50:f0a8:b211:fc0d:425e:bd47}\n afeb:a771:735e:1a18:9297:e9f4:2e53:c5e1 | {afeb:a771:735e:1a18:9297:e9f4:2e53:c5e1}\n b105:5518:a963:9a0a:d10d:b42b:dfd1:96a2 | {b105:5518:a963:9a0a:d10d:b42b:dfd1:96a2,b113:66f:e222:f032:7161:1f27:b080:2111}\n b113:66f:e222:f032:7161:1f27:b080:2111  | {b105:5518:a963:9a0a:d10d:b42b:dfd1:96a2,b113:66f:e222:f032:7161:1f27:b080:2111}\n b218:c6f2:4929:7d70:8b4d:5458:fc85:d0fc | {b218:c6f2:4929:7d70:8b4d:5458:fc85:d0fc}\n b237:dac3:62d7:725e:d772:c88c:af71:cec5 | {b237:dac3:62d7:725e:d772:c88c:af71:cec5}\n b310:3d72:ea86:6ee:45fc:d57f:4a7a:bb43  | {b310:3d72:ea86:6ee:45fc:d57f:4a7a:bb43}\n b3da:187b:cc2e:3c78:e060:aab6:63cb:1780 | {b3da:187b:cc2e:3c78:e060:aab6:63cb:1780}\n b408:9874:22a3:9f56:35f:cfd1:b00:ddac   | {b408:9874:22a3:9f56:35f:cfd1:b00:ddac}\n b48c:eccb:32f4:2b4:e2ee:e787:a16f:8647  | {b48c:eccb:32f4:2b4:e2ee:e787:a16f:8647}\n b8ef:17e2:febe:431d:9d8c:88c6:6604:a678 | {b8ef:17e2:febe:431d:9d8c:88c6:6604:a678}\n ba0d:d2d4:b5e3:573f:98f4:98e:aac1:47fa  | {ba0d:d2d4:b5e3:573f:98f4:98e:aac1:47fa}\n baf9:2948:a8a1:8865:912a:839f:45e8:78d3 | {baf9:2948:a8a1:8865:912a:839f:45e8:78d3}\n bb1b:6a20:8513:14e4:5fc6:c0e9:17df:9c0  | {bb1b:6a20:8513:14e4:5fc6:c0e9:17df:9c0}\n bc1d:d3ba:50da:14d3:f496:6847:3b91:2830 | {bc1d:d3ba:50da:14d3:f496:6847:3b91:2830}\n bc52:8171:9377:d593:1c0a:75e4:e2d:5e1a  | {bc52:8171:9377:d593:1c0a:75e4:e2d:5e1a}\n bd6f:44b9:45d3:529f:84c7:612:b25c:aaf8  | {bd6f:44b9:45d3:529f:84c7:612:b25c:aaf8}\n bdc5:94f5:8249:7120:8132:ca25:d3fc:c394 | {bdc5:94f5:8249:7120:8132:ca25:d3fc:c394}\n c0fc:f3ee:3707:19dc:62c1:5c9a:df3d:1b58 | {c0fc:f3ee:3707:19dc:62c1:5c9a:df3d:1b58}\n c2e3:4cea:30dd:cb39:c5a0:86e7:8b05:3f7  | {c2e3:4cea:30dd:cb39:c5a0:86e7:8b05:3f7}\n c36f:f4fd:4853:a07c:c25d:349f:3af4:3432 | {c36f:f4fd:4853:a07c:c25d:349f:3af4:3432}\n c504:481e:2756:3ca2:f0c:a26a:4e64:7804  | {c504:481e:2756:3ca2:f0c:a26a:4e64:7804}\n c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d | {c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d}\n c8c0:5117:331a:f029:8d24:6775:fe7d:5976 | {c8c0:5117:331a:f029:8d24:6775:fe7d:5976}\n c963:10d0:1586:d1d4:79bc:d7af:5486:43e5 | {c963:10d0:1586:d1d4:79bc:d7af:5486:43e5}\n c99c:bd43:6161:d17d:2fdd:ab61:922:ba62  | {c99c:bd43:6161:d17d:2fdd:ab61:922:ba62}\n cb2f:b8da:ba34:1c5c:4839:710a:f75b:bdd0 | {cb2f:b8da:ba34:1c5c:4839:710a:f75b:bdd0}\n cb70:a0cc:6919:db7f:8fc8:cb69:6fcc:5f5b | {cb70:a0cc:6919:db7f:8fc8:cb69:6fcc:5f5b}\n cc17:3814:d80f:41a1:1309:35d3:ea0a:d31e | {cc17:3814:d80f:41a1:1309:35d3:ea0a:d31e}\n ce47:e5eb:41f3:23af:6209:5ade:82ce:3b00 | {ce47:e5eb:41f3:23af:6209:5ade:82ce:3b00}\n cfb9:d37e:2427:af8d:b728:8f90:f54c:9141 | {cfb9:d37e:2427:af8d:b728:8f90:f54c:9141}\n d066:f25b:e8a5:4ae6:4c99:2a98:8cb7:2530 | {d066:f25b:e8a5:4ae6:4c99:2a98:8cb7:2530}\n d105:1597:c912:51c7:e5b6:f628:cae:1d0f  | {d105:1597:c912:51c7:e5b6:f628:cae:1d0f}\n d2de:7aa1:975:e510:dfa1:2a3:89bc:eedb   | {d2de:7aa1:975:e510:dfa1:2a3:89bc:eedb}\n d33e:e847:b4c6:d5ca:f75:216b:342c:3d04  | {d33e:e847:b4c6:d5ca:f75:216b:342c:3d04}\n d395:c008:43a4:48d9:15a7:ce74:6546:c56b | {d395:c008:43a4:48d9:15a7:ce74:6546:c56b}\n d452:6fb9:f2b0:d387:80ca:47d5:330f:577  | {d452:6fb9:f2b0:d387:80ca:47d5:330f:577}\n d524:77db:2a21:e05b:68c4:575c:f04b:b0b7 | {d524:77db:2a21:e05b:68c4:575c:f04b:b0b7}\n d6d1:e96c:cd2f:8396:23f2:c96d:9376:54cb | {d6d1:e96c:cd2f:8396:23f2:c96d:9376:54cb}\n d76b:986d:d38b:252a:e6a2:254e:b0f7:db24 | {d76b:986d:d38b:252a:e6a2:254e:b0f7:db24}\n d9f3:2018:6aa2:7ee4:64be:e2d:c32c:2d15  | {d9f3:2018:6aa2:7ee4:64be:e2d:c32c:2d15}\n da3e:c57c:ccc8:edbf:f66e:85a5:e252:a3a4 | {da3e:c57c:ccc8:edbf:f66e:85a5:e252:a3a4}\n da52:3791:27b8:f773:7a59:1414:6d76:bd8a | {da52:3791:27b8:f773:7a59:1414:6d76:bd8a}\n da97:ecc5:bf17:1bb2:5710:f753:604c:7cf6 | {da97:ecc5:bf17:1bb2:5710:f753:604c:7cf6}\n dc61:8bf4:4b82:90a4:8af0:6a43:a917:14ee | {dc61:8bf4:4b82:90a4:8af0:6a43:a917:14ee}\n dd3b:ad95:1e55:a555:daae:8218:99d7:7bce | {dd3b:ad95:1e55:a555:daae:8218:99d7:7bce}\n defd:c729:62b4:8959:6ad1:7b1f:5835:8ffb | {defd:c729:62b4:8959:6ad1:7b1f:5835:8ffb}\n dfe2:c097:49ae:1d60:e3db:26c1:bb5d:c4e0 | {dfe2:c097:49ae:1d60:e3db:26c1:bb5d:c4e0}\n e11c:4f21:dd57:c814:af4e:3f55:4adf:f1a0 | {e11c:4f21:dd57:c814:af4e:3f55:4adf:f1a0}\n e199:2ea0:f3b4:3a31:5d15:dfc9:68cd:c948 | {e199:2ea0:f3b4:3a31:5d15:dfc9:68cd:c948}\n e57b:76e8:3f3a:3020:a22a:38b7:9c02:5db4 | {e57b:76e8:3f3a:3020:a22a:38b7:9c02:5db4}\n e6da:dc3c:a935:a718:4744:a216:84bd:cfa9 | {e6da:dc3c:a935:a718:4744:a216:84bd:cfa9}\n e7a7:adbe:d6de:41ba:a34f:d10b:46a7:a4cf | {e7a7:adbe:d6de:41ba:a34f:d10b:46a7:a4cf}\n e86d:edb4:8702:1774:c97d:cbee:394:a083  | {e86d:edb4:8702:1774:c97d:cbee:394:a083}\n e97f:c466:f346:cf67:23e4:bd36:72be:af44 | {e97f:c466:f346:cf67:23e4:bd36:72be:af44}\n ec36:7c6d:3077:267e:399a:d47:55a4:218a  | {ec36:7c6d:3077:267e:399a:d47:55a4:218a}\n ee1d:a078:25d4:94e3:9a89:707d:6fae:7573 | {ee1d:a078:25d4:94e3:9a89:707d:6fae:7573}\n ee34:9ba:9281:593c:ab74:57fa:e439:e0f3  | {ee34:9ba:9281:593c:ab74:57fa:e439:e0f3}\n ee76:e9ac:dd2:66c1:380:5f1e:1c4d:2867   | {ee76:e9ac:dd2:66c1:380:5f1e:1c4d:2867}\n eea0:9aef:71b:3cfd:e2ad:864c:41b8:938c  | {eea0:9aef:71b:3cfd:e2ad:864c:41b8:938c}\n ef15:3aa9:3c5b:b993:5209:a130:2d37:3a64 | {ef15:3aa9:3c5b:b993:5209:a130:2d37:3a64}\n ef9a:b980:e9:d50a:d867:8a88:2cae:8aa1   | {ef9a:b980:e9:d50a:d867:8a88:2cae:8aa1}\n effb:1a90:1dd5:e52c:1d7f:c716:3744:170a | {effb:1a90:1dd5:e52c:1d7f:c716:3744:170a}\n f0a1:e730:68b9:2e1c:649a:5450:a256:4665 | {f0a1:e730:68b9:2e1c:649a:5450:a256:4665}\n f3df:f155:d5c6:d664:c93c:13fa:9d77:6bf2 | {f3df:f155:d5c6:d664:c93c:13fa:9d77:6bf2}\n f499:668f:fbb8:f0dc:8e41:d43b:c025:26a  | {f499:668f:fbb8:f0dc:8e41:d43b:c025:26a}\n f57a:a3dc:3b11:f28a:8b25:8d5b:ec2f:c729 | {f57a:a3dc:3b11:f28a:8b25:8d5b:ec2f:c729}\n f7b8:dfc:496c:9718:ae3c:5c3e:b98a:4c5f  | {f7b8:dfc:496c:9718:ae3c:5c3e:b98a:4c5f}\n fa78:68ce:4fb1:d54c:2007:1820:ffe2:8235 | {fa78:68ce:4fb1:d54c:2007:1820:ffe2:8235}\n fbb6:2d70:42eb:55ab:6235:6867:2b3:8d47  | {fbb6:2d70:42eb:55ab:6235:6867:2b3:8d47}\n fcea:f739:a97d:cefc:49c4:b3c3:c7b4:99d6 | {fcea:f739:a97d:cefc:49c4:b3c3:c7b4:99d6}\n fda3:3e75:37c5:c1f:912b:5e32:6aa9:aeb2  | {fda3:3e75:37c5:c1f:912b:5e32:6aa9:aeb2}\n ff3d:7d5b:b0fe:c30:9e6c:23e0:7b5:e9de   | {ff3d:7d5b:b0fe:c30:9e6c:23e0:7b5:e9de,ff4a:cbbf:695a:9e46:f27c:e1be:861f:9e7}\n ff4a:cbbf:695a:9e46:f27c:e1be:861f:9e7  | {ff3d:7d5b:b0fe:c30:9e6c:23e0:7b5:e9de,ff4a:cbbf:695a:9e46:f27c:e1be:861f:9e7}\n ff6b:af36:5fc2:93d9:ebf3:3c62:a19f:307f | {ff6b:af36:5fc2:93d9:ebf3:3c62:a19f:307f}\n(256 rows)\n\n-- errors\nselect a4,\n       array_agg(a4) over (order by a4 range between -33 preceding and -33 following)\n  from ipaddrs\n where a4 is not null;\nERROR:  invalid preceding or following size in window function\nDETAIL:  Offset value -33 is outside the range -32 to 4294967295\nselect a6,\n       array_agg(a6) over (order by a6 range between -129 preceding and -129 following)\n  from ipaddrs\n where a6 is not null;\nERROR:  invalid preceding or following size in window function\nDETAIL:  Offset value -129 is outside the range -128 to 2^63-1\n-- end\n"
  },
  {
    "path": "expected/ip4r.out",
    "content": "--\n/*CUT-HERE*/\nCREATE EXTENSION ip4r;\n-- Check whether any of our opclasses fail amvalidate\nDO $d$\n  DECLARE\n    r record;\n  BEGIN\n    IF current_setting('server_version_num')::integer >= 90600 THEN\n      FOR r IN SELECT amname,\n                      CASE amname WHEN 'btree' THEN 6\n\t\t                  WHEN 'hash' THEN 6\n\t\t\t\t  WHEN 'gist' THEN 3\n\t\t\t\t  ELSE 0 END as expected,\n\t\t      count(nullif(amvalidate(opc.oid),false)) as actual\n                 FROM pg_opclass opc\n                      LEFT JOIN pg_am am ON am.oid = opcmethod\n                WHERE opcintype IN ('ip4'::regtype,\n                                    'ip4r'::regtype,\n                                    'ip6'::regtype,\n                                    'ip6r'::regtype,\n                                    'ipaddress'::regtype,\n                                    'iprange'::regtype)\n                GROUP BY amname\n                ORDER BY amname\n      LOOP\n         IF r.expected IS DISTINCT FROM r.actual THEN\n           RAISE INFO '% % operator classes did not validate', r.expected - r.actual, r.amname;\n         END IF;\n      END LOOP;\n    END IF;\n  END;\n$d$;\n/*CUT-END*/\n\\set VERBOSITY terse\nSET extra_float_digits = 0;\n--\n-- Valid and invalid addresses\n--\n--valid ip4\nselect '1.2.3.4'::ip4;\n   ip4   \n---------\n 1.2.3.4\n(1 row)\n\nselect '0.0.0.0'::ip4;\n   ip4   \n---------\n 0.0.0.0\n(1 row)\n\nselect '255.255.255.255'::ip4;\n       ip4       \n-----------------\n 255.255.255.255\n(1 row)\n\nselect '0.0.0.255'::ip4;\n    ip4    \n-----------\n 0.0.0.255\n(1 row)\n\nselect '0.0.255.0'::ip4;\n    ip4    \n-----------\n 0.0.255.0\n(1 row)\n\nselect '0.255.0.0'::ip4;\n    ip4    \n-----------\n 0.255.0.0\n(1 row)\n\nselect '255.0.0.0'::ip4;\n    ip4    \n-----------\n 255.0.0.0\n(1 row)\n\nselect '192.168.123.210'::ip4;\n       ip4       \n-----------------\n 192.168.123.210\n(1 row)\n\nselect '127.0.0.1'::ip4;\n    ip4    \n-----------\n 127.0.0.1\n(1 row)\n\n--invalid ip4\nselect '1.2.3'::ip4;\nERROR:  invalid IP4 value: '1.2.3' at character 8\nselect '0'::ip4;\nERROR:  invalid IP4 value: '0' at character 8\nselect ' 1.2.3.4'::ip4;\nERROR:  invalid IP4 value: ' 1.2.3.4' at character 8\nselect '1.2.3.4 '::ip4;\nERROR:  invalid IP4 value: '1.2.3.4 ' at character 8\nselect '0.0.0.256'::ip4;\nERROR:  invalid IP4 value: '0.0.0.256' at character 8\nselect '0.0.256'::ip4;\nERROR:  invalid IP4 value: '0.0.256' at character 8\nselect '0..255.0'::ip4;\nERROR:  invalid IP4 value: '0..255.0' at character 8\nselect '+0.255.0.0'::ip4;\nERROR:  invalid IP4 value: '+0.255.0.0' at character 8\nselect '1.2.3.4-1.2.3.4'::ip4;\nERROR:  invalid IP4 value: '1.2.3.4-1.2.3.4' at character 8\n-- valid ip6\nselect '0000:0000:0000:0000:0000:0000:0000:0000'::ip6;\n ip6 \n-----\n ::\n(1 row)\n\nselect '0000:0000:0000:0000:0000:0000:0000:0001'::ip6;\n ip6 \n-----\n ::1\n(1 row)\n\nselect '0:0:0:0:0:0:0:0'::ip6;\n ip6 \n-----\n ::\n(1 row)\n\nselect '0:0:0:0:0:0:0:1'::ip6;\n ip6 \n-----\n ::1\n(1 row)\n\nselect '0:0:0:0:0:0:13.1.68.3'::ip6;\n     ip6     \n-------------\n ::13.1.68.3\n(1 row)\n\nselect '0:0:0:0:0:FFFF:129.144.52.38'::ip6;\n         ip6          \n----------------------\n ::ffff:129.144.52.38\n(1 row)\n\nselect '0::0'::ip6;\n ip6 \n-----\n ::\n(1 row)\n\nselect '1:2:3:4:5:6:1.2.3.4'::ip6;\n         ip6         \n---------------------\n 1:2:3:4:5:6:102:304\n(1 row)\n\nselect '1:2:3:4:5:6:7:8'::ip6;\n       ip6       \n-----------------\n 1:2:3:4:5:6:7:8\n(1 row)\n\nselect '1:2:3:4:5:6::'::ip6;\n      ip6      \n---------------\n 1:2:3:4:5:6::\n(1 row)\n\nselect '1:2:3:4:5:6::8'::ip6;\n       ip6       \n-----------------\n 1:2:3:4:5:6:0:8\n(1 row)\n\nselect '1:2:3:4:5::'::ip6;\n     ip6     \n-------------\n 1:2:3:4:5::\n(1 row)\n\nselect '1:2:3:4:5::1.2.3.4'::ip6;\n         ip6         \n---------------------\n 1:2:3:4:5:0:102:304\n(1 row)\n\nselect '1:2:3:4:5::7:8'::ip6;\n       ip6       \n-----------------\n 1:2:3:4:5:0:7:8\n(1 row)\n\nselect '1:2:3:4:5::8'::ip6;\n     ip6      \n--------------\n 1:2:3:4:5::8\n(1 row)\n\nselect '1:2:3:4::'::ip6;\n    ip6    \n-----------\n 1:2:3:4::\n(1 row)\n\nselect '1:2:3:4::1.2.3.4'::ip6;\n       ip6        \n------------------\n 1:2:3:4::102:304\n(1 row)\n\nselect '1:2:3:4::5:1.2.3.4'::ip6;\n         ip6         \n---------------------\n 1:2:3:4:0:5:102:304\n(1 row)\n\nselect '1:2:3:4::7:8'::ip6;\n     ip6      \n--------------\n 1:2:3:4::7:8\n(1 row)\n\nselect '1:2:3:4::8'::ip6;\n    ip6     \n------------\n 1:2:3:4::8\n(1 row)\n\nselect '1:2:3::'::ip6;\n   ip6   \n---------\n 1:2:3::\n(1 row)\n\nselect '1:2:3::1.2.3.4'::ip6;\n      ip6       \n----------------\n 1:2:3::102:304\n(1 row)\n\nselect '1:2:3::5:1.2.3.4'::ip6;\n       ip6        \n------------------\n 1:2:3::5:102:304\n(1 row)\n\nselect '1:2:3::7:8'::ip6;\n    ip6     \n------------\n 1:2:3::7:8\n(1 row)\n\nselect '1:2:3::8'::ip6;\n   ip6    \n----------\n 1:2:3::8\n(1 row)\n\nselect '1:2::'::ip6;\n  ip6  \n-------\n 1:2::\n(1 row)\n\nselect '1:2::1.2.3.4'::ip6;\n     ip6      \n--------------\n 1:2::102:304\n(1 row)\n\nselect '1:2::5:1.2.3.4'::ip6;\n      ip6       \n----------------\n 1:2::5:102:304\n(1 row)\n\nselect '1:2::7:8'::ip6;\n   ip6    \n----------\n 1:2::7:8\n(1 row)\n\nselect '1:2::8'::ip6;\n  ip6   \n--------\n 1:2::8\n(1 row)\n\nselect '1::'::ip6;\n ip6 \n-----\n 1::\n(1 row)\n\nselect '1::1.2.3.4'::ip6;\n    ip6     \n------------\n 1::102:304\n(1 row)\n\nselect '1::2:3'::ip6;\n  ip6   \n--------\n 1::2:3\n(1 row)\n\nselect '1::2:3:4'::ip6;\n   ip6    \n----------\n 1::2:3:4\n(1 row)\n\nselect '1::2:3:4:5'::ip6;\n    ip6     \n------------\n 1::2:3:4:5\n(1 row)\n\nselect '1::2:3:4:5:6'::ip6;\n     ip6      \n--------------\n 1::2:3:4:5:6\n(1 row)\n\nselect '1::2:3:4:5:6:7'::ip6;\n       ip6       \n-----------------\n 1:0:2:3:4:5:6:7\n(1 row)\n\nselect '1::5:1.2.3.4'::ip6;\n     ip6      \n--------------\n 1::5:102:304\n(1 row)\n\nselect '1::5:11.22.33.44'::ip6;\n      ip6      \n---------------\n 1::5:b16:212c\n(1 row)\n\nselect '1::7:8'::ip6;\n  ip6   \n--------\n 1::7:8\n(1 row)\n\nselect '1::8'::ip6;\n ip6  \n------\n 1::8\n(1 row)\n\nselect '2001:0000:1234:0000:0000:C1C0:ABCD:0876'::ip6;\n            ip6             \n----------------------------\n 2001:0:1234::c1c0:abcd:876\n(1 row)\n\nselect '2001:0db8:0000:0000:0000:0000:1428:57ab'::ip6;\n         ip6         \n---------------------\n 2001:db8::1428:57ab\n(1 row)\n\nselect '2001:0db8:0000:0000:0000::1428:57ab'::ip6;\n         ip6         \n---------------------\n 2001:db8::1428:57ab\n(1 row)\n\nselect '2001:0db8:0:0:0:0:1428:57ab'::ip6;\n         ip6         \n---------------------\n 2001:db8::1428:57ab\n(1 row)\n\nselect '2001:0db8:0:0::1428:57ab'::ip6;\n         ip6         \n---------------------\n 2001:db8::1428:57ab\n(1 row)\n\nselect '2001:0db8:1234:0000:0000:0000:0000:0000'::ip6;\n       ip6       \n-----------------\n 2001:db8:1234::\n(1 row)\n\nselect '2001:0db8:1234::'::ip6;\n       ip6       \n-----------------\n 2001:db8:1234::\n(1 row)\n\nselect '2001:0db8:1234:ffff:ffff:ffff:ffff:ffff'::ip6;\n                  ip6                   \n----------------------------------------\n 2001:db8:1234:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect '2001:0db8:85a3:0000:0000:8a2e:0370:7334'::ip6;\n             ip6              \n------------------------------\n 2001:db8:85a3::8a2e:370:7334\n(1 row)\n\nselect '2001:0db8::1428:57ab'::ip6;\n         ip6         \n---------------------\n 2001:db8::1428:57ab\n(1 row)\n\nselect '2001:10::'::ip6;\n    ip6    \n-----------\n 2001:10::\n(1 row)\n\nselect '2001::'::ip6;\n  ip6   \n--------\n 2001::\n(1 row)\n\nselect '2001:DB8:0:0:8:800:200C:417A'::ip6;\n            ip6            \n---------------------------\n 2001:db8::8:800:200c:417a\n(1 row)\n\nselect '2001:DB8::8:800:200C:417A'::ip6;\n            ip6            \n---------------------------\n 2001:db8::8:800:200c:417a\n(1 row)\n\nselect '2001:db8:85a3:0:0:8a2e:370:7334'::ip6;\n             ip6              \n------------------------------\n 2001:db8:85a3::8a2e:370:7334\n(1 row)\n\nselect '2001:db8:85a3::8a2e:370:7334'::ip6;\n             ip6              \n------------------------------\n 2001:db8:85a3::8a2e:370:7334\n(1 row)\n\nselect '2001:db8::'::ip6;\n    ip6     \n------------\n 2001:db8::\n(1 row)\n\nselect '2001:db8::'::ip6;\n    ip6     \n------------\n 2001:db8::\n(1 row)\n\nselect '2001:db8::1428:57ab'::ip6;\n         ip6         \n---------------------\n 2001:db8::1428:57ab\n(1 row)\n\nselect '2001:db8:a::123'::ip6;\n       ip6       \n-----------------\n 2001:db8:a::123\n(1 row)\n\nselect '2002::'::ip6;\n  ip6   \n--------\n 2002::\n(1 row)\n\nselect '2::10'::ip6;\n  ip6  \n-------\n 2::10\n(1 row)\n\nselect '3ffe:0b00:0000:0000:0001:0000:0000:000a'::ip6;\n        ip6        \n-------------------\n 3ffe:b00::1:0:0:a\n(1 row)\n\nselect '::'::ip6;\n ip6 \n-----\n ::\n(1 row)\n\nselect '::1'::ip6;\n ip6 \n-----\n ::1\n(1 row)\n\nselect '::127.0.0.1'::ip6;\n     ip6     \n-------------\n ::127.0.0.1\n(1 row)\n\nselect '::13.1.68.3'::ip6;\n     ip6     \n-------------\n ::13.1.68.3\n(1 row)\n\nselect '::2:3'::ip6;\n    ip6    \n-----------\n ::0.2.0.3\n(1 row)\n\nselect '::2:3:4'::ip6;\n   ip6   \n---------\n ::2:3:4\n(1 row)\n\nselect '::2:3:4:5'::ip6;\n    ip6    \n-----------\n ::2:3:4:5\n(1 row)\n\nselect '::2:3:4:5:6'::ip6;\n     ip6     \n-------------\n ::2:3:4:5:6\n(1 row)\n\nselect '::2:3:4:5:6:7'::ip6;\n      ip6      \n---------------\n ::2:3:4:5:6:7\n(1 row)\n\nselect '::2:3:4:5:6:7:8'::ip6;\n       ip6       \n-----------------\n 0:2:3:4:5:6:7:8\n(1 row)\n\nselect '::8'::ip6;\n ip6 \n-----\n ::8\n(1 row)\n\nselect '::FFFF:129.144.52.38'::ip6;\n         ip6          \n----------------------\n ::ffff:129.144.52.38\n(1 row)\n\nselect '::ffff:0:0'::ip6;\n      ip6       \n----------------\n ::ffff:0.0.0.0\n(1 row)\n\nselect '::ffff:0:192.168.1.1'::ip6;\n         ip6          \n----------------------\n ::ffff:0:192.168.1.1\n(1 row)\n\nselect '::ffff:1:1.2.3.4'::ip6;\n       ip6        \n------------------\n ::ffff:1:102:304\n(1 row)\n\nselect '::ffff:0c22:384e'::ip6;\n        ip6         \n--------------------\n ::ffff:12.34.56.78\n(1 row)\n\nselect '::ffff:12.34.56.78'::ip6;\n        ip6         \n--------------------\n ::ffff:12.34.56.78\n(1 row)\n\nselect '::ffff:192.0.2.128'::ip6;\n        ip6         \n--------------------\n ::ffff:192.0.2.128\n(1 row)\n\nselect '::ffff:192.168.1.1'::ip6;\n        ip6         \n--------------------\n ::ffff:192.168.1.1\n(1 row)\n\nselect '::ffff:192.168.1.26'::ip6;\n         ip6         \n---------------------\n ::ffff:192.168.1.26\n(1 row)\n\nselect '::ffff:c000:280'::ip6;\n        ip6         \n--------------------\n ::ffff:192.0.2.128\n(1 row)\n\nselect 'FF01:0:0:0:0:0:0:101'::ip6;\n    ip6    \n-----------\n ff01::101\n(1 row)\n\nselect 'FF01::101'::ip6;\n    ip6    \n-----------\n ff01::101\n(1 row)\n\nselect 'FF02:0000:0000:0000:0000:0000:0000:0001'::ip6;\n   ip6   \n---------\n ff02::1\n(1 row)\n\nselect 'fc00::'::ip6;\n  ip6   \n--------\n fc00::\n(1 row)\n\nselect 'fe80:0000:0000:0000:0204:61ff:fe9d:f156'::ip6;\n           ip6            \n--------------------------\n fe80::204:61ff:fe9d:f156\n(1 row)\n\nselect 'fe80:0:0:0:204:61ff:254.157.241.86'::ip6;\n           ip6            \n--------------------------\n fe80::204:61ff:fe9d:f156\n(1 row)\n\nselect 'fe80:0:0:0:204:61ff:fe9d:f156'::ip6;\n           ip6            \n--------------------------\n fe80::204:61ff:fe9d:f156\n(1 row)\n\nselect 'fe80::'::ip6;\n  ip6   \n--------\n fe80::\n(1 row)\n\nselect 'fe80::1'::ip6;\n   ip6   \n---------\n fe80::1\n(1 row)\n\nselect 'fe80::204:61ff:254.157.241.86'::ip6;\n           ip6            \n--------------------------\n fe80::204:61ff:fe9d:f156\n(1 row)\n\nselect 'fe80::204:61ff:fe9d:f156'::ip6;\n           ip6            \n--------------------------\n fe80::204:61ff:fe9d:f156\n(1 row)\n\nselect 'fe80::217:f2ff:254.7.237.98'::ip6;\n           ip6            \n--------------------------\n fe80::217:f2ff:fe07:ed62\n(1 row)\n\nselect 'fe80::217:f2ff:fe07:ed62'::ip6;\n           ip6            \n--------------------------\n fe80::217:f2ff:fe07:ed62\n(1 row)\n\nselect 'ff02::1'::ip6;\n   ip6   \n---------\n ff02::1\n(1 row)\n\n-- invalid ip6\nselect ''::ip6;\nERROR:  invalid IP6 value: '' at character 8\nselect '02001:0000:1234:0000:0000:C1C0:ABCD:0876'::ip6;\nERROR:  invalid IP6 value: '02001:0000:1234:0000:0000:C1C0:ABCD:0876' at character 8\nselect '1.2.3.4:1111:2222:3333:4444::5555'::ip6;\nERROR:  invalid IP6 value: '1.2.3.4:1111:2222:3333:4444::5555' at character 8\nselect '1.2.3.4:1111:2222:3333::5555'::ip6;\nERROR:  invalid IP6 value: '1.2.3.4:1111:2222:3333::5555' at character 8\nselect '1.2.3.4:1111:2222::5555'::ip6;\nERROR:  invalid IP6 value: '1.2.3.4:1111:2222::5555' at character 8\nselect '1.2.3.4:1111::5555'::ip6;\nERROR:  invalid IP6 value: '1.2.3.4:1111::5555' at character 8\nselect '1.2.3.4::'::ip6;\nERROR:  invalid IP6 value: '1.2.3.4::' at character 8\nselect '1.2.3.4::5555'::ip6;\nERROR:  invalid IP6 value: '1.2.3.4::5555' at character 8\nselect '1111:'::ip6;\nERROR:  invalid IP6 value: '1111:' at character 8\nselect '1111:2222:3333:4444::5555:'::ip6;\nERROR:  invalid IP6 value: '1111:2222:3333:4444::5555:' at character 8\nselect '1111:2222:3333::5555:'::ip6;\nERROR:  invalid IP6 value: '1111:2222:3333::5555:' at character 8\nselect '1111:2222::5555:'::ip6;\nERROR:  invalid IP6 value: '1111:2222::5555:' at character 8\nselect '1111::5555:'::ip6;\nERROR:  invalid IP6 value: '1111::5555:' at character 8\nselect '123'::ip6;\nERROR:  invalid IP6 value: '123' at character 8\nselect '12345::6:7:8'::ip6;\nERROR:  invalid IP6 value: '12345::6:7:8' at character 8\nselect '127.0.0.1'::ip6;\nERROR:  invalid IP6 value: '127.0.0.1' at character 8\nselect '1:2:3:4:5:6:7:8:9'::ip6;\nERROR:  invalid IP6 value: '1:2:3:4:5:6:7:8:9' at character 8\nselect '1:2:3::4:5:6:7:8:9'::ip6;\nERROR:  invalid IP6 value: '1:2:3::4:5:6:7:8:9' at character 8\nselect '1:2:3::4:5::7:8'::ip6;\nERROR:  invalid IP6 value: '1:2:3::4:5::7:8' at character 8\nselect '1::1.2.256.4'::ip6;\nERROR:  invalid IP6 value: '1::1.2.256.4' at character 8\nselect '1::1.2.3.256'::ip6;\nERROR:  invalid IP6 value: '1::1.2.3.256' at character 8\nselect '1::1.2.3.300'::ip6;\nERROR:  invalid IP6 value: '1::1.2.3.300' at character 8\nselect '1::1.2.3.900'::ip6;\nERROR:  invalid IP6 value: '1::1.2.3.900' at character 8\nselect '1::1.2.300.4'::ip6;\nERROR:  invalid IP6 value: '1::1.2.300.4' at character 8\nselect '1::1.2.900.4'::ip6;\nERROR:  invalid IP6 value: '1::1.2.900.4' at character 8\nselect '1::1.256.3.4'::ip6;\nERROR:  invalid IP6 value: '1::1.256.3.4' at character 8\nselect '1::1.300.3.4'::ip6;\nERROR:  invalid IP6 value: '1::1.300.3.4' at character 8\nselect '1::1.900.3.4'::ip6;\nERROR:  invalid IP6 value: '1::1.900.3.4' at character 8\nselect '1::256.2.3.4'::ip6;\nERROR:  invalid IP6 value: '1::256.2.3.4' at character 8\nselect '1::260.2.3.4'::ip6;\nERROR:  invalid IP6 value: '1::260.2.3.4' at character 8\nselect '1::2::3'::ip6;\nERROR:  invalid IP6 value: '1::2::3' at character 8\nselect '1::300.2.3.4'::ip6;\nERROR:  invalid IP6 value: '1::300.2.3.4' at character 8\nselect '1::300.300.300.300'::ip6;\nERROR:  invalid IP6 value: '1::300.300.300.300' at character 8\nselect '1::3000.30.30.30'::ip6;\nERROR:  invalid IP6 value: '1::3000.30.30.30' at character 8\nselect '1::400.2.3.4'::ip6;\nERROR:  invalid IP6 value: '1::400.2.3.4' at character 8\nselect '1::5:1.2.256.4'::ip6;\nERROR:  invalid IP6 value: '1::5:1.2.256.4' at character 8\nselect '1::5:1.2.3.256'::ip6;\nERROR:  invalid IP6 value: '1::5:1.2.3.256' at character 8\nselect '1::5:1.2.3.300'::ip6;\nERROR:  invalid IP6 value: '1::5:1.2.3.300' at character 8\nselect '1::5:1.2.3.900'::ip6;\nERROR:  invalid IP6 value: '1::5:1.2.3.900' at character 8\nselect '1::5:1.2.300.4'::ip6;\nERROR:  invalid IP6 value: '1::5:1.2.300.4' at character 8\nselect '1::5:1.2.900.4'::ip6;\nERROR:  invalid IP6 value: '1::5:1.2.900.4' at character 8\nselect '1::5:1.256.3.4'::ip6;\nERROR:  invalid IP6 value: '1::5:1.256.3.4' at character 8\nselect '1::5:1.300.3.4'::ip6;\nERROR:  invalid IP6 value: '1::5:1.300.3.4' at character 8\nselect '1::5:1.900.3.4'::ip6;\nERROR:  invalid IP6 value: '1::5:1.900.3.4' at character 8\nselect '1::5:256.2.3.4'::ip6;\nERROR:  invalid IP6 value: '1::5:256.2.3.4' at character 8\nselect '1::5:260.2.3.4'::ip6;\nERROR:  invalid IP6 value: '1::5:260.2.3.4' at character 8\nselect '1::5:300.2.3.4'::ip6;\nERROR:  invalid IP6 value: '1::5:300.2.3.4' at character 8\nselect '1::5:300.300.300.300'::ip6;\nERROR:  invalid IP6 value: '1::5:300.300.300.300' at character 8\nselect '1::5:3000.30.30.30'::ip6;\nERROR:  invalid IP6 value: '1::5:3000.30.30.30' at character 8\nselect '1::5:400.2.3.4'::ip6;\nERROR:  invalid IP6 value: '1::5:400.2.3.4' at character 8\nselect '1::5:900.2.3.4'::ip6;\nERROR:  invalid IP6 value: '1::5:900.2.3.4' at character 8\nselect '1::900.2.3.4'::ip6;\nERROR:  invalid IP6 value: '1::900.2.3.4' at character 8\nselect '1:::3:4:5'::ip6;\nERROR:  invalid IP6 value: '1:::3:4:5' at character 8\nselect '2001:0000:1234: 0000:0000:C1C0:ABCD:0876'::ip6;\nERROR:  invalid IP6 value: '2001:0000:1234: 0000:0000:C1C0:ABCD:0876' at character 8\nselect '2001:0000:1234:0000:00001:C1C0:ABCD:0876'::ip6;\nERROR:  invalid IP6 value: '2001:0000:1234:0000:00001:C1C0:ABCD:0876' at character 8\nselect '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'::ip6;\nERROR:  invalid IP6 value: '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0' at character 8\nselect '2001::FFD3::57ab'::ip6;\nERROR:  invalid IP6 value: '2001::FFD3::57ab' at character 8\nselect '2001:DB8:0:0:8:800:200C:417A:221'::ip6;\nERROR:  invalid IP6 value: '2001:DB8:0:0:8:800:200C:417A:221' at character 8\nselect '2001:db8:85a3::8a2e:37023:7334'::ip6;\nERROR:  invalid IP6 value: '2001:db8:85a3::8a2e:37023:7334' at character 8\nselect '2001:db8:85a3::8a2e:370k:7334'::ip6;\nERROR:  invalid IP6 value: '2001:db8:85a3::8a2e:370k:7334' at character 8\nselect '3ffe:0b00:0000:0001:0000:0000:000a'::ip6;\nERROR:  invalid IP6 value: '3ffe:0b00:0000:0001:0000:0000:000a' at character 8\nselect '3ffe:b00::1::a'::ip6;\nERROR:  invalid IP6 value: '3ffe:b00::1::a' at character 8\nselect ':'::ip6;\nERROR:  invalid IP6 value: ':' at character 8\nselect ':1111:2222:3333:4444::5555'::ip6;\nERROR:  invalid IP6 value: ':1111:2222:3333:4444::5555' at character 8\nselect ':1111:2222:3333::5555'::ip6;\nERROR:  invalid IP6 value: ':1111:2222:3333::5555' at character 8\nselect ':1111:2222::5555'::ip6;\nERROR:  invalid IP6 value: ':1111:2222::5555' at character 8\nselect ':1111::5555'::ip6;\nERROR:  invalid IP6 value: ':1111::5555' at character 8\nselect '::1.2.256.4'::ip6;\nERROR:  invalid IP6 value: '::1.2.256.4' at character 8\nselect '::1.2.3.256'::ip6;\nERROR:  invalid IP6 value: '::1.2.3.256' at character 8\nselect '::1.2.3.300'::ip6;\nERROR:  invalid IP6 value: '::1.2.3.300' at character 8\nselect '::1.2.3.900'::ip6;\nERROR:  invalid IP6 value: '::1.2.3.900' at character 8\nselect '::1.2.300.4'::ip6;\nERROR:  invalid IP6 value: '::1.2.300.4' at character 8\nselect '::1.2.900.4'::ip6;\nERROR:  invalid IP6 value: '::1.2.900.4' at character 8\nselect '::1.256.3.4'::ip6;\nERROR:  invalid IP6 value: '::1.256.3.4' at character 8\nselect '::1.300.3.4'::ip6;\nERROR:  invalid IP6 value: '::1.300.3.4' at character 8\nselect '::1.900.3.4'::ip6;\nERROR:  invalid IP6 value: '::1.900.3.4' at character 8\nselect '::1111:2222:3333:4444:5555:6666::'::ip6;\nERROR:  invalid IP6 value: '::1111:2222:3333:4444:5555:6666::' at character 8\nselect '::256.2.3.4'::ip6;\nERROR:  invalid IP6 value: '::256.2.3.4' at character 8\nselect '::260.2.3.4'::ip6;\nERROR:  invalid IP6 value: '::260.2.3.4' at character 8\nselect '::300.2.3.4'::ip6;\nERROR:  invalid IP6 value: '::300.2.3.4' at character 8\nselect '::300.300.300.300'::ip6;\nERROR:  invalid IP6 value: '::300.300.300.300' at character 8\nselect '::3000.30.30.30'::ip6;\nERROR:  invalid IP6 value: '::3000.30.30.30' at character 8\nselect '::400.2.3.4'::ip6;\nERROR:  invalid IP6 value: '::400.2.3.4' at character 8\nselect '::5555:'::ip6;\nERROR:  invalid IP6 value: '::5555:' at character 8\nselect '::900.2.3.4'::ip6;\nERROR:  invalid IP6 value: '::900.2.3.4' at character 8\nselect ':::'::ip6;\nERROR:  invalid IP6 value: ':::' at character 8\nselect ':::5555'::ip6;\nERROR:  invalid IP6 value: ':::5555' at character 8\nselect '::ffff:2.3.4'::ip6;\nERROR:  invalid IP6 value: '::ffff:2.3.4' at character 8\nselect '::ffff:257.1.2.3'::ip6;\nERROR:  invalid IP6 value: '::ffff:257.1.2.3' at character 8\nselect 'FF01::101::2'::ip6;\nERROR:  invalid IP6 value: 'FF01::101::2' at character 8\nselect 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'::ip6;\nERROR:  invalid IP6 value: 'FF02:0000:0000:0000:0000:0000:0000:0000:0001' at character 8\nselect 'ldkfj'::ip6;\nERROR:  invalid IP6 value: 'ldkfj' at character 8\n-- valid ip4r\nselect '1.2.3.4'::ip4r;\n  ip4r   \n---------\n 1.2.3.4\n(1 row)\n\nselect '255.255.255.255/32'::ip4r;\n      ip4r       \n-----------------\n 255.255.255.255\n(1 row)\n\nselect '255.255.255.254/31'::ip4r;\n        ip4r        \n--------------------\n 255.255.255.254/31\n(1 row)\n\nselect '255.255.255.252/30'::ip4r;\n        ip4r        \n--------------------\n 255.255.255.252/30\n(1 row)\n\nselect '255.255.255.248/29'::ip4r;\n        ip4r        \n--------------------\n 255.255.255.248/29\n(1 row)\n\nselect '255.255.255.240/28'::ip4r;\n        ip4r        \n--------------------\n 255.255.255.240/28\n(1 row)\n\nselect '255.255.255.224/27'::ip4r;\n        ip4r        \n--------------------\n 255.255.255.224/27\n(1 row)\n\nselect '255.255.255.192/26'::ip4r;\n        ip4r        \n--------------------\n 255.255.255.192/26\n(1 row)\n\nselect '255.255.255.128/25'::ip4r;\n        ip4r        \n--------------------\n 255.255.255.128/25\n(1 row)\n\nselect '255.255.255.0/24'::ip4r;\n       ip4r       \n------------------\n 255.255.255.0/24\n(1 row)\n\nselect '255.255.254.0/23'::ip4r;\n       ip4r       \n------------------\n 255.255.254.0/23\n(1 row)\n\nselect '255.255.252.0/22'::ip4r;\n       ip4r       \n------------------\n 255.255.252.0/22\n(1 row)\n\nselect '255.255.248.0/21'::ip4r;\n       ip4r       \n------------------\n 255.255.248.0/21\n(1 row)\n\nselect '255.255.240.0/20'::ip4r;\n       ip4r       \n------------------\n 255.255.240.0/20\n(1 row)\n\nselect '255.255.224.0/19'::ip4r;\n       ip4r       \n------------------\n 255.255.224.0/19\n(1 row)\n\nselect '255.255.192.0/18'::ip4r;\n       ip4r       \n------------------\n 255.255.192.0/18\n(1 row)\n\nselect '255.255.128.0/17'::ip4r;\n       ip4r       \n------------------\n 255.255.128.0/17\n(1 row)\n\nselect '255.255.0.0/16'::ip4r;\n      ip4r      \n----------------\n 255.255.0.0/16\n(1 row)\n\nselect '255.254.0.0/15'::ip4r;\n      ip4r      \n----------------\n 255.254.0.0/15\n(1 row)\n\nselect '255.252.0.0/14'::ip4r;\n      ip4r      \n----------------\n 255.252.0.0/14\n(1 row)\n\nselect '255.248.0.0/13'::ip4r;\n      ip4r      \n----------------\n 255.248.0.0/13\n(1 row)\n\nselect '255.240.0.0/12'::ip4r;\n      ip4r      \n----------------\n 255.240.0.0/12\n(1 row)\n\nselect '255.224.0.0/11'::ip4r;\n      ip4r      \n----------------\n 255.224.0.0/11\n(1 row)\n\nselect '255.192.0.0/10'::ip4r;\n      ip4r      \n----------------\n 255.192.0.0/10\n(1 row)\n\nselect '255.128.0.0/9'::ip4r;\n     ip4r      \n---------------\n 255.128.0.0/9\n(1 row)\n\nselect '255.0.0.0/8'::ip4r;\n    ip4r     \n-------------\n 255.0.0.0/8\n(1 row)\n\nselect '254.0.0.0/7'::ip4r;\n    ip4r     \n-------------\n 254.0.0.0/7\n(1 row)\n\nselect '252.0.0.0/6'::ip4r;\n    ip4r     \n-------------\n 252.0.0.0/6\n(1 row)\n\nselect '248.0.0.0/5'::ip4r;\n    ip4r     \n-------------\n 248.0.0.0/5\n(1 row)\n\nselect '240.0.0.0/4'::ip4r;\n    ip4r     \n-------------\n 240.0.0.0/4\n(1 row)\n\nselect '224.0.0.0/3'::ip4r;\n    ip4r     \n-------------\n 224.0.0.0/3\n(1 row)\n\nselect '192.0.0.0/2'::ip4r;\n    ip4r     \n-------------\n 192.0.0.0/2\n(1 row)\n\nselect '128.0.0.0/1'::ip4r;\n    ip4r     \n-------------\n 128.0.0.0/1\n(1 row)\n\nselect '0.0.0.0/0'::ip4r;\n   ip4r    \n-----------\n 0.0.0.0/0\n(1 row)\n\nselect '1.2.3.4-5.6.7.8'::ip4r;\n      ip4r       \n-----------------\n 1.2.3.4-5.6.7.8\n(1 row)\n\nselect '5.6.7.8-1.2.3.4'::ip4r;\n      ip4r       \n-----------------\n 1.2.3.4-5.6.7.8\n(1 row)\n\nselect '1.2.3.4-1.2.3.4'::ip4r;\n  ip4r   \n---------\n 1.2.3.4\n(1 row)\n\n-- invalid ip4r\nselect '1.2.3'::ip4r;\nERROR:  invalid IP4R value: \"1.2.3\" at character 8\nselect '255.255.255.255.255.255.255.255.255'::ip4r;\nERROR:  invalid IP4R value: \"255.255.255.255.255.255.255.255.255\" at character 8\nselect '255.255.255.255.255-255.255.255.255.255'::ip4r;\nERROR:  invalid IP4R value: \"255.255.255.255.255-255.255.255.255.255\" at character 8\nselect '255.255.255.255-1.2.3.4.5'::ip4r;\nERROR:  invalid IP4R value: \"255.255.255.255-1.2.3.4.5\" at character 8\nselect '255.255.255.255-1.2.3'::ip4r;\nERROR:  invalid IP4R value: \"255.255.255.255-1.2.3\" at character 8\nselect '0.0.0.1/31'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/31\" at character 8\nselect '0.0.0.1/30'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/30\" at character 8\nselect '0.0.0.1/29'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/29\" at character 8\nselect '0.0.0.1/28'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/28\" at character 8\nselect '0.0.0.1/27'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/27\" at character 8\nselect '0.0.0.1/26'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/26\" at character 8\nselect '0.0.0.1/25'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/25\" at character 8\nselect '0.0.0.1/24'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/24\" at character 8\nselect '0.0.0.1/23'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/23\" at character 8\nselect '0.0.0.1/22'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/22\" at character 8\nselect '0.0.0.1/21'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/21\" at character 8\nselect '0.0.0.1/20'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/20\" at character 8\nselect '0.0.0.1/19'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/19\" at character 8\nselect '0.0.0.1/18'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/18\" at character 8\nselect '0.0.0.1/17'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/17\" at character 8\nselect '0.0.0.1/16'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/16\" at character 8\nselect '0.0.0.1/15'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/15\" at character 8\nselect '0.0.0.1/14'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/14\" at character 8\nselect '0.0.0.1/13'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/13\" at character 8\nselect '0.0.0.1/12'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/12\" at character 8\nselect '0.0.0.1/11'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/11\" at character 8\nselect '0.0.0.1/10'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/10\" at character 8\nselect '0.0.0.1/9'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/9\" at character 8\nselect '0.0.0.1/8'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/8\" at character 8\nselect '0.0.0.1/7'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/7\" at character 8\nselect '0.0.0.1/6'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/6\" at character 8\nselect '0.0.0.1/5'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/5\" at character 8\nselect '0.0.0.1/4'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/4\" at character 8\nselect '0.0.0.1/3'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/3\" at character 8\nselect '0.0.0.1/2'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/2\" at character 8\nselect '0.0.0.1/1'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/1\" at character 8\nselect '0.0.0.1/0'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.1/0\" at character 8\nselect '0.0.0.2/30'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.2/30\" at character 8\nselect '0.0.0.4/29'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.4/29\" at character 8\nselect '0.0.0.8/28'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.8/28\" at character 8\nselect '0.0.0.16/27'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.16/27\" at character 8\nselect '0.0.0.32/26'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.32/26\" at character 8\nselect '0.0.0.64/25'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.64/25\" at character 8\nselect '0.0.0.128/24'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.128/24\" at character 8\nselect '0.0.1.0/23'::ip4r;\nERROR:  invalid IP4R value: \"0.0.1.0/23\" at character 8\nselect '0.0.2.0/22'::ip4r;\nERROR:  invalid IP4R value: \"0.0.2.0/22\" at character 8\nselect '0.0.4.0/21'::ip4r;\nERROR:  invalid IP4R value: \"0.0.4.0/21\" at character 8\nselect '0.0.8.0/20'::ip4r;\nERROR:  invalid IP4R value: \"0.0.8.0/20\" at character 8\nselect '0.0.16.0/19'::ip4r;\nERROR:  invalid IP4R value: \"0.0.16.0/19\" at character 8\nselect '0.0.32.0/18'::ip4r;\nERROR:  invalid IP4R value: \"0.0.32.0/18\" at character 8\nselect '0.0.64.0/17'::ip4r;\nERROR:  invalid IP4R value: \"0.0.64.0/17\" at character 8\nselect '0.0.128.0/16'::ip4r;\nERROR:  invalid IP4R value: \"0.0.128.0/16\" at character 8\nselect '0.1.0.0/15'::ip4r;\nERROR:  invalid IP4R value: \"0.1.0.0/15\" at character 8\nselect '0.2.0.0/14'::ip4r;\nERROR:  invalid IP4R value: \"0.2.0.0/14\" at character 8\nselect '0.4.0.0/13'::ip4r;\nERROR:  invalid IP4R value: \"0.4.0.0/13\" at character 8\nselect '0.8.0.0/12'::ip4r;\nERROR:  invalid IP4R value: \"0.8.0.0/12\" at character 8\nselect '0.16.0.0/11'::ip4r;\nERROR:  invalid IP4R value: \"0.16.0.0/11\" at character 8\nselect '0.32.0.0/10'::ip4r;\nERROR:  invalid IP4R value: \"0.32.0.0/10\" at character 8\nselect '0.64.0.0/9'::ip4r;\nERROR:  invalid IP4R value: \"0.64.0.0/9\" at character 8\nselect '0.128.0.0/8'::ip4r;\nERROR:  invalid IP4R value: \"0.128.0.0/8\" at character 8\nselect '1.0.0.0/7'::ip4r;\nERROR:  invalid IP4R value: \"1.0.0.0/7\" at character 8\nselect '2.0.0.0/6'::ip4r;\nERROR:  invalid IP4R value: \"2.0.0.0/6\" at character 8\nselect '4.0.0.0/5'::ip4r;\nERROR:  invalid IP4R value: \"4.0.0.0/5\" at character 8\nselect '8.0.0.0/4'::ip4r;\nERROR:  invalid IP4R value: \"8.0.0.0/4\" at character 8\nselect '16.0.0.0/3'::ip4r;\nERROR:  invalid IP4R value: \"16.0.0.0/3\" at character 8\nselect '32.0.0.0/2'::ip4r;\nERROR:  invalid IP4R value: \"32.0.0.0/2\" at character 8\nselect '64.0.0.0/1'::ip4r;\nERROR:  invalid IP4R value: \"64.0.0.0/1\" at character 8\nselect '128.0.0.0/0'::ip4r;\nERROR:  invalid IP4R value: \"128.0.0.0/0\" at character 8\nselect '0.0.0.0/33'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.0/33\" at character 8\nselect '0.0.0.0/3.0'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.0/3.0\" at character 8\nselect '0.0.0.0/+33'::ip4r;\nERROR:  invalid IP4R value: \"0.0.0.0/+33\" at character 8\n-- valid ip6r\nselect '::'::ip6r;\n ip6r \n------\n ::\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6r;\n                  ip6r                   \n-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect '1::2'::ip6r;\n ip6r \n------\n 1::2\n(1 row)\n\nselect '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6r;\n ip6r \n------\n ::/0\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::ip6r;\n ip6r \n------\n ::/0\n(1 row)\n\nselect '1::2-3::4'::ip6r;\n   ip6r    \n-----------\n 1::2-3::4\n(1 row)\n\nselect '3::4-3::4'::ip6r;\n ip6r \n------\n 3::4\n(1 row)\n\nselect '3::4-1::2'::ip6r;\n   ip6r    \n-----------\n 1::2-3::4\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::ip6r;\n                  ip6r                   \n-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127'::ip6r;\n                    ip6r                     \n---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126'::ip6r;\n                    ip6r                     \n---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125'::ip6r;\n                    ip6r                     \n---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124'::ip6r;\n                    ip6r                     \n---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120'::ip6r;\n                    ip6r                     \n---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116'::ip6r;\n                    ip6r                     \n---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0000/112'::ip6r;\n                   ip6r                   \n------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:0/112\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:0000:0000/96'::ip6r;\n                ip6r                \n------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff::/96\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:0000:0000:0000/80'::ip6r;\n             ip6r              \n-------------------------------\n ffff:ffff:ffff:ffff:ffff::/80\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:fff0:0000:0000:0000/76'::ip6r;\n             ip6r              \n-------------------------------\n ffff:ffff:ffff:ffff:fff0::/76\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ff00:0000:0000:0000/72'::ip6r;\n             ip6r              \n-------------------------------\n ffff:ffff:ffff:ffff:ff00::/72\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:f000:0000:0000:0000/68'::ip6r;\n             ip6r              \n-------------------------------\n ffff:ffff:ffff:ffff:f000::/68\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:e000:0000:0000:0000/67'::ip6r;\n             ip6r              \n-------------------------------\n ffff:ffff:ffff:ffff:e000::/67\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:c000:0000:0000:0000/66'::ip6r;\n             ip6r              \n-------------------------------\n ffff:ffff:ffff:ffff:c000::/66\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:8000:0000:0000:0000/65'::ip6r;\n             ip6r              \n-------------------------------\n ffff:ffff:ffff:ffff:8000::/65\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:0000:0000:0000:0000/64'::ip6r;\n           ip6r           \n--------------------------\n ffff:ffff:ffff:ffff::/64\n(1 row)\n\nselect 'ffff:ffff:ffff:fffe:0000:0000:0000:0000/63'::ip6r;\n           ip6r           \n--------------------------\n ffff:ffff:ffff:fffe::/63\n(1 row)\n\nselect 'ffff:ffff:ffff:fffc:0000:0000:0000:0000/62'::ip6r;\n           ip6r           \n--------------------------\n ffff:ffff:ffff:fffc::/62\n(1 row)\n\nselect 'ffff:ffff:ffff:fff8:0000:0000:0000:0000/61'::ip6r;\n           ip6r           \n--------------------------\n ffff:ffff:ffff:fff8::/61\n(1 row)\n\nselect 'ffff:ffff:ffff:fff0:0000:0000:0000:0000/60'::ip6r;\n           ip6r           \n--------------------------\n ffff:ffff:ffff:fff0::/60\n(1 row)\n\nselect 'ffff:ffff:ffff:ff00:0000:0000:0000:0000/56'::ip6r;\n           ip6r           \n--------------------------\n ffff:ffff:ffff:ff00::/56\n(1 row)\n\nselect 'ffff:ffff:ffff:f000:0000:0000:0000:0000/52'::ip6r;\n           ip6r           \n--------------------------\n ffff:ffff:ffff:f000::/52\n(1 row)\n\nselect 'ffff:ffff:ffff:0000:0000:0000:0000:0000/48'::ip6r;\n        ip6r         \n---------------------\n ffff:ffff:ffff::/48\n(1 row)\n\nselect 'ffff:ffff:0000:0000:0000:0000:0000:0000/32'::ip6r;\n      ip6r      \n----------------\n ffff:ffff::/32\n(1 row)\n\nselect 'ffff:0000:0000:0000:0000:0000:0000:0000/16'::ip6r;\n   ip6r    \n-----------\n ffff::/16\n(1 row)\n\nselect 'fff0:0000:0000:0000:0000:0000:0000:0000/12'::ip6r;\n   ip6r    \n-----------\n fff0::/12\n(1 row)\n\nselect 'ff00:0000:0000:0000:0000:0000:0000:0000/8'::ip6r;\n   ip6r   \n----------\n ff00::/8\n(1 row)\n\nselect 'f000:0000:0000:0000:0000:0000:0000:0000/4'::ip6r;\n   ip6r   \n----------\n f000::/4\n(1 row)\n\nselect 'e000:0000:0000:0000:0000:0000:0000:0000/3'::ip6r;\n   ip6r   \n----------\n e000::/3\n(1 row)\n\nselect 'c000:0000:0000:0000:0000:0000:0000:0000/2'::ip6r;\n   ip6r   \n----------\n c000::/2\n(1 row)\n\nselect '8000:0000:0000:0000:0000:0000:0000:0000/1'::ip6r;\n   ip6r   \n----------\n 8000::/1\n(1 row)\n\nselect '0000:0000:0000:0000:0000:0000:0000:0000/0'::ip6r;\n ip6r \n------\n ::/0\n(1 row)\n\n-- invalid ip6r\nselect '::-::-::'::ip6r;\nERROR:  invalid IP6R value: \"::-::-::\" at character 8\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff'::ip6r;\nERROR:  invalid IP6R value: \"ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff\" at character 8\nselect '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6r;\nERROR:  invalid IP6R value: \"::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\" at character 8\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::ip6r;\nERROR:  invalid IP6R value: \"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::\" at character 8\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::ip6r;\nERROR:  invalid IP6R value: \"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/127'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/127\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/120'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/120\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/112'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/112\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/96'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/96\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/80'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/80\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/64'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/64\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/48'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/48\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/32'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/32\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/16'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/16\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/8'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/8\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/4'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/4\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/0'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/0\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0008/124'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0008/124\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0080/120'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0080/120\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:8000/112'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:8000/112\" at character 8\nselect '0000:0000:0000:0000:0000:0000:8000:0000/96'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:8000:0000/96\" at character 8\nselect '0000:0000:0000:0000:0000:8000:0000:0000/80'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:8000:0000:0000/80\" at character 8\nselect '0000:0000:0000:0000:8000:0000:0000:0000/64'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:8000:0000:0000:0000/64\" at character 8\nselect '0000:0000:0000:8000:0000:0000:0000:0000/48'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:0000:8000:0000:0000:0000:0000/48\" at character 8\nselect '0000:0000:8000:0000:0000:0000:0000:0000/32'::ip6r;\nERROR:  invalid IP6R value: \"0000:0000:8000:0000:0000:0000:0000:0000/32\" at character 8\nselect '0000:8000:0000:0000:0000:0000:0000:0000/16'::ip6r;\nERROR:  invalid IP6R value: \"0000:8000:0000:0000:0000:0000:0000:0000/16\" at character 8\nselect '0080:0000:0000:0000:0000:0000:0000:0000/8'::ip6r;\nERROR:  invalid IP6R value: \"0080:0000:0000:0000:0000:0000:0000:0000/8\" at character 8\nselect '0800:0000:0000:0000:0000:0000:0000:0000/4'::ip6r;\nERROR:  invalid IP6R value: \"0800:0000:0000:0000:0000:0000:0000:0000/4\" at character 8\nselect '8000:0000:0000:0000:0000:0000:0000:0000/0'::ip6r;\nERROR:  invalid IP6R value: \"8000:0000:0000:0000:0000:0000:0000:0000/0\" at character 8\nselect '::/129'::ip6r;\nERROR:  invalid IP6R value: \"::/129\" at character 8\nselect '::/255'::ip6r;\nERROR:  invalid IP6R value: \"::/255\" at character 8\nselect '::/256'::ip6r;\nERROR:  invalid IP6R value: \"::/256\" at character 8\nselect '::/+0'::ip6r;\nERROR:  invalid IP6R value: \"::/+0\" at character 8\nselect '::/0-0'::ip6r;\nERROR:  invalid IP6R value: \"::/0-0\" at character 8\nselect '::-::/0'::ip6r;\nERROR:  invalid IP6R value: \"::-::/0\" at character 8\n-- valid ipaddress\nselect a, family(a) from (select '1.2.3.4'::ipaddress as a) s1;\n    a    | family \n---------+--------\n 1.2.3.4 |      4\n(1 row)\n\nselect a, family(a) from (select '0.0.0.0'::ipaddress as a) s1;\n    a    | family \n---------+--------\n 0.0.0.0 |      4\n(1 row)\n\nselect a, family(a) from (select '255.255.255.255'::ipaddress as a) s1;\n        a        | family \n-----------------+--------\n 255.255.255.255 |      4\n(1 row)\n\nselect a, family(a) from (select '0.0.0.255'::ipaddress as a) s1;\n     a     | family \n-----------+--------\n 0.0.0.255 |      4\n(1 row)\n\nselect a, family(a) from (select '0.0.255.0'::ipaddress as a) s1;\n     a     | family \n-----------+--------\n 0.0.255.0 |      4\n(1 row)\n\nselect a, family(a) from (select '0.255.0.0'::ipaddress as a) s1;\n     a     | family \n-----------+--------\n 0.255.0.0 |      4\n(1 row)\n\nselect a, family(a) from (select '255.0.0.0'::ipaddress as a) s1;\n     a     | family \n-----------+--------\n 255.0.0.0 |      4\n(1 row)\n\nselect a, family(a) from (select '192.168.123.210'::ipaddress as a) s1;\n        a        | family \n-----------------+--------\n 192.168.123.210 |      4\n(1 row)\n\nselect a, family(a) from (select '127.0.0.1'::ipaddress as a) s1;\n     a     | family \n-----------+--------\n 127.0.0.1 |      4\n(1 row)\n\nselect a, family(a) from (select '0000:0000:0000:0000:0000:0000:0000:0000'::ipaddress as a) s1;\n a  | family \n----+--------\n :: |      6\n(1 row)\n\nselect a, family(a) from (select '0000:0000:0000:0000:0000:0000:0000:0001'::ipaddress as a) s1;\n  a  | family \n-----+--------\n ::1 |      6\n(1 row)\n\nselect a, family(a) from (select '0:0:0:0:0:0:0:0'::ipaddress as a) s1;\n a  | family \n----+--------\n :: |      6\n(1 row)\n\nselect a, family(a) from (select '0:0:0:0:0:0:0:1'::ipaddress as a) s1;\n  a  | family \n-----+--------\n ::1 |      6\n(1 row)\n\nselect a, family(a) from (select '0:0:0:0:0:0:13.1.68.3'::ipaddress as a) s1;\n      a      | family \n-------------+--------\n ::13.1.68.3 |      6\n(1 row)\n\nselect a, family(a) from (select '0:0:0:0:0:FFFF:129.144.52.38'::ipaddress as a) s1;\n          a           | family \n----------------------+--------\n ::ffff:129.144.52.38 |      6\n(1 row)\n\nselect a, family(a) from (select '0::0'::ipaddress as a) s1;\n a  | family \n----+--------\n :: |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3:4:5:6:1.2.3.4'::ipaddress as a) s1;\n          a          | family \n---------------------+--------\n 1:2:3:4:5:6:102:304 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3:4:5:6:7:8'::ipaddress as a) s1;\n        a        | family \n-----------------+--------\n 1:2:3:4:5:6:7:8 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3:4:5:6::'::ipaddress as a) s1;\n       a       | family \n---------------+--------\n 1:2:3:4:5:6:: |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3:4:5:6::8'::ipaddress as a) s1;\n        a        | family \n-----------------+--------\n 1:2:3:4:5:6:0:8 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3:4:5::'::ipaddress as a) s1;\n      a      | family \n-------------+--------\n 1:2:3:4:5:: |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3:4:5::1.2.3.4'::ipaddress as a) s1;\n          a          | family \n---------------------+--------\n 1:2:3:4:5:0:102:304 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3:4:5::7:8'::ipaddress as a) s1;\n        a        | family \n-----------------+--------\n 1:2:3:4:5:0:7:8 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3:4:5::8'::ipaddress as a) s1;\n      a       | family \n--------------+--------\n 1:2:3:4:5::8 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3:4::'::ipaddress as a) s1;\n     a     | family \n-----------+--------\n 1:2:3:4:: |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3:4::1.2.3.4'::ipaddress as a) s1;\n        a         | family \n------------------+--------\n 1:2:3:4::102:304 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3:4::5:1.2.3.4'::ipaddress as a) s1;\n          a          | family \n---------------------+--------\n 1:2:3:4:0:5:102:304 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3:4::7:8'::ipaddress as a) s1;\n      a       | family \n--------------+--------\n 1:2:3:4::7:8 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3:4::8'::ipaddress as a) s1;\n     a      | family \n------------+--------\n 1:2:3:4::8 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3::'::ipaddress as a) s1;\n    a    | family \n---------+--------\n 1:2:3:: |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3::1.2.3.4'::ipaddress as a) s1;\n       a        | family \n----------------+--------\n 1:2:3::102:304 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3::5:1.2.3.4'::ipaddress as a) s1;\n        a         | family \n------------------+--------\n 1:2:3::5:102:304 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3::7:8'::ipaddress as a) s1;\n     a      | family \n------------+--------\n 1:2:3::7:8 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2:3::8'::ipaddress as a) s1;\n    a     | family \n----------+--------\n 1:2:3::8 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2::'::ipaddress as a) s1;\n   a   | family \n-------+--------\n 1:2:: |      6\n(1 row)\n\nselect a, family(a) from (select '1:2::1.2.3.4'::ipaddress as a) s1;\n      a       | family \n--------------+--------\n 1:2::102:304 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2::5:1.2.3.4'::ipaddress as a) s1;\n       a        | family \n----------------+--------\n 1:2::5:102:304 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2::7:8'::ipaddress as a) s1;\n    a     | family \n----------+--------\n 1:2::7:8 |      6\n(1 row)\n\nselect a, family(a) from (select '1:2::8'::ipaddress as a) s1;\n   a    | family \n--------+--------\n 1:2::8 |      6\n(1 row)\n\nselect a, family(a) from (select '1::'::ipaddress as a) s1;\n  a  | family \n-----+--------\n 1:: |      6\n(1 row)\n\nselect a, family(a) from (select '1::1.2.3.4'::ipaddress as a) s1;\n     a      | family \n------------+--------\n 1::102:304 |      6\n(1 row)\n\nselect a, family(a) from (select '1::2:3'::ipaddress as a) s1;\n   a    | family \n--------+--------\n 1::2:3 |      6\n(1 row)\n\nselect a, family(a) from (select '1::2:3:4'::ipaddress as a) s1;\n    a     | family \n----------+--------\n 1::2:3:4 |      6\n(1 row)\n\nselect a, family(a) from (select '1::2:3:4:5'::ipaddress as a) s1;\n     a      | family \n------------+--------\n 1::2:3:4:5 |      6\n(1 row)\n\nselect a, family(a) from (select '1::2:3:4:5:6'::ipaddress as a) s1;\n      a       | family \n--------------+--------\n 1::2:3:4:5:6 |      6\n(1 row)\n\nselect a, family(a) from (select '1::2:3:4:5:6:7'::ipaddress as a) s1;\n        a        | family \n-----------------+--------\n 1:0:2:3:4:5:6:7 |      6\n(1 row)\n\nselect a, family(a) from (select '1::5:1.2.3.4'::ipaddress as a) s1;\n      a       | family \n--------------+--------\n 1::5:102:304 |      6\n(1 row)\n\nselect a, family(a) from (select '1::5:11.22.33.44'::ipaddress as a) s1;\n       a       | family \n---------------+--------\n 1::5:b16:212c |      6\n(1 row)\n\nselect a, family(a) from (select '1::7:8'::ipaddress as a) s1;\n   a    | family \n--------+--------\n 1::7:8 |      6\n(1 row)\n\nselect a, family(a) from (select '1::8'::ipaddress as a) s1;\n  a   | family \n------+--------\n 1::8 |      6\n(1 row)\n\nselect a, family(a) from (select '2001:0000:1234:0000:0000:C1C0:ABCD:0876'::ipaddress as a) s1;\n             a              | family \n----------------------------+--------\n 2001:0:1234::c1c0:abcd:876 |      6\n(1 row)\n\nselect a, family(a) from (select '2001:0db8:0000:0000:0000:0000:1428:57ab'::ipaddress as a) s1;\n          a          | family \n---------------------+--------\n 2001:db8::1428:57ab |      6\n(1 row)\n\nselect a, family(a) from (select '2001:0db8:0000:0000:0000::1428:57ab'::ipaddress as a) s1;\n          a          | family \n---------------------+--------\n 2001:db8::1428:57ab |      6\n(1 row)\n\nselect a, family(a) from (select '2001:0db8:0:0:0:0:1428:57ab'::ipaddress as a) s1;\n          a          | family \n---------------------+--------\n 2001:db8::1428:57ab |      6\n(1 row)\n\nselect a, family(a) from (select '2001:0db8:0:0::1428:57ab'::ipaddress as a) s1;\n          a          | family \n---------------------+--------\n 2001:db8::1428:57ab |      6\n(1 row)\n\nselect a, family(a) from (select '2001:0db8:1234:0000:0000:0000:0000:0000'::ipaddress as a) s1;\n        a        | family \n-----------------+--------\n 2001:db8:1234:: |      6\n(1 row)\n\nselect a, family(a) from (select '2001:0db8:1234::'::ipaddress as a) s1;\n        a        | family \n-----------------+--------\n 2001:db8:1234:: |      6\n(1 row)\n\nselect a, family(a) from (select '2001:0db8:1234:ffff:ffff:ffff:ffff:ffff'::ipaddress as a) s1;\n                   a                    | family \n----------------------------------------+--------\n 2001:db8:1234:ffff:ffff:ffff:ffff:ffff |      6\n(1 row)\n\nselect a, family(a) from (select '2001:0db8:85a3:0000:0000:8a2e:0370:7334'::ipaddress as a) s1;\n              a               | family \n------------------------------+--------\n 2001:db8:85a3::8a2e:370:7334 |      6\n(1 row)\n\nselect a, family(a) from (select '2001:0db8::1428:57ab'::ipaddress as a) s1;\n          a          | family \n---------------------+--------\n 2001:db8::1428:57ab |      6\n(1 row)\n\nselect a, family(a) from (select '2001:10::'::ipaddress as a) s1;\n     a     | family \n-----------+--------\n 2001:10:: |      6\n(1 row)\n\nselect a, family(a) from (select '2001::'::ipaddress as a) s1;\n   a    | family \n--------+--------\n 2001:: |      6\n(1 row)\n\nselect a, family(a) from (select '2001:DB8:0:0:8:800:200C:417A'::ipaddress as a) s1;\n             a             | family \n---------------------------+--------\n 2001:db8::8:800:200c:417a |      6\n(1 row)\n\nselect a, family(a) from (select '2001:DB8::8:800:200C:417A'::ipaddress as a) s1;\n             a             | family \n---------------------------+--------\n 2001:db8::8:800:200c:417a |      6\n(1 row)\n\nselect a, family(a) from (select '2001:db8:85a3:0:0:8a2e:370:7334'::ipaddress as a) s1;\n              a               | family \n------------------------------+--------\n 2001:db8:85a3::8a2e:370:7334 |      6\n(1 row)\n\nselect a, family(a) from (select '2001:db8:85a3::8a2e:370:7334'::ipaddress as a) s1;\n              a               | family \n------------------------------+--------\n 2001:db8:85a3::8a2e:370:7334 |      6\n(1 row)\n\nselect a, family(a) from (select '2001:db8::'::ipaddress as a) s1;\n     a      | family \n------------+--------\n 2001:db8:: |      6\n(1 row)\n\nselect a, family(a) from (select '2001:db8::'::ipaddress as a) s1;\n     a      | family \n------------+--------\n 2001:db8:: |      6\n(1 row)\n\nselect a, family(a) from (select '2001:db8::1428:57ab'::ipaddress as a) s1;\n          a          | family \n---------------------+--------\n 2001:db8::1428:57ab |      6\n(1 row)\n\nselect a, family(a) from (select '2001:db8:a::123'::ipaddress as a) s1;\n        a        | family \n-----------------+--------\n 2001:db8:a::123 |      6\n(1 row)\n\nselect a, family(a) from (select '2002::'::ipaddress as a) s1;\n   a    | family \n--------+--------\n 2002:: |      6\n(1 row)\n\nselect a, family(a) from (select '2::10'::ipaddress as a) s1;\n   a   | family \n-------+--------\n 2::10 |      6\n(1 row)\n\nselect a, family(a) from (select '3ffe:0b00:0000:0000:0001:0000:0000:000a'::ipaddress as a) s1;\n         a         | family \n-------------------+--------\n 3ffe:b00::1:0:0:a |      6\n(1 row)\n\nselect a, family(a) from (select '::'::ipaddress as a) s1;\n a  | family \n----+--------\n :: |      6\n(1 row)\n\nselect a, family(a) from (select '::1'::ipaddress as a) s1;\n  a  | family \n-----+--------\n ::1 |      6\n(1 row)\n\nselect a, family(a) from (select '::127.0.0.1'::ipaddress as a) s1;\n      a      | family \n-------------+--------\n ::127.0.0.1 |      6\n(1 row)\n\nselect a, family(a) from (select '::13.1.68.3'::ipaddress as a) s1;\n      a      | family \n-------------+--------\n ::13.1.68.3 |      6\n(1 row)\n\nselect a, family(a) from (select '::2:3'::ipaddress as a) s1;\n     a     | family \n-----------+--------\n ::0.2.0.3 |      6\n(1 row)\n\nselect a, family(a) from (select '::2:3:4'::ipaddress as a) s1;\n    a    | family \n---------+--------\n ::2:3:4 |      6\n(1 row)\n\nselect a, family(a) from (select '::2:3:4:5'::ipaddress as a) s1;\n     a     | family \n-----------+--------\n ::2:3:4:5 |      6\n(1 row)\n\nselect a, family(a) from (select '::2:3:4:5:6'::ipaddress as a) s1;\n      a      | family \n-------------+--------\n ::2:3:4:5:6 |      6\n(1 row)\n\nselect a, family(a) from (select '::2:3:4:5:6:7'::ipaddress as a) s1;\n       a       | family \n---------------+--------\n ::2:3:4:5:6:7 |      6\n(1 row)\n\nselect a, family(a) from (select '::2:3:4:5:6:7:8'::ipaddress as a) s1;\n        a        | family \n-----------------+--------\n 0:2:3:4:5:6:7:8 |      6\n(1 row)\n\nselect a, family(a) from (select '::8'::ipaddress as a) s1;\n  a  | family \n-----+--------\n ::8 |      6\n(1 row)\n\nselect a, family(a) from (select '::FFFF:129.144.52.38'::ipaddress as a) s1;\n          a           | family \n----------------------+--------\n ::ffff:129.144.52.38 |      6\n(1 row)\n\nselect a, family(a) from (select '::ffff:0:0'::ipaddress as a) s1;\n       a        | family \n----------------+--------\n ::ffff:0.0.0.0 |      6\n(1 row)\n\nselect a, family(a) from (select '::ffff:0:192.168.1.1'::ipaddress as a) s1;\n          a           | family \n----------------------+--------\n ::ffff:0:192.168.1.1 |      6\n(1 row)\n\nselect a, family(a) from (select '::ffff:1:1.2.3.4'::ipaddress as a) s1;\n        a         | family \n------------------+--------\n ::ffff:1:102:304 |      6\n(1 row)\n\nselect a, family(a) from (select '::ffff:0c22:384e'::ipaddress as a) s1;\n         a          | family \n--------------------+--------\n ::ffff:12.34.56.78 |      6\n(1 row)\n\nselect a, family(a) from (select '::ffff:12.34.56.78'::ipaddress as a) s1;\n         a          | family \n--------------------+--------\n ::ffff:12.34.56.78 |      6\n(1 row)\n\nselect a, family(a) from (select '::ffff:192.0.2.128'::ipaddress as a) s1;\n         a          | family \n--------------------+--------\n ::ffff:192.0.2.128 |      6\n(1 row)\n\nselect a, family(a) from (select '::ffff:192.168.1.1'::ipaddress as a) s1;\n         a          | family \n--------------------+--------\n ::ffff:192.168.1.1 |      6\n(1 row)\n\nselect a, family(a) from (select '::ffff:192.168.1.26'::ipaddress as a) s1;\n          a          | family \n---------------------+--------\n ::ffff:192.168.1.26 |      6\n(1 row)\n\nselect a, family(a) from (select '::ffff:c000:280'::ipaddress as a) s1;\n         a          | family \n--------------------+--------\n ::ffff:192.0.2.128 |      6\n(1 row)\n\nselect a, family(a) from (select 'FF01:0:0:0:0:0:0:101'::ipaddress as a) s1;\n     a     | family \n-----------+--------\n ff01::101 |      6\n(1 row)\n\nselect a, family(a) from (select 'FF01::101'::ipaddress as a) s1;\n     a     | family \n-----------+--------\n ff01::101 |      6\n(1 row)\n\nselect a, family(a) from (select 'FF02:0000:0000:0000:0000:0000:0000:0001'::ipaddress as a) s1;\n    a    | family \n---------+--------\n ff02::1 |      6\n(1 row)\n\nselect a, family(a) from (select 'fc00::'::ipaddress as a) s1;\n   a    | family \n--------+--------\n fc00:: |      6\n(1 row)\n\nselect a, family(a) from (select 'fe80:0000:0000:0000:0204:61ff:fe9d:f156'::ipaddress as a) s1;\n            a             | family \n--------------------------+--------\n fe80::204:61ff:fe9d:f156 |      6\n(1 row)\n\nselect a, family(a) from (select 'fe80:0:0:0:204:61ff:254.157.241.86'::ipaddress as a) s1;\n            a             | family \n--------------------------+--------\n fe80::204:61ff:fe9d:f156 |      6\n(1 row)\n\nselect a, family(a) from (select 'fe80:0:0:0:204:61ff:fe9d:f156'::ipaddress as a) s1;\n            a             | family \n--------------------------+--------\n fe80::204:61ff:fe9d:f156 |      6\n(1 row)\n\nselect a, family(a) from (select 'fe80::'::ipaddress as a) s1;\n   a    | family \n--------+--------\n fe80:: |      6\n(1 row)\n\nselect a, family(a) from (select 'fe80::1'::ipaddress as a) s1;\n    a    | family \n---------+--------\n fe80::1 |      6\n(1 row)\n\nselect a, family(a) from (select 'fe80::204:61ff:254.157.241.86'::ipaddress as a) s1;\n            a             | family \n--------------------------+--------\n fe80::204:61ff:fe9d:f156 |      6\n(1 row)\n\nselect a, family(a) from (select 'fe80::204:61ff:fe9d:f156'::ipaddress as a) s1;\n            a             | family \n--------------------------+--------\n fe80::204:61ff:fe9d:f156 |      6\n(1 row)\n\nselect a, family(a) from (select 'fe80::217:f2ff:254.7.237.98'::ipaddress as a) s1;\n            a             | family \n--------------------------+--------\n fe80::217:f2ff:fe07:ed62 |      6\n(1 row)\n\nselect a, family(a) from (select 'fe80::217:f2ff:fe07:ed62'::ipaddress as a) s1;\n            a             | family \n--------------------------+--------\n fe80::217:f2ff:fe07:ed62 |      6\n(1 row)\n\nselect a, family(a) from (select 'ff02::1'::ipaddress as a) s1;\n    a    | family \n---------+--------\n ff02::1 |      6\n(1 row)\n\n-- invalid ipaddress\nselect '1.2.3'::ipaddress;\nERROR:  invalid IP value: '1.2.3' at character 8\nselect '0'::ipaddress;\nERROR:  invalid IP value: '0' at character 8\nselect ' 1.2.3.4'::ipaddress;\nERROR:  invalid IP value: ' 1.2.3.4' at character 8\nselect '1.2.3.4 '::ipaddress;\nERROR:  invalid IP value: '1.2.3.4 ' at character 8\nselect '0.0.0.256'::ipaddress;\nERROR:  invalid IP value: '0.0.0.256' at character 8\nselect '0.0.256'::ipaddress;\nERROR:  invalid IP value: '0.0.256' at character 8\nselect '0..255.0'::ipaddress;\nERROR:  invalid IP value: '0..255.0' at character 8\nselect '+0.255.0.0'::ipaddress;\nERROR:  invalid IP value: '+0.255.0.0' at character 8\nselect '1.2.3.4-1.2.3.4'::ipaddress;\nERROR:  invalid IP value: '1.2.3.4-1.2.3.4' at character 8\nselect ''::ipaddress;\nERROR:  invalid IP value: '' at character 8\nselect '02001:0000:1234:0000:0000:C1C0:ABCD:0876'::ipaddress;\nERROR:  invalid IP value: '02001:0000:1234:0000:0000:C1C0:ABCD:0876' at character 8\nselect '1.2.3.4:1111:2222:3333:4444::5555'::ipaddress;\nERROR:  invalid IP value: '1.2.3.4:1111:2222:3333:4444::5555' at character 8\nselect '1.2.3.4:1111:2222:3333::5555'::ipaddress;\nERROR:  invalid IP value: '1.2.3.4:1111:2222:3333::5555' at character 8\nselect '1.2.3.4:1111:2222::5555'::ipaddress;\nERROR:  invalid IP value: '1.2.3.4:1111:2222::5555' at character 8\nselect '1.2.3.4:1111::5555'::ipaddress;\nERROR:  invalid IP value: '1.2.3.4:1111::5555' at character 8\nselect '1.2.3.4::'::ipaddress;\nERROR:  invalid IP value: '1.2.3.4::' at character 8\nselect '1.2.3.4::5555'::ipaddress;\nERROR:  invalid IP value: '1.2.3.4::5555' at character 8\nselect '1111:'::ipaddress;\nERROR:  invalid IP value: '1111:' at character 8\nselect '1111:2222:3333:4444::5555:'::ipaddress;\nERROR:  invalid IP value: '1111:2222:3333:4444::5555:' at character 8\nselect '1111:2222:3333::5555:'::ipaddress;\nERROR:  invalid IP value: '1111:2222:3333::5555:' at character 8\nselect '1111:2222::5555:'::ipaddress;\nERROR:  invalid IP value: '1111:2222::5555:' at character 8\nselect '1111::5555:'::ipaddress;\nERROR:  invalid IP value: '1111::5555:' at character 8\nselect '123'::ipaddress;\nERROR:  invalid IP value: '123' at character 8\nselect '12345::6:7:8'::ipaddress;\nERROR:  invalid IP value: '12345::6:7:8' at character 8\nselect '1:2:3:4:5:6:7:8:9'::ipaddress;\nERROR:  invalid IP value: '1:2:3:4:5:6:7:8:9' at character 8\nselect '1:2:3::4:5:6:7:8:9'::ipaddress;\nERROR:  invalid IP value: '1:2:3::4:5:6:7:8:9' at character 8\nselect '1:2:3::4:5::7:8'::ipaddress;\nERROR:  invalid IP value: '1:2:3::4:5::7:8' at character 8\nselect '1::1.2.256.4'::ipaddress;\nERROR:  invalid IP value: '1::1.2.256.4' at character 8\nselect '1::1.2.3.256'::ipaddress;\nERROR:  invalid IP value: '1::1.2.3.256' at character 8\nselect '1::1.2.3.300'::ipaddress;\nERROR:  invalid IP value: '1::1.2.3.300' at character 8\nselect '1::1.2.3.900'::ipaddress;\nERROR:  invalid IP value: '1::1.2.3.900' at character 8\nselect '1::1.2.300.4'::ipaddress;\nERROR:  invalid IP value: '1::1.2.300.4' at character 8\nselect '1::1.2.900.4'::ipaddress;\nERROR:  invalid IP value: '1::1.2.900.4' at character 8\nselect '1::1.256.3.4'::ipaddress;\nERROR:  invalid IP value: '1::1.256.3.4' at character 8\nselect '1::1.300.3.4'::ipaddress;\nERROR:  invalid IP value: '1::1.300.3.4' at character 8\nselect '1::1.900.3.4'::ipaddress;\nERROR:  invalid IP value: '1::1.900.3.4' at character 8\nselect '1::256.2.3.4'::ipaddress;\nERROR:  invalid IP value: '1::256.2.3.4' at character 8\nselect '1::260.2.3.4'::ipaddress;\nERROR:  invalid IP value: '1::260.2.3.4' at character 8\nselect '1::2::3'::ipaddress;\nERROR:  invalid IP value: '1::2::3' at character 8\nselect '1::300.2.3.4'::ipaddress;\nERROR:  invalid IP value: '1::300.2.3.4' at character 8\nselect '1::300.300.300.300'::ipaddress;\nERROR:  invalid IP value: '1::300.300.300.300' at character 8\nselect '1::3000.30.30.30'::ipaddress;\nERROR:  invalid IP value: '1::3000.30.30.30' at character 8\nselect '1::400.2.3.4'::ipaddress;\nERROR:  invalid IP value: '1::400.2.3.4' at character 8\nselect '1::5:1.2.256.4'::ipaddress;\nERROR:  invalid IP value: '1::5:1.2.256.4' at character 8\nselect '1::5:1.2.3.256'::ipaddress;\nERROR:  invalid IP value: '1::5:1.2.3.256' at character 8\nselect '1::5:1.2.3.300'::ipaddress;\nERROR:  invalid IP value: '1::5:1.2.3.300' at character 8\nselect '1::5:1.2.3.900'::ipaddress;\nERROR:  invalid IP value: '1::5:1.2.3.900' at character 8\nselect '1::5:1.2.300.4'::ipaddress;\nERROR:  invalid IP value: '1::5:1.2.300.4' at character 8\nselect '1::5:1.2.900.4'::ipaddress;\nERROR:  invalid IP value: '1::5:1.2.900.4' at character 8\nselect '1::5:1.256.3.4'::ipaddress;\nERROR:  invalid IP value: '1::5:1.256.3.4' at character 8\nselect '1::5:1.300.3.4'::ipaddress;\nERROR:  invalid IP value: '1::5:1.300.3.4' at character 8\nselect '1::5:1.900.3.4'::ipaddress;\nERROR:  invalid IP value: '1::5:1.900.3.4' at character 8\nselect '1::5:256.2.3.4'::ipaddress;\nERROR:  invalid IP value: '1::5:256.2.3.4' at character 8\nselect '1::5:260.2.3.4'::ipaddress;\nERROR:  invalid IP value: '1::5:260.2.3.4' at character 8\nselect '1::5:300.2.3.4'::ipaddress;\nERROR:  invalid IP value: '1::5:300.2.3.4' at character 8\nselect '1::5:300.300.300.300'::ipaddress;\nERROR:  invalid IP value: '1::5:300.300.300.300' at character 8\nselect '1::5:3000.30.30.30'::ipaddress;\nERROR:  invalid IP value: '1::5:3000.30.30.30' at character 8\nselect '1::5:400.2.3.4'::ipaddress;\nERROR:  invalid IP value: '1::5:400.2.3.4' at character 8\nselect '1::5:900.2.3.4'::ipaddress;\nERROR:  invalid IP value: '1::5:900.2.3.4' at character 8\nselect '1::900.2.3.4'::ipaddress;\nERROR:  invalid IP value: '1::900.2.3.4' at character 8\nselect '1:::3:4:5'::ipaddress;\nERROR:  invalid IP value: '1:::3:4:5' at character 8\nselect '2001:0000:1234: 0000:0000:C1C0:ABCD:0876'::ipaddress;\nERROR:  invalid IP value: '2001:0000:1234: 0000:0000:C1C0:ABCD:0876' at character 8\nselect '2001:0000:1234:0000:00001:C1C0:ABCD:0876'::ipaddress;\nERROR:  invalid IP value: '2001:0000:1234:0000:00001:C1C0:ABCD:0876' at character 8\nselect '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'::ipaddress;\nERROR:  invalid IP value: '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0' at character 8\nselect '2001::FFD3::57ab'::ipaddress;\nERROR:  invalid IP value: '2001::FFD3::57ab' at character 8\nselect '2001:DB8:0:0:8:800:200C:417A:221'::ipaddress;\nERROR:  invalid IP value: '2001:DB8:0:0:8:800:200C:417A:221' at character 8\nselect '2001:db8:85a3::8a2e:37023:7334'::ipaddress;\nERROR:  invalid IP value: '2001:db8:85a3::8a2e:37023:7334' at character 8\nselect '2001:db8:85a3::8a2e:370k:7334'::ipaddress;\nERROR:  invalid IP value: '2001:db8:85a3::8a2e:370k:7334' at character 8\nselect '3ffe:0b00:0000:0001:0000:0000:000a'::ipaddress;\nERROR:  invalid IP value: '3ffe:0b00:0000:0001:0000:0000:000a' at character 8\nselect '3ffe:b00::1::a'::ipaddress;\nERROR:  invalid IP value: '3ffe:b00::1::a' at character 8\nselect ':'::ipaddress;\nERROR:  invalid IP value: ':' at character 8\nselect ':1111:2222:3333:4444::5555'::ipaddress;\nERROR:  invalid IP value: ':1111:2222:3333:4444::5555' at character 8\nselect ':1111:2222:3333::5555'::ipaddress;\nERROR:  invalid IP value: ':1111:2222:3333::5555' at character 8\nselect ':1111:2222::5555'::ipaddress;\nERROR:  invalid IP value: ':1111:2222::5555' at character 8\nselect ':1111::5555'::ipaddress;\nERROR:  invalid IP value: ':1111::5555' at character 8\nselect '::1.2.256.4'::ipaddress;\nERROR:  invalid IP value: '::1.2.256.4' at character 8\nselect '::1.2.3.256'::ipaddress;\nERROR:  invalid IP value: '::1.2.3.256' at character 8\nselect '::1.2.3.300'::ipaddress;\nERROR:  invalid IP value: '::1.2.3.300' at character 8\nselect '::1.2.3.900'::ipaddress;\nERROR:  invalid IP value: '::1.2.3.900' at character 8\nselect '::1.2.300.4'::ipaddress;\nERROR:  invalid IP value: '::1.2.300.4' at character 8\nselect '::1.2.900.4'::ipaddress;\nERROR:  invalid IP value: '::1.2.900.4' at character 8\nselect '::1.256.3.4'::ipaddress;\nERROR:  invalid IP value: '::1.256.3.4' at character 8\nselect '::1.300.3.4'::ipaddress;\nERROR:  invalid IP value: '::1.300.3.4' at character 8\nselect '::1.900.3.4'::ipaddress;\nERROR:  invalid IP value: '::1.900.3.4' at character 8\nselect '::1111:2222:3333:4444:5555:6666::'::ipaddress;\nERROR:  invalid IP value: '::1111:2222:3333:4444:5555:6666::' at character 8\nselect '::256.2.3.4'::ipaddress;\nERROR:  invalid IP value: '::256.2.3.4' at character 8\nselect '::260.2.3.4'::ipaddress;\nERROR:  invalid IP value: '::260.2.3.4' at character 8\nselect '::300.2.3.4'::ipaddress;\nERROR:  invalid IP value: '::300.2.3.4' at character 8\nselect '::300.300.300.300'::ipaddress;\nERROR:  invalid IP value: '::300.300.300.300' at character 8\nselect '::3000.30.30.30'::ipaddress;\nERROR:  invalid IP value: '::3000.30.30.30' at character 8\nselect '::400.2.3.4'::ipaddress;\nERROR:  invalid IP value: '::400.2.3.4' at character 8\nselect '::5555:'::ipaddress;\nERROR:  invalid IP value: '::5555:' at character 8\nselect '::900.2.3.4'::ipaddress;\nERROR:  invalid IP value: '::900.2.3.4' at character 8\nselect ':::'::ipaddress;\nERROR:  invalid IP value: ':::' at character 8\nselect ':::5555'::ipaddress;\nERROR:  invalid IP value: ':::5555' at character 8\nselect '::ffff:2.3.4'::ipaddress;\nERROR:  invalid IP value: '::ffff:2.3.4' at character 8\nselect '::ffff:257.1.2.3'::ipaddress;\nERROR:  invalid IP value: '::ffff:257.1.2.3' at character 8\nselect 'FF01::101::2'::ipaddress;\nERROR:  invalid IP value: 'FF01::101::2' at character 8\nselect 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'::ipaddress;\nERROR:  invalid IP value: 'FF02:0000:0000:0000:0000:0000:0000:0000:0001' at character 8\nselect 'ldkfj'::ipaddress;\nERROR:  invalid IP value: 'ldkfj' at character 8\n-- valid iprange\nselect r, family(r), iprange_size(r) from (select '-'::iprange as r) s;\n r | family |     iprange_size     \n---+--------+----------------------\n - |        | 6.80564733841877e+38\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '1.2.3.4'::iprange as r) s;\n    r    | family | iprange_size \n---------+--------+--------------\n 1.2.3.4 |      4 |            1\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.255.255/32'::iprange as r) s;\n        r        | family | iprange_size \n-----------------+--------+--------------\n 255.255.255.255 |      4 |            1\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.255.254/31'::iprange as r) s;\n         r          | family | iprange_size \n--------------------+--------+--------------\n 255.255.255.254/31 |      4 |            2\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.255.252/30'::iprange as r) s;\n         r          | family | iprange_size \n--------------------+--------+--------------\n 255.255.255.252/30 |      4 |            4\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.255.248/29'::iprange as r) s;\n         r          | family | iprange_size \n--------------------+--------+--------------\n 255.255.255.248/29 |      4 |            8\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.255.240/28'::iprange as r) s;\n         r          | family | iprange_size \n--------------------+--------+--------------\n 255.255.255.240/28 |      4 |           16\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.255.224/27'::iprange as r) s;\n         r          | family | iprange_size \n--------------------+--------+--------------\n 255.255.255.224/27 |      4 |           32\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.255.192/26'::iprange as r) s;\n         r          | family | iprange_size \n--------------------+--------+--------------\n 255.255.255.192/26 |      4 |           64\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.255.128/25'::iprange as r) s;\n         r          | family | iprange_size \n--------------------+--------+--------------\n 255.255.255.128/25 |      4 |          128\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.255.0/24'::iprange as r) s;\n        r         | family | iprange_size \n------------------+--------+--------------\n 255.255.255.0/24 |      4 |          256\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.254.0/23'::iprange as r) s;\n        r         | family | iprange_size \n------------------+--------+--------------\n 255.255.254.0/23 |      4 |          512\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.252.0/22'::iprange as r) s;\n        r         | family | iprange_size \n------------------+--------+--------------\n 255.255.252.0/22 |      4 |         1024\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.248.0/21'::iprange as r) s;\n        r         | family | iprange_size \n------------------+--------+--------------\n 255.255.248.0/21 |      4 |         2048\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.240.0/20'::iprange as r) s;\n        r         | family | iprange_size \n------------------+--------+--------------\n 255.255.240.0/20 |      4 |         4096\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.224.0/19'::iprange as r) s;\n        r         | family | iprange_size \n------------------+--------+--------------\n 255.255.224.0/19 |      4 |         8192\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.192.0/18'::iprange as r) s;\n        r         | family | iprange_size \n------------------+--------+--------------\n 255.255.192.0/18 |      4 |        16384\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.128.0/17'::iprange as r) s;\n        r         | family | iprange_size \n------------------+--------+--------------\n 255.255.128.0/17 |      4 |        32768\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.255.0.0/16'::iprange as r) s;\n       r        | family | iprange_size \n----------------+--------+--------------\n 255.255.0.0/16 |      4 |        65536\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.254.0.0/15'::iprange as r) s;\n       r        | family | iprange_size \n----------------+--------+--------------\n 255.254.0.0/15 |      4 |       131072\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.252.0.0/14'::iprange as r) s;\n       r        | family | iprange_size \n----------------+--------+--------------\n 255.252.0.0/14 |      4 |       262144\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.248.0.0/13'::iprange as r) s;\n       r        | family | iprange_size \n----------------+--------+--------------\n 255.248.0.0/13 |      4 |       524288\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.240.0.0/12'::iprange as r) s;\n       r        | family | iprange_size \n----------------+--------+--------------\n 255.240.0.0/12 |      4 |      1048576\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.224.0.0/11'::iprange as r) s;\n       r        | family | iprange_size \n----------------+--------+--------------\n 255.224.0.0/11 |      4 |      2097152\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.192.0.0/10'::iprange as r) s;\n       r        | family | iprange_size \n----------------+--------+--------------\n 255.192.0.0/10 |      4 |      4194304\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.128.0.0/9'::iprange as r) s;\n       r       | family | iprange_size \n---------------+--------+--------------\n 255.128.0.0/9 |      4 |      8388608\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '255.0.0.0/8'::iprange as r) s;\n      r      | family | iprange_size \n-------------+--------+--------------\n 255.0.0.0/8 |      4 |     16777216\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '254.0.0.0/7'::iprange as r) s;\n      r      | family | iprange_size \n-------------+--------+--------------\n 254.0.0.0/7 |      4 |     33554432\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '252.0.0.0/6'::iprange as r) s;\n      r      | family | iprange_size \n-------------+--------+--------------\n 252.0.0.0/6 |      4 |     67108864\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '248.0.0.0/5'::iprange as r) s;\n      r      | family | iprange_size \n-------------+--------+--------------\n 248.0.0.0/5 |      4 |    134217728\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '240.0.0.0/4'::iprange as r) s;\n      r      | family | iprange_size \n-------------+--------+--------------\n 240.0.0.0/4 |      4 |    268435456\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '224.0.0.0/3'::iprange as r) s;\n      r      | family | iprange_size \n-------------+--------+--------------\n 224.0.0.0/3 |      4 |    536870912\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '192.0.0.0/2'::iprange as r) s;\n      r      | family | iprange_size \n-------------+--------+--------------\n 192.0.0.0/2 |      4 |   1073741824\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '128.0.0.0/1'::iprange as r) s;\n      r      | family | iprange_size \n-------------+--------+--------------\n 128.0.0.0/1 |      4 |   2147483648\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '0.0.0.0/0'::iprange as r) s;\n     r     | family | iprange_size \n-----------+--------+--------------\n 0.0.0.0/0 |      4 |   4294967296\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '1.2.3.4-5.6.7.8'::iprange as r) s;\n        r        | family | iprange_size \n-----------------+--------+--------------\n 1.2.3.4-5.6.7.8 |      4 |     67372037\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '5.6.7.8-1.2.3.4'::iprange as r) s;\n        r        | family | iprange_size \n-----------------+--------+--------------\n 1.2.3.4-5.6.7.8 |      4 |     67372037\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '1.2.3.4-1.2.3.4'::iprange as r) s;\n    r    | family | iprange_size \n---------+--------+--------------\n 1.2.3.4 |      4 |            1\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '::'::iprange as r) s;\n r  | family | iprange_size \n----+--------+--------------\n :: |      6 |            1\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::iprange as r) s;\n                    r                    | family | iprange_size \n-----------------------------------------+--------+--------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff |      6 |            1\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '1::2'::iprange as r) s;\n  r   | family | iprange_size \n------+--------+--------------\n 1::2 |      6 |            1\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::iprange as r) s;\n  r   | family |     iprange_size     \n------+--------+----------------------\n ::/0 |      6 | 3.40282366920938e+38\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::iprange as r) s;\n  r   | family |     iprange_size     \n------+--------+----------------------\n ::/0 |      6 | 3.40282366920938e+38\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '1::2-3::4'::iprange as r) s;\n     r     | family |     iprange_size     \n-----------+--------+----------------------\n 1::2-3::4 |      6 | 1.03845937170697e+34\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '3::4-3::4'::iprange as r) s;\n  r   | family | iprange_size \n------+--------+--------------\n 3::4 |      6 |            1\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '3::4-1::2'::iprange as r) s;\n     r     | family |     iprange_size     \n-----------+--------+----------------------\n 1::2-3::4 |      6 | 1.03845937170697e+34\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::iprange as r) s;\n                    r                    | family | iprange_size \n-----------------------------------------+--------+--------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff |      6 |            1\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127'::iprange as r) s;\n                      r                      | family | iprange_size \n---------------------------------------------+--------+--------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127 |      6 |            2\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126'::iprange as r) s;\n                      r                      | family | iprange_size \n---------------------------------------------+--------+--------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126 |      6 |            4\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125'::iprange as r) s;\n                      r                      | family | iprange_size \n---------------------------------------------+--------+--------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125 |      6 |            8\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124'::iprange as r) s;\n                      r                      | family | iprange_size \n---------------------------------------------+--------+--------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124 |      6 |           16\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120'::iprange as r) s;\n                      r                      | family | iprange_size \n---------------------------------------------+--------+--------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120 |      6 |          256\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116'::iprange as r) s;\n                      r                      | family | iprange_size \n---------------------------------------------+--------+--------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116 |      6 |         4096\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0000/112'::iprange as r) s;\n                    r                     | family | iprange_size \n------------------------------------------+--------+--------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:0/112 |      6 |        65536\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:0000:0000/96'::iprange as r) s;\n                 r                  | family | iprange_size \n------------------------------------+--------+--------------\n ffff:ffff:ffff:ffff:ffff:ffff::/96 |      6 |   4294967296\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:0000:0000:0000/80'::iprange as r) s;\n               r               | family |  iprange_size   \n-------------------------------+--------+-----------------\n ffff:ffff:ffff:ffff:ffff::/80 |      6 | 281474976710656\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:fff0:0000:0000:0000/76'::iprange as r) s;\n               r               | family |    iprange_size     \n-------------------------------+--------+---------------------\n ffff:ffff:ffff:ffff:fff0::/76 |      6 | 4.5035996273705e+15\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ff00:0000:0000:0000/72'::iprange as r) s;\n               r               | family |     iprange_size     \n-------------------------------+--------+----------------------\n ffff:ffff:ffff:ffff:ff00::/72 |      6 | 7.20575940379279e+16\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:f000:0000:0000:0000/68'::iprange as r) s;\n               r               | family |     iprange_size     \n-------------------------------+--------+----------------------\n ffff:ffff:ffff:ffff:f000::/68 |      6 | 1.15292150460685e+18\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:e000:0000:0000:0000/67'::iprange as r) s;\n               r               | family |     iprange_size     \n-------------------------------+--------+----------------------\n ffff:ffff:ffff:ffff:e000::/67 |      6 | 2.30584300921369e+18\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:c000:0000:0000:0000/66'::iprange as r) s;\n               r               | family |     iprange_size     \n-------------------------------+--------+----------------------\n ffff:ffff:ffff:ffff:c000::/66 |      6 | 4.61168601842739e+18\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:8000:0000:0000:0000/65'::iprange as r) s;\n               r               | family |     iprange_size     \n-------------------------------+--------+----------------------\n ffff:ffff:ffff:ffff:8000::/65 |      6 | 9.22337203685478e+18\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:0000:0000:0000:0000/64'::iprange as r) s;\n            r             | family |     iprange_size     \n--------------------------+--------+----------------------\n ffff:ffff:ffff:ffff::/64 |      6 | 1.84467440737096e+19\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:fffe:0000:0000:0000:0000/63'::iprange as r) s;\n            r             | family |     iprange_size     \n--------------------------+--------+----------------------\n ffff:ffff:ffff:fffe::/63 |      6 | 3.68934881474191e+19\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:fffc:0000:0000:0000:0000/62'::iprange as r) s;\n            r             | family |     iprange_size     \n--------------------------+--------+----------------------\n ffff:ffff:ffff:fffc::/62 |      6 | 7.37869762948382e+19\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:fff8:0000:0000:0000:0000/61'::iprange as r) s;\n            r             | family |     iprange_size     \n--------------------------+--------+----------------------\n ffff:ffff:ffff:fff8::/61 |      6 | 1.47573952589676e+20\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:fff0:0000:0000:0000:0000/60'::iprange as r) s;\n            r             | family |     iprange_size     \n--------------------------+--------+----------------------\n ffff:ffff:ffff:fff0::/60 |      6 | 2.95147905179353e+20\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ff00:0000:0000:0000:0000/56'::iprange as r) s;\n            r             | family |     iprange_size     \n--------------------------+--------+----------------------\n ffff:ffff:ffff:ff00::/56 |      6 | 4.72236648286965e+21\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:f000:0000:0000:0000:0000/52'::iprange as r) s;\n            r             | family |     iprange_size     \n--------------------------+--------+----------------------\n ffff:ffff:ffff:f000::/52 |      6 | 7.55578637259143e+22\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:0000:0000:0000:0000:0000/48'::iprange as r) s;\n          r          | family |     iprange_size     \n---------------------+--------+----------------------\n ffff:ffff:ffff::/48 |      6 | 1.20892581961463e+24\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:0000:0000:0000:0000:0000:0000/32'::iprange as r) s;\n       r        | family |     iprange_size     \n----------------+--------+----------------------\n ffff:ffff::/32 |      6 | 7.92281625142643e+28\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ffff:0000:0000:0000:0000:0000:0000:0000/16'::iprange as r) s;\n     r     | family |     iprange_size     \n-----------+--------+----------------------\n ffff::/16 |      6 | 5.19229685853483e+33\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'fff0:0000:0000:0000:0000:0000:0000:0000/12'::iprange as r) s;\n     r     | family |     iprange_size     \n-----------+--------+----------------------\n fff0::/12 |      6 | 8.30767497365572e+34\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'ff00:0000:0000:0000:0000:0000:0000:0000/8'::iprange as r) s;\n    r     | family |     iprange_size     \n----------+--------+----------------------\n ff00::/8 |      6 | 1.32922799578492e+36\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'f000:0000:0000:0000:0000:0000:0000:0000/4'::iprange as r) s;\n    r     | family |     iprange_size     \n----------+--------+----------------------\n f000::/4 |      6 | 2.12676479325587e+37\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'e000:0000:0000:0000:0000:0000:0000:0000/3'::iprange as r) s;\n    r     | family |     iprange_size     \n----------+--------+----------------------\n e000::/3 |      6 | 4.25352958651173e+37\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select 'c000:0000:0000:0000:0000:0000:0000:0000/2'::iprange as r) s;\n    r     | family |     iprange_size     \n----------+--------+----------------------\n c000::/2 |      6 | 8.50705917302346e+37\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '8000:0000:0000:0000:0000:0000:0000:0000/1'::iprange as r) s;\n    r     | family |     iprange_size     \n----------+--------+----------------------\n 8000::/1 |      6 | 1.70141183460469e+38\n(1 row)\n\nselect r, family(r), iprange_size(r) from (select '0000:0000:0000:0000:0000:0000:0000:0000/0'::iprange as r) s;\n  r   | family |     iprange_size     \n------+--------+----------------------\n ::/0 |      6 | 3.40282366920938e+38\n(1 row)\n\n-- invalid iprange\nselect '1.2.3'::iprange;\nERROR:  invalid IP4R value: \"1.2.3\" at character 8\nselect '255.255.255.255.255.255.255.255.255'::iprange;\nERROR:  invalid IP4R value: \"255.255.255.255.255.255.255.255.255\" at character 8\nselect '255.255.255.255.255-255.255.255.255.255'::iprange;\nERROR:  invalid IP4R value: \"255.255.255.255.255-255.255.255.255.255\" at character 8\nselect '255.255.255.255-1.2.3.4.5'::iprange;\nERROR:  invalid IP4R value: \"255.255.255.255-1.2.3.4.5\" at character 8\nselect '255.255.255.255-1.2.3'::iprange;\nERROR:  invalid IP4R value: \"255.255.255.255-1.2.3\" at character 8\nselect '0.0.0.1/31'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/31\" at character 8\nselect '0.0.0.1/30'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/30\" at character 8\nselect '0.0.0.1/29'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/29\" at character 8\nselect '0.0.0.1/28'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/28\" at character 8\nselect '0.0.0.1/27'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/27\" at character 8\nselect '0.0.0.1/26'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/26\" at character 8\nselect '0.0.0.1/25'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/25\" at character 8\nselect '0.0.0.1/24'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/24\" at character 8\nselect '0.0.0.1/23'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/23\" at character 8\nselect '0.0.0.1/22'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/22\" at character 8\nselect '0.0.0.1/21'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/21\" at character 8\nselect '0.0.0.1/20'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/20\" at character 8\nselect '0.0.0.1/19'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/19\" at character 8\nselect '0.0.0.1/18'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/18\" at character 8\nselect '0.0.0.1/17'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/17\" at character 8\nselect '0.0.0.1/16'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/16\" at character 8\nselect '0.0.0.1/15'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/15\" at character 8\nselect '0.0.0.1/14'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/14\" at character 8\nselect '0.0.0.1/13'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/13\" at character 8\nselect '0.0.0.1/12'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/12\" at character 8\nselect '0.0.0.1/11'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/11\" at character 8\nselect '0.0.0.1/10'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/10\" at character 8\nselect '0.0.0.1/9'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/9\" at character 8\nselect '0.0.0.1/8'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/8\" at character 8\nselect '0.0.0.1/7'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/7\" at character 8\nselect '0.0.0.1/6'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/6\" at character 8\nselect '0.0.0.1/5'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/5\" at character 8\nselect '0.0.0.1/4'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/4\" at character 8\nselect '0.0.0.1/3'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/3\" at character 8\nselect '0.0.0.1/2'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/2\" at character 8\nselect '0.0.0.1/1'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/1\" at character 8\nselect '0.0.0.1/0'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.1/0\" at character 8\nselect '0.0.0.2/30'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.2/30\" at character 8\nselect '0.0.0.4/29'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.4/29\" at character 8\nselect '0.0.0.8/28'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.8/28\" at character 8\nselect '0.0.0.16/27'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.16/27\" at character 8\nselect '0.0.0.32/26'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.32/26\" at character 8\nselect '0.0.0.64/25'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.64/25\" at character 8\nselect '0.0.0.128/24'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.128/24\" at character 8\nselect '0.0.1.0/23'::iprange;\nERROR:  invalid IP4R value: \"0.0.1.0/23\" at character 8\nselect '0.0.2.0/22'::iprange;\nERROR:  invalid IP4R value: \"0.0.2.0/22\" at character 8\nselect '0.0.4.0/21'::iprange;\nERROR:  invalid IP4R value: \"0.0.4.0/21\" at character 8\nselect '0.0.8.0/20'::iprange;\nERROR:  invalid IP4R value: \"0.0.8.0/20\" at character 8\nselect '0.0.16.0/19'::iprange;\nERROR:  invalid IP4R value: \"0.0.16.0/19\" at character 8\nselect '0.0.32.0/18'::iprange;\nERROR:  invalid IP4R value: \"0.0.32.0/18\" at character 8\nselect '0.0.64.0/17'::iprange;\nERROR:  invalid IP4R value: \"0.0.64.0/17\" at character 8\nselect '0.0.128.0/16'::iprange;\nERROR:  invalid IP4R value: \"0.0.128.0/16\" at character 8\nselect '0.1.0.0/15'::iprange;\nERROR:  invalid IP4R value: \"0.1.0.0/15\" at character 8\nselect '0.2.0.0/14'::iprange;\nERROR:  invalid IP4R value: \"0.2.0.0/14\" at character 8\nselect '0.4.0.0/13'::iprange;\nERROR:  invalid IP4R value: \"0.4.0.0/13\" at character 8\nselect '0.8.0.0/12'::iprange;\nERROR:  invalid IP4R value: \"0.8.0.0/12\" at character 8\nselect '0.16.0.0/11'::iprange;\nERROR:  invalid IP4R value: \"0.16.0.0/11\" at character 8\nselect '0.32.0.0/10'::iprange;\nERROR:  invalid IP4R value: \"0.32.0.0/10\" at character 8\nselect '0.64.0.0/9'::iprange;\nERROR:  invalid IP4R value: \"0.64.0.0/9\" at character 8\nselect '0.128.0.0/8'::iprange;\nERROR:  invalid IP4R value: \"0.128.0.0/8\" at character 8\nselect '1.0.0.0/7'::iprange;\nERROR:  invalid IP4R value: \"1.0.0.0/7\" at character 8\nselect '2.0.0.0/6'::iprange;\nERROR:  invalid IP4R value: \"2.0.0.0/6\" at character 8\nselect '4.0.0.0/5'::iprange;\nERROR:  invalid IP4R value: \"4.0.0.0/5\" at character 8\nselect '8.0.0.0/4'::iprange;\nERROR:  invalid IP4R value: \"8.0.0.0/4\" at character 8\nselect '16.0.0.0/3'::iprange;\nERROR:  invalid IP4R value: \"16.0.0.0/3\" at character 8\nselect '32.0.0.0/2'::iprange;\nERROR:  invalid IP4R value: \"32.0.0.0/2\" at character 8\nselect '64.0.0.0/1'::iprange;\nERROR:  invalid IP4R value: \"64.0.0.0/1\" at character 8\nselect '128.0.0.0/0'::iprange;\nERROR:  invalid IP4R value: \"128.0.0.0/0\" at character 8\nselect '0.0.0.0/33'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.0/33\" at character 8\nselect '0.0.0.0/3.0'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.0/3.0\" at character 8\nselect '0.0.0.0/+33'::iprange;\nERROR:  invalid IP4R value: \"0.0.0.0/+33\" at character 8\nselect '::-::-::'::iprange;\nERROR:  invalid IP6R value: \"::-::-::\" at character 8\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff'::ip6r;\nERROR:  invalid IP6R value: \"ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff\" at character 8\nselect '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::iprange;\nERROR:  invalid IP6R value: \"::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\" at character 8\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::iprange;\nERROR:  invalid IP6R value: \"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::\" at character 8\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::iprange;\nERROR:  invalid IP6R value: \"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/127'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/127\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/120'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/120\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/112'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/112\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/96'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/96\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/80'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/80\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/64'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/64\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/48'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/48\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/32'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/32\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/16'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/16\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/8'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/8\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/4'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/4\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0001/0'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0001/0\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0008/124'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0008/124\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:0080/120'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:0080/120\" at character 8\nselect '0000:0000:0000:0000:0000:0000:0000:8000/112'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:0000:8000/112\" at character 8\nselect '0000:0000:0000:0000:0000:0000:8000:0000/96'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:0000:8000:0000/96\" at character 8\nselect '0000:0000:0000:0000:0000:8000:0000:0000/80'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:0000:8000:0000:0000/80\" at character 8\nselect '0000:0000:0000:0000:8000:0000:0000:0000/64'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:0000:8000:0000:0000:0000/64\" at character 8\nselect '0000:0000:0000:8000:0000:0000:0000:0000/48'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:0000:8000:0000:0000:0000:0000/48\" at character 8\nselect '0000:0000:8000:0000:0000:0000:0000:0000/32'::iprange;\nERROR:  invalid IP6R value: \"0000:0000:8000:0000:0000:0000:0000:0000/32\" at character 8\nselect '0000:8000:0000:0000:0000:0000:0000:0000/16'::iprange;\nERROR:  invalid IP6R value: \"0000:8000:0000:0000:0000:0000:0000:0000/16\" at character 8\nselect '0080:0000:0000:0000:0000:0000:0000:0000/8'::iprange;\nERROR:  invalid IP6R value: \"0080:0000:0000:0000:0000:0000:0000:0000/8\" at character 8\nselect '0800:0000:0000:0000:0000:0000:0000:0000/4'::iprange;\nERROR:  invalid IP6R value: \"0800:0000:0000:0000:0000:0000:0000:0000/4\" at character 8\nselect '8000:0000:0000:0000:0000:0000:0000:0000/0'::iprange;\nERROR:  invalid IP6R value: \"8000:0000:0000:0000:0000:0000:0000:0000/0\" at character 8\nselect '::/129'::iprange;\nERROR:  invalid IP6R value: \"::/129\" at character 8\nselect '::/255'::iprange;\nERROR:  invalid IP6R value: \"::/255\" at character 8\nselect '::/256'::iprange;\nERROR:  invalid IP6R value: \"::/256\" at character 8\nselect '::/+0'::iprange;\nERROR:  invalid IP6R value: \"::/+0\" at character 8\nselect '::/0-0'::iprange;\nERROR:  invalid IP6R value: \"::/0-0\" at character 8\nselect '::-::/0'::iprange;\nERROR:  invalid IP6R value: \"::-::/0\" at character 8\nselect '-::'::iprange;\nERROR:  invalid IP6R value: \"-::\" at character 8\nselect '-1.2.3.4'::iprange;\nERROR:  invalid IP4R value: \"-1.2.3.4\" at character 8\nselect '1.2.3.4-'::iprange;\nERROR:  invalid IP4R value: \"1.2.3.4-\" at character 8\n-- canaries for portability issues in binary output\nselect r, encode(ip4_send(r),'hex') from (select '128.1.255.0'::ip4 as r) s;\n      r      |  encode  \n-------------+----------\n 128.1.255.0 | 8001ff00\n(1 row)\n\nselect r, encode(ip4_send(r),'hex') from (select '1.128.0.255'::ip4 as r) s;\n      r      |  encode  \n-------------+----------\n 1.128.0.255 | 018000ff\n(1 row)\n\nselect r, encode(ip4r_send(r),'hex') from (select '128.1.255.0/24'::ip4r as r) s;\n       r        |      encode      \n----------------+------------------\n 128.1.255.0/24 | 8001ff008001ffff\n(1 row)\n\nselect r, encode(ip4r_send(r),'hex') from (select '128.1.255.1-128.1.255.2'::ip4r as r) s;\n            r            |      encode      \n-------------------------+------------------\n 128.1.255.1-128.1.255.2 | 8001ff018001ff02\n(1 row)\n\nselect r, encode(ip6_send(r),'hex') from (select 'ffff::8000'::ip6 as r) s;\n     r      |              encode              \n------------+----------------------------------\n ffff::8000 | ffff0000000000000000000000008000\n(1 row)\n\nselect r, encode(ip6_send(r),'hex') from (select '8000::ffff'::ip6 as r) s;\n     r      |              encode              \n------------+----------------------------------\n 8000::ffff | 8000000000000000000000000000ffff\n(1 row)\n\nselect r, encode(ip6r_send(r),'hex') from (select 'ffff::8000/128'::ip6r as r) s;\n     r      |                              encode                              \n------------+------------------------------------------------------------------\n ffff::8000 | ffff0000000000000000000000008000ffff0000000000000000000000008000\n(1 row)\n\nselect r, encode(ip6r_send(r),'hex') from (select '8000::ffff/128'::ip6r as r) s;\n     r      |                              encode                              \n------------+------------------------------------------------------------------\n 8000::ffff | 8000000000000000000000000000ffff8000000000000000000000000000ffff\n(1 row)\n\nselect r, encode(ipaddress_send(r),'hex') from (select '128.1.255.0'::ipaddress as r) s;\n      r      |      encode      \n-------------+------------------\n 128.1.255.0 | 022001048001ff00\n(1 row)\n\nselect r, encode(ipaddress_send(r),'hex') from (select '1.128.0.255'::ipaddress as r) s;\n      r      |      encode      \n-------------+------------------\n 1.128.0.255 | 02200104018000ff\n(1 row)\n\nselect r, encode(iprange_send(r),'hex') from (select '128.1.255.0/24'::iprange as r) s;\n       r        |      encode      \n----------------+------------------\n 128.1.255.0/24 | 021801048001ff00\n(1 row)\n\nselect r, encode(iprange_send(r),'hex') from (select '128.1.255.1-128.1.255.2'::iprange as r) s;\n            r            |          encode          \n-------------------------+--------------------------\n 128.1.255.1-128.1.255.2 | 02ff01088001ff018001ff02\n(1 row)\n\nselect r, encode(ipaddress_send(r),'hex') from (select 'ffff::8000'::ipaddress as r) s;\n     r      |                  encode                  \n------------+------------------------------------------\n ffff::8000 | 03800110ffff0000000000000000000000008000\n(1 row)\n\nselect r, encode(ipaddress_send(r),'hex') from (select '8000::ffff'::ipaddress as r) s;\n     r      |                  encode                  \n------------+------------------------------------------\n 8000::ffff | 038001108000000000000000000000000000ffff\n(1 row)\n\nselect r, encode(iprange_send(r),'hex') from (select 'ffff::8000/128'::iprange as r) s;\n     r      |                  encode                  \n------------+------------------------------------------\n ffff::8000 | 03800110ffff0000000000000000000000008000\n(1 row)\n\nselect r, encode(iprange_send(r),'hex') from (select 'ffff::8000/120'::iprange as r) s;\n       r        |                  encode                  \n----------------+------------------------------------------\n ffff::8000/120 | 03780110ffff0000000000000000000000008000\n(1 row)\n\nselect r, encode(iprange_send(r),'hex') from (select 'ffff::8001-ffff::8002'::iprange as r) s;\n           r           |                                  encode                                  \n-----------------------+--------------------------------------------------------------------------\n ffff::8001-ffff::8002 | 03ff0120ffff0000000000000000000000008001ffff0000000000000000000000008002\n(1 row)\n\nselect r, encode(iprange_send(r),'hex') from (select '-'::iprange as r) s;\n r |  encode  \n---+----------\n - | 00ff0100\n(1 row)\n\n-- text casts and cross-type casts\nselect r::text  from (select '-'::iprange as r) s;\n r \n---\n -\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '1.2.3.4'::iprange as r) s;\n    r    |    r    |  lower  |  upper  \n---------+---------+---------+---------\n 1.2.3.4 | 1.2.3.4 | 1.2.3.4 | 1.2.3.4\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.255/32'::iprange as r) s;\n        r        |        r        |      lower      |      upper      \n-----------------+-----------------+-----------------+-----------------\n 255.255.255.255 | 255.255.255.255 | 255.255.255.255 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.254/31'::iprange as r) s;\n         r          |         r          |      lower      |      upper      \n--------------------+--------------------+-----------------+-----------------\n 255.255.255.254/31 | 255.255.255.254/31 | 255.255.255.254 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.252/30'::iprange as r) s;\n         r          |         r          |      lower      |      upper      \n--------------------+--------------------+-----------------+-----------------\n 255.255.255.252/30 | 255.255.255.252/30 | 255.255.255.252 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.248/29'::iprange as r) s;\n         r          |         r          |      lower      |      upper      \n--------------------+--------------------+-----------------+-----------------\n 255.255.255.248/29 | 255.255.255.248/29 | 255.255.255.248 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.240/28'::iprange as r) s;\n         r          |         r          |      lower      |      upper      \n--------------------+--------------------+-----------------+-----------------\n 255.255.255.240/28 | 255.255.255.240/28 | 255.255.255.240 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.224/27'::iprange as r) s;\n         r          |         r          |      lower      |      upper      \n--------------------+--------------------+-----------------+-----------------\n 255.255.255.224/27 | 255.255.255.224/27 | 255.255.255.224 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.192/26'::iprange as r) s;\n         r          |         r          |      lower      |      upper      \n--------------------+--------------------+-----------------+-----------------\n 255.255.255.192/26 | 255.255.255.192/26 | 255.255.255.192 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.128/25'::iprange as r) s;\n         r          |         r          |      lower      |      upper      \n--------------------+--------------------+-----------------+-----------------\n 255.255.255.128/25 | 255.255.255.128/25 | 255.255.255.128 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.0/24'::iprange as r) s;\n        r         |        r         |     lower     |      upper      \n------------------+------------------+---------------+-----------------\n 255.255.255.0/24 | 255.255.255.0/24 | 255.255.255.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.254.0/23'::iprange as r) s;\n        r         |        r         |     lower     |      upper      \n------------------+------------------+---------------+-----------------\n 255.255.254.0/23 | 255.255.254.0/23 | 255.255.254.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.252.0/22'::iprange as r) s;\n        r         |        r         |     lower     |      upper      \n------------------+------------------+---------------+-----------------\n 255.255.252.0/22 | 255.255.252.0/22 | 255.255.252.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.248.0/21'::iprange as r) s;\n        r         |        r         |     lower     |      upper      \n------------------+------------------+---------------+-----------------\n 255.255.248.0/21 | 255.255.248.0/21 | 255.255.248.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.240.0/20'::iprange as r) s;\n        r         |        r         |     lower     |      upper      \n------------------+------------------+---------------+-----------------\n 255.255.240.0/20 | 255.255.240.0/20 | 255.255.240.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.224.0/19'::iprange as r) s;\n        r         |        r         |     lower     |      upper      \n------------------+------------------+---------------+-----------------\n 255.255.224.0/19 | 255.255.224.0/19 | 255.255.224.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.192.0/18'::iprange as r) s;\n        r         |        r         |     lower     |      upper      \n------------------+------------------+---------------+-----------------\n 255.255.192.0/18 | 255.255.192.0/18 | 255.255.192.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.128.0/17'::iprange as r) s;\n        r         |        r         |     lower     |      upper      \n------------------+------------------+---------------+-----------------\n 255.255.128.0/17 | 255.255.128.0/17 | 255.255.128.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.0.0/16'::iprange as r) s;\n       r        |       r        |    lower    |      upper      \n----------------+----------------+-------------+-----------------\n 255.255.0.0/16 | 255.255.0.0/16 | 255.255.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.254.0.0/15'::iprange as r) s;\n       r        |       r        |    lower    |      upper      \n----------------+----------------+-------------+-----------------\n 255.254.0.0/15 | 255.254.0.0/15 | 255.254.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.252.0.0/14'::iprange as r) s;\n       r        |       r        |    lower    |      upper      \n----------------+----------------+-------------+-----------------\n 255.252.0.0/14 | 255.252.0.0/14 | 255.252.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.248.0.0/13'::iprange as r) s;\n       r        |       r        |    lower    |      upper      \n----------------+----------------+-------------+-----------------\n 255.248.0.0/13 | 255.248.0.0/13 | 255.248.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.240.0.0/12'::iprange as r) s;\n       r        |       r        |    lower    |      upper      \n----------------+----------------+-------------+-----------------\n 255.240.0.0/12 | 255.240.0.0/12 | 255.240.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.224.0.0/11'::iprange as r) s;\n       r        |       r        |    lower    |      upper      \n----------------+----------------+-------------+-----------------\n 255.224.0.0/11 | 255.224.0.0/11 | 255.224.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.192.0.0/10'::iprange as r) s;\n       r        |       r        |    lower    |      upper      \n----------------+----------------+-------------+-----------------\n 255.192.0.0/10 | 255.192.0.0/10 | 255.192.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.128.0.0/9'::iprange as r) s;\n       r       |       r       |    lower    |      upper      \n---------------+---------------+-------------+-----------------\n 255.128.0.0/9 | 255.128.0.0/9 | 255.128.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.0.0.0/8'::iprange as r) s;\n      r      |      r      |   lower   |      upper      \n-------------+-------------+-----------+-----------------\n 255.0.0.0/8 | 255.0.0.0/8 | 255.0.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '254.0.0.0/7'::iprange as r) s;\n      r      |      r      |   lower   |      upper      \n-------------+-------------+-----------+-----------------\n 254.0.0.0/7 | 254.0.0.0/7 | 254.0.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '252.0.0.0/6'::iprange as r) s;\n      r      |      r      |   lower   |      upper      \n-------------+-------------+-----------+-----------------\n 252.0.0.0/6 | 252.0.0.0/6 | 252.0.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '248.0.0.0/5'::iprange as r) s;\n      r      |      r      |   lower   |      upper      \n-------------+-------------+-----------+-----------------\n 248.0.0.0/5 | 248.0.0.0/5 | 248.0.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '240.0.0.0/4'::iprange as r) s;\n      r      |      r      |   lower   |      upper      \n-------------+-------------+-----------+-----------------\n 240.0.0.0/4 | 240.0.0.0/4 | 240.0.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '224.0.0.0/3'::iprange as r) s;\n      r      |      r      |   lower   |      upper      \n-------------+-------------+-----------+-----------------\n 224.0.0.0/3 | 224.0.0.0/3 | 224.0.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '192.0.0.0/2'::iprange as r) s;\n      r      |      r      |   lower   |      upper      \n-------------+-------------+-----------+-----------------\n 192.0.0.0/2 | 192.0.0.0/2 | 192.0.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '128.0.0.0/1'::iprange as r) s;\n      r      |      r      |   lower   |      upper      \n-------------+-------------+-----------+-----------------\n 128.0.0.0/1 | 128.0.0.0/1 | 128.0.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '0.0.0.0/0'::iprange as r) s;\n     r     |     r     |  lower  |      upper      \n-----------+-----------+---------+-----------------\n 0.0.0.0/0 | 0.0.0.0/0 | 0.0.0.0 | 255.255.255.255\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '1.2.3.4-5.6.7.8'::iprange as r) s;\n        r        |        r        |  lower  |  upper  \n-----------------+-----------------+---------+---------\n 1.2.3.4-5.6.7.8 | 1.2.3.4-5.6.7.8 | 1.2.3.4 | 5.6.7.8\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '5.6.7.8-1.2.3.4'::iprange as r) s;\n        r        |        r        |  lower  |  upper  \n-----------------+-----------------+---------+---------\n 1.2.3.4-5.6.7.8 | 1.2.3.4-5.6.7.8 | 1.2.3.4 | 5.6.7.8\n(1 row)\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '1.2.3.4-1.2.3.4'::iprange as r) s;\n    r    |    r    |  lower  |  upper  \n---------+---------+---------+---------\n 1.2.3.4 | 1.2.3.4 | 1.2.3.4 | 1.2.3.4\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '::'::iprange as r) s;\n r  | r  | lower | upper \n----+----+-------+-------\n :: | :: | ::    | ::\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::iprange as r) s;\n                    r                    |                    r                    |                  lower                  |                  upper                  \n-----------------------------------------+-----------------------------------------+-----------------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '1::2'::iprange as r) s;\n  r   |  r   | lower | upper \n------+------+-------+-------\n 1::2 | 1::2 | 1::2  | 1::2\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::iprange as r) s;\n  r   |  r   | lower |                  upper                  \n------+------+-------+-----------------------------------------\n ::/0 | ::/0 | ::    | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::iprange as r) s;\n  r   |  r   | lower |                  upper                  \n------+------+-------+-----------------------------------------\n ::/0 | ::/0 | ::    | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '1::2-3::4'::iprange as r) s;\n     r     |     r     | lower | upper \n-----------+-----------+-------+-------\n 1::2-3::4 | 1::2-3::4 | 1::2  | 3::4\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '3::4-3::4'::iprange as r) s;\n  r   |  r   | lower | upper \n------+------+-------+-------\n 3::4 | 3::4 | 3::4  | 3::4\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '3::4-1::2'::iprange as r) s;\n     r     |     r     | lower | upper \n-----------+-----------+-------+-------\n 1::2-3::4 | 1::2-3::4 | 1::2  | 3::4\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::iprange as r) s;\n                    r                    |                    r                    |                  lower                  |                  upper                  \n-----------------------------------------+-----------------------------------------+-----------------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127'::iprange as r) s;\n                      r                      |                      r                      |                  lower                  |                  upper                  \n---------------------------------------------+---------------------------------------------+-----------------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126'::iprange as r) s;\n                      r                      |                      r                      |                  lower                  |                  upper                  \n---------------------------------------------+---------------------------------------------+-----------------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125'::iprange as r) s;\n                      r                      |                      r                      |                  lower                  |                  upper                  \n---------------------------------------------+---------------------------------------------+-----------------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124'::iprange as r) s;\n                      r                      |                      r                      |                  lower                  |                  upper                  \n---------------------------------------------+---------------------------------------------+-----------------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120'::iprange as r) s;\n                      r                      |                      r                      |                  lower                  |                  upper                  \n---------------------------------------------+---------------------------------------------+-----------------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116'::iprange as r) s;\n                      r                      |                      r                      |                  lower                  |                  upper                  \n---------------------------------------------+---------------------------------------------+-----------------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0000/112'::iprange as r) s;\n                    r                     |                    r                     |                lower                 |                  upper                  \n------------------------------------------+------------------------------------------+--------------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:0/112 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:0/112 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:0 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:0000:0000/96'::iprange as r) s;\n                 r                  |                 r                  |              lower              |                  upper                  \n------------------------------------+------------------------------------+---------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff::/96 | ffff:ffff:ffff:ffff:ffff:ffff::/96 | ffff:ffff:ffff:ffff:ffff:ffff:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:0000:0000:0000/80'::iprange as r) s;\n               r               |               r               |           lower            |                  upper                  \n-------------------------------+-------------------------------+----------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff::/80 | ffff:ffff:ffff:ffff:ffff::/80 | ffff:ffff:ffff:ffff:ffff:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:fff0:0000:0000:0000/76'::iprange as r) s;\n               r               |               r               |           lower            |                  upper                  \n-------------------------------+-------------------------------+----------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:fff0::/76 | ffff:ffff:ffff:ffff:fff0::/76 | ffff:ffff:ffff:ffff:fff0:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ff00:0000:0000:0000/72'::iprange as r) s;\n               r               |               r               |           lower            |                  upper                  \n-------------------------------+-------------------------------+----------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ff00::/72 | ffff:ffff:ffff:ffff:ff00::/72 | ffff:ffff:ffff:ffff:ff00:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:f000:0000:0000:0000/68'::iprange as r) s;\n               r               |               r               |           lower            |                  upper                  \n-------------------------------+-------------------------------+----------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:f000::/68 | ffff:ffff:ffff:ffff:f000::/68 | ffff:ffff:ffff:ffff:f000:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:e000:0000:0000:0000/67'::iprange as r) s;\n               r               |               r               |           lower            |                  upper                  \n-------------------------------+-------------------------------+----------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:e000::/67 | ffff:ffff:ffff:ffff:e000::/67 | ffff:ffff:ffff:ffff:e000:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:c000:0000:0000:0000/66'::iprange as r) s;\n               r               |               r               |           lower            |                  upper                  \n-------------------------------+-------------------------------+----------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:c000::/66 | ffff:ffff:ffff:ffff:c000::/66 | ffff:ffff:ffff:ffff:c000:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:8000:0000:0000:0000/65'::iprange as r) s;\n               r               |               r               |           lower            |                  upper                  \n-------------------------------+-------------------------------+----------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:8000::/65 | ffff:ffff:ffff:ffff:8000::/65 | ffff:ffff:ffff:ffff:8000:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:0000:0000:0000:0000/64'::iprange as r) s;\n            r             |            r             |         lower         |                  upper                  \n--------------------------+--------------------------+-----------------------+-----------------------------------------\n ffff:ffff:ffff:ffff::/64 | ffff:ffff:ffff:ffff::/64 | ffff:ffff:ffff:ffff:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:fffe:0000:0000:0000:0000/63'::iprange as r) s;\n            r             |            r             |         lower         |                  upper                  \n--------------------------+--------------------------+-----------------------+-----------------------------------------\n ffff:ffff:ffff:fffe::/63 | ffff:ffff:ffff:fffe::/63 | ffff:ffff:ffff:fffe:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:fffc:0000:0000:0000:0000/62'::iprange as r) s;\n            r             |            r             |         lower         |                  upper                  \n--------------------------+--------------------------+-----------------------+-----------------------------------------\n ffff:ffff:ffff:fffc::/62 | ffff:ffff:ffff:fffc::/62 | ffff:ffff:ffff:fffc:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:fff8:0000:0000:0000:0000/61'::iprange as r) s;\n            r             |            r             |         lower         |                  upper                  \n--------------------------+--------------------------+-----------------------+-----------------------------------------\n ffff:ffff:ffff:fff8::/61 | ffff:ffff:ffff:fff8::/61 | ffff:ffff:ffff:fff8:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:fff0:0000:0000:0000:0000/60'::iprange as r) s;\n            r             |            r             |         lower         |                  upper                  \n--------------------------+--------------------------+-----------------------+-----------------------------------------\n ffff:ffff:ffff:fff0::/60 | ffff:ffff:ffff:fff0::/60 | ffff:ffff:ffff:fff0:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ff00:0000:0000:0000:0000/56'::iprange as r) s;\n            r             |            r             |         lower         |                  upper                  \n--------------------------+--------------------------+-----------------------+-----------------------------------------\n ffff:ffff:ffff:ff00::/56 | ffff:ffff:ffff:ff00::/56 | ffff:ffff:ffff:ff00:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:f000:0000:0000:0000:0000/52'::iprange as r) s;\n            r             |            r             |         lower         |                  upper                  \n--------------------------+--------------------------+-----------------------+-----------------------------------------\n ffff:ffff:ffff:f000::/52 | ffff:ffff:ffff:f000::/52 | ffff:ffff:ffff:f000:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:0000:0000:0000:0000:0000/48'::iprange as r) s;\n          r          |          r          |      lower       |                  upper                  \n---------------------+---------------------+------------------+-----------------------------------------\n ffff:ffff:ffff::/48 | ffff:ffff:ffff::/48 | ffff:ffff:ffff:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:0000:0000:0000:0000:0000:0000/32'::iprange as r) s;\n       r        |       r        |    lower    |                  upper                  \n----------------+----------------+-------------+-----------------------------------------\n ffff:ffff::/32 | ffff:ffff::/32 | ffff:ffff:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:0000:0000:0000:0000:0000:0000:0000/16'::iprange as r) s;\n     r     |     r     | lower  |                  upper                  \n-----------+-----------+--------+-----------------------------------------\n ffff::/16 | ffff::/16 | ffff:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'fff0:0000:0000:0000:0000:0000:0000:0000/12'::iprange as r) s;\n     r     |     r     | lower  |                  upper                  \n-----------+-----------+--------+-----------------------------------------\n fff0::/12 | fff0::/12 | fff0:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ff00:0000:0000:0000:0000:0000:0000:0000/8'::iprange as r) s;\n    r     |    r     | lower  |                  upper                  \n----------+----------+--------+-----------------------------------------\n ff00::/8 | ff00::/8 | ff00:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'f000:0000:0000:0000:0000:0000:0000:0000/4'::iprange as r) s;\n    r     |    r     | lower  |                  upper                  \n----------+----------+--------+-----------------------------------------\n f000::/4 | f000::/4 | f000:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'e000:0000:0000:0000:0000:0000:0000:0000/3'::iprange as r) s;\n    r     |    r     | lower  |                  upper                  \n----------+----------+--------+-----------------------------------------\n e000::/3 | e000::/3 | e000:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'c000:0000:0000:0000:0000:0000:0000:0000/2'::iprange as r) s;\n    r     |    r     | lower  |                  upper                  \n----------+----------+--------+-----------------------------------------\n c000::/2 | c000::/2 | c000:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '8000:0000:0000:0000:0000:0000:0000:0000/1'::iprange as r) s;\n    r     |    r     | lower  |                  upper                  \n----------+----------+--------+-----------------------------------------\n 8000::/1 | 8000::/1 | 8000:: | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '0000:0000:0000:0000:0000:0000:0000:0000/0'::iprange as r) s;\n  r   |  r   | lower |                  upper                  \n------+------+-------+-----------------------------------------\n ::/0 | ::/0 | ::    | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect a::ipaddress, a::ip4 from (select '1.2.3.4'::text as a) s1;\n    a    |    a    \n---------+---------\n 1.2.3.4 | 1.2.3.4\n(1 row)\n\nselect a::ipaddress, a::ip4 from (select '0.0.0.0'::text as a) s1;\n    a    |    a    \n---------+---------\n 0.0.0.0 | 0.0.0.0\n(1 row)\n\nselect a::ipaddress, a::ip4 from (select '255.255.255.255'::text as a) s1;\n        a        |        a        \n-----------------+-----------------\n 255.255.255.255 | 255.255.255.255\n(1 row)\n\nselect a::ipaddress, a::ip4 from (select '0.0.0.255'::text as a) s1;\n     a     |     a     \n-----------+-----------\n 0.0.0.255 | 0.0.0.255\n(1 row)\n\nselect a::ipaddress, a::ip4 from (select '0.0.255.0'::text as a) s1;\n     a     |     a     \n-----------+-----------\n 0.0.255.0 | 0.0.255.0\n(1 row)\n\nselect a::ipaddress, a::ip4 from (select '0.255.0.0'::text as a) s1;\n     a     |     a     \n-----------+-----------\n 0.255.0.0 | 0.255.0.0\n(1 row)\n\nselect a::ipaddress, a::ip4 from (select '255.0.0.0'::text as a) s1;\n     a     |     a     \n-----------+-----------\n 255.0.0.0 | 255.0.0.0\n(1 row)\n\nselect a::ipaddress, a::ip4 from (select '192.168.123.210'::text as a) s1;\n        a        |        a        \n-----------------+-----------------\n 192.168.123.210 | 192.168.123.210\n(1 row)\n\nselect a::ipaddress, a::ip4 from (select '127.0.0.1'::text as a) s1;\n     a     |     a     \n-----------+-----------\n 127.0.0.1 | 127.0.0.1\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '0000:0000:0000:0000:0000:0000:0000:0000'::text as a) s1;\n a  | a  \n----+----\n :: | ::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '0000:0000:0000:0000:0000:0000:0000:0001'::text as a) s1;\n  a  |  a  \n-----+-----\n ::1 | ::1\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '0:0:0:0:0:0:0:0'::text as a) s1;\n a  | a  \n----+----\n :: | ::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '0:0:0:0:0:0:0:1'::text as a) s1;\n  a  |  a  \n-----+-----\n ::1 | ::1\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '0:0:0:0:0:0:13.1.68.3'::text as a) s1;\n      a      |      a      \n-------------+-------------\n ::13.1.68.3 | ::13.1.68.3\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '0:0:0:0:0:FFFF:129.144.52.38'::text as a) s1;\n          a           |          a           \n----------------------+----------------------\n ::ffff:129.144.52.38 | ::ffff:129.144.52.38\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '0::0'::text as a) s1;\n a  | a  \n----+----\n :: | ::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5:6:1.2.3.4'::text as a) s1;\n          a          |          a          \n---------------------+---------------------\n 1:2:3:4:5:6:102:304 | 1:2:3:4:5:6:102:304\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5:6:7:8'::text as a) s1;\n        a        |        a        \n-----------------+-----------------\n 1:2:3:4:5:6:7:8 | 1:2:3:4:5:6:7:8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5:6::'::text as a) s1;\n       a       |       a       \n---------------+---------------\n 1:2:3:4:5:6:: | 1:2:3:4:5:6::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5:6::8'::text as a) s1;\n        a        |        a        \n-----------------+-----------------\n 1:2:3:4:5:6:0:8 | 1:2:3:4:5:6:0:8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5::'::text as a) s1;\n      a      |      a      \n-------------+-------------\n 1:2:3:4:5:: | 1:2:3:4:5::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5::1.2.3.4'::text as a) s1;\n          a          |          a          \n---------------------+---------------------\n 1:2:3:4:5:0:102:304 | 1:2:3:4:5:0:102:304\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5::7:8'::text as a) s1;\n        a        |        a        \n-----------------+-----------------\n 1:2:3:4:5:0:7:8 | 1:2:3:4:5:0:7:8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5::8'::text as a) s1;\n      a       |      a       \n--------------+--------------\n 1:2:3:4:5::8 | 1:2:3:4:5::8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3:4::'::text as a) s1;\n     a     |     a     \n-----------+-----------\n 1:2:3:4:: | 1:2:3:4::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3:4::1.2.3.4'::text as a) s1;\n        a         |        a         \n------------------+------------------\n 1:2:3:4::102:304 | 1:2:3:4::102:304\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3:4::5:1.2.3.4'::text as a) s1;\n          a          |          a          \n---------------------+---------------------\n 1:2:3:4:0:5:102:304 | 1:2:3:4:0:5:102:304\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3:4::7:8'::text as a) s1;\n      a       |      a       \n--------------+--------------\n 1:2:3:4::7:8 | 1:2:3:4::7:8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3:4::8'::text as a) s1;\n     a      |     a      \n------------+------------\n 1:2:3:4::8 | 1:2:3:4::8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3::'::text as a) s1;\n    a    |    a    \n---------+---------\n 1:2:3:: | 1:2:3::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3::1.2.3.4'::text as a) s1;\n       a        |       a        \n----------------+----------------\n 1:2:3::102:304 | 1:2:3::102:304\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3::5:1.2.3.4'::text as a) s1;\n        a         |        a         \n------------------+------------------\n 1:2:3::5:102:304 | 1:2:3::5:102:304\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3::7:8'::text as a) s1;\n     a      |     a      \n------------+------------\n 1:2:3::7:8 | 1:2:3::7:8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2:3::8'::text as a) s1;\n    a     |    a     \n----------+----------\n 1:2:3::8 | 1:2:3::8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2::'::text as a) s1;\n   a   |   a   \n-------+-------\n 1:2:: | 1:2::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2::1.2.3.4'::text as a) s1;\n      a       |      a       \n--------------+--------------\n 1:2::102:304 | 1:2::102:304\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2::5:1.2.3.4'::text as a) s1;\n       a        |       a        \n----------------+----------------\n 1:2::5:102:304 | 1:2::5:102:304\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2::7:8'::text as a) s1;\n    a     |    a     \n----------+----------\n 1:2::7:8 | 1:2::7:8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1:2::8'::text as a) s1;\n   a    |   a    \n--------+--------\n 1:2::8 | 1:2::8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1::'::text as a) s1;\n  a  |  a  \n-----+-----\n 1:: | 1::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1::1.2.3.4'::text as a) s1;\n     a      |     a      \n------------+------------\n 1::102:304 | 1::102:304\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1::2:3'::text as a) s1;\n   a    |   a    \n--------+--------\n 1::2:3 | 1::2:3\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1::2:3:4'::text as a) s1;\n    a     |    a     \n----------+----------\n 1::2:3:4 | 1::2:3:4\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1::2:3:4:5'::text as a) s1;\n     a      |     a      \n------------+------------\n 1::2:3:4:5 | 1::2:3:4:5\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1::2:3:4:5:6'::text as a) s1;\n      a       |      a       \n--------------+--------------\n 1::2:3:4:5:6 | 1::2:3:4:5:6\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1::2:3:4:5:6:7'::text as a) s1;\n        a        |        a        \n-----------------+-----------------\n 1:0:2:3:4:5:6:7 | 1:0:2:3:4:5:6:7\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1::5:1.2.3.4'::text as a) s1;\n      a       |      a       \n--------------+--------------\n 1::5:102:304 | 1::5:102:304\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1::5:11.22.33.44'::text as a) s1;\n       a       |       a       \n---------------+---------------\n 1::5:b16:212c | 1::5:b16:212c\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1::7:8'::text as a) s1;\n   a    |   a    \n--------+--------\n 1::7:8 | 1::7:8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '1::8'::text as a) s1;\n  a   |  a   \n------+------\n 1::8 | 1::8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:0000:1234:0000:0000:C1C0:ABCD:0876'::text as a) s1;\n             a              |             a              \n----------------------------+----------------------------\n 2001:0:1234::c1c0:abcd:876 | 2001:0:1234::c1c0:abcd:876\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:0db8:0000:0000:0000:0000:1428:57ab'::text as a) s1;\n          a          |          a          \n---------------------+---------------------\n 2001:db8::1428:57ab | 2001:db8::1428:57ab\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:0db8:0000:0000:0000::1428:57ab'::text as a) s1;\n          a          |          a          \n---------------------+---------------------\n 2001:db8::1428:57ab | 2001:db8::1428:57ab\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:0db8:0:0:0:0:1428:57ab'::text as a) s1;\n          a          |          a          \n---------------------+---------------------\n 2001:db8::1428:57ab | 2001:db8::1428:57ab\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:0db8:0:0::1428:57ab'::text as a) s1;\n          a          |          a          \n---------------------+---------------------\n 2001:db8::1428:57ab | 2001:db8::1428:57ab\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:0db8:1234:0000:0000:0000:0000:0000'::text as a) s1;\n        a        |        a        \n-----------------+-----------------\n 2001:db8:1234:: | 2001:db8:1234::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:0db8:1234::'::text as a) s1;\n        a        |        a        \n-----------------+-----------------\n 2001:db8:1234:: | 2001:db8:1234::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:0db8:1234:ffff:ffff:ffff:ffff:ffff'::text as a) s1;\n                   a                    |                   a                    \n----------------------------------------+----------------------------------------\n 2001:db8:1234:ffff:ffff:ffff:ffff:ffff | 2001:db8:1234:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:0db8:85a3:0000:0000:8a2e:0370:7334'::text as a) s1;\n              a               |              a               \n------------------------------+------------------------------\n 2001:db8:85a3::8a2e:370:7334 | 2001:db8:85a3::8a2e:370:7334\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:0db8::1428:57ab'::text as a) s1;\n          a          |          a          \n---------------------+---------------------\n 2001:db8::1428:57ab | 2001:db8::1428:57ab\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:10::'::text as a) s1;\n     a     |     a     \n-----------+-----------\n 2001:10:: | 2001:10::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001::'::text as a) s1;\n   a    |   a    \n--------+--------\n 2001:: | 2001::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:DB8:0:0:8:800:200C:417A'::text as a) s1;\n             a             |             a             \n---------------------------+---------------------------\n 2001:db8::8:800:200c:417a | 2001:db8::8:800:200c:417a\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:DB8::8:800:200C:417A'::text as a) s1;\n             a             |             a             \n---------------------------+---------------------------\n 2001:db8::8:800:200c:417a | 2001:db8::8:800:200c:417a\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:db8:85a3:0:0:8a2e:370:7334'::text as a) s1;\n              a               |              a               \n------------------------------+------------------------------\n 2001:db8:85a3::8a2e:370:7334 | 2001:db8:85a3::8a2e:370:7334\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:db8:85a3::8a2e:370:7334'::text as a) s1;\n              a               |              a               \n------------------------------+------------------------------\n 2001:db8:85a3::8a2e:370:7334 | 2001:db8:85a3::8a2e:370:7334\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:db8::'::text as a) s1;\n     a      |     a      \n------------+------------\n 2001:db8:: | 2001:db8::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:db8::'::text as a) s1;\n     a      |     a      \n------------+------------\n 2001:db8:: | 2001:db8::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:db8::1428:57ab'::text as a) s1;\n          a          |          a          \n---------------------+---------------------\n 2001:db8::1428:57ab | 2001:db8::1428:57ab\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2001:db8:a::123'::text as a) s1;\n        a        |        a        \n-----------------+-----------------\n 2001:db8:a::123 | 2001:db8:a::123\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2002::'::text as a) s1;\n   a    |   a    \n--------+--------\n 2002:: | 2002::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '2::10'::text as a) s1;\n   a   |   a   \n-------+-------\n 2::10 | 2::10\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '3ffe:0b00:0000:0000:0001:0000:0000:000a'::text as a) s1;\n         a         |         a         \n-------------------+-------------------\n 3ffe:b00::1:0:0:a | 3ffe:b00::1:0:0:a\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::'::text as a) s1;\n a  | a  \n----+----\n :: | ::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::1'::text as a) s1;\n  a  |  a  \n-----+-----\n ::1 | ::1\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::127.0.0.1'::text as a) s1;\n      a      |      a      \n-------------+-------------\n ::127.0.0.1 | ::127.0.0.1\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::13.1.68.3'::text as a) s1;\n      a      |      a      \n-------------+-------------\n ::13.1.68.3 | ::13.1.68.3\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::2:3'::text as a) s1;\n     a     |     a     \n-----------+-----------\n ::0.2.0.3 | ::0.2.0.3\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::2:3:4'::text as a) s1;\n    a    |    a    \n---------+---------\n ::2:3:4 | ::2:3:4\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::2:3:4:5'::text as a) s1;\n     a     |     a     \n-----------+-----------\n ::2:3:4:5 | ::2:3:4:5\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::2:3:4:5:6'::text as a) s1;\n      a      |      a      \n-------------+-------------\n ::2:3:4:5:6 | ::2:3:4:5:6\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::2:3:4:5:6:7'::text as a) s1;\n       a       |       a       \n---------------+---------------\n ::2:3:4:5:6:7 | ::2:3:4:5:6:7\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::2:3:4:5:6:7:8'::text as a) s1;\n        a        |        a        \n-----------------+-----------------\n 0:2:3:4:5:6:7:8 | 0:2:3:4:5:6:7:8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::8'::text as a) s1;\n  a  |  a  \n-----+-----\n ::8 | ::8\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::FFFF:129.144.52.38'::text as a) s1;\n          a           |          a           \n----------------------+----------------------\n ::ffff:129.144.52.38 | ::ffff:129.144.52.38\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::ffff:0:0'::text as a) s1;\n       a        |       a        \n----------------+----------------\n ::ffff:0.0.0.0 | ::ffff:0.0.0.0\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::ffff:0:192.168.1.1'::text as a) s1;\n          a           |          a           \n----------------------+----------------------\n ::ffff:0:192.168.1.1 | ::ffff:0:192.168.1.1\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::ffff:1:1.2.3.4'::text as a) s1;\n        a         |        a         \n------------------+------------------\n ::ffff:1:102:304 | ::ffff:1:102:304\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::ffff:0c22:384e'::text as a) s1;\n         a          |         a          \n--------------------+--------------------\n ::ffff:12.34.56.78 | ::ffff:12.34.56.78\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::ffff:12.34.56.78'::text as a) s1;\n         a          |         a          \n--------------------+--------------------\n ::ffff:12.34.56.78 | ::ffff:12.34.56.78\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::ffff:192.0.2.128'::text as a) s1;\n         a          |         a          \n--------------------+--------------------\n ::ffff:192.0.2.128 | ::ffff:192.0.2.128\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::ffff:192.168.1.1'::text as a) s1;\n         a          |         a          \n--------------------+--------------------\n ::ffff:192.168.1.1 | ::ffff:192.168.1.1\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::ffff:192.168.1.26'::text as a) s1;\n          a          |          a          \n---------------------+---------------------\n ::ffff:192.168.1.26 | ::ffff:192.168.1.26\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select '::ffff:c000:280'::text as a) s1;\n         a          |         a          \n--------------------+--------------------\n ::ffff:192.0.2.128 | ::ffff:192.0.2.128\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'FF01:0:0:0:0:0:0:101'::text as a) s1;\n     a     |     a     \n-----------+-----------\n ff01::101 | ff01::101\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'FF01::101'::text as a) s1;\n     a     |     a     \n-----------+-----------\n ff01::101 | ff01::101\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'FF02:0000:0000:0000:0000:0000:0000:0001'::text as a) s1;\n    a    |    a    \n---------+---------\n ff02::1 | ff02::1\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'fc00::'::text as a) s1;\n   a    |   a    \n--------+--------\n fc00:: | fc00::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'fe80:0000:0000:0000:0204:61ff:fe9d:f156'::text as a) s1;\n            a             |            a             \n--------------------------+--------------------------\n fe80::204:61ff:fe9d:f156 | fe80::204:61ff:fe9d:f156\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'fe80:0:0:0:204:61ff:254.157.241.86'::text as a) s1;\n            a             |            a             \n--------------------------+--------------------------\n fe80::204:61ff:fe9d:f156 | fe80::204:61ff:fe9d:f156\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'fe80:0:0:0:204:61ff:fe9d:f156'::text as a) s1;\n            a             |            a             \n--------------------------+--------------------------\n fe80::204:61ff:fe9d:f156 | fe80::204:61ff:fe9d:f156\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'fe80::'::text as a) s1;\n   a    |   a    \n--------+--------\n fe80:: | fe80::\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'fe80::1'::text as a) s1;\n    a    |    a    \n---------+---------\n fe80::1 | fe80::1\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'fe80::204:61ff:254.157.241.86'::text as a) s1;\n            a             |            a             \n--------------------------+--------------------------\n fe80::204:61ff:fe9d:f156 | fe80::204:61ff:fe9d:f156\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'fe80::204:61ff:fe9d:f156'::text as a) s1;\n            a             |            a             \n--------------------------+--------------------------\n fe80::204:61ff:fe9d:f156 | fe80::204:61ff:fe9d:f156\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'fe80::217:f2ff:254.7.237.98'::text as a) s1;\n            a             |            a             \n--------------------------+--------------------------\n fe80::217:f2ff:fe07:ed62 | fe80::217:f2ff:fe07:ed62\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'fe80::217:f2ff:fe07:ed62'::text as a) s1;\n            a             |            a             \n--------------------------+--------------------------\n fe80::217:f2ff:fe07:ed62 | fe80::217:f2ff:fe07:ed62\n(1 row)\n\nselect a::ipaddress, a::ip6 from (select 'ff02::1'::text as a) s1;\n    a    |    a    \n---------+---------\n ff02::1 | ff02::1\n(1 row)\n\nselect r::iprange from (select '-'::text as r) s;\n r \n---\n -\n(1 row)\n\nselect r::iprange, r::ip4r from (select '1.2.3.4'::text as r) s;\n    r    |    r    \n---------+---------\n 1.2.3.4 | 1.2.3.4\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.255.255/32'::text as r) s;\n        r        |        r        \n-----------------+-----------------\n 255.255.255.255 | 255.255.255.255\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.255.254/31'::text as r) s;\n         r          |         r          \n--------------------+--------------------\n 255.255.255.254/31 | 255.255.255.254/31\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.255.252/30'::text as r) s;\n         r          |         r          \n--------------------+--------------------\n 255.255.255.252/30 | 255.255.255.252/30\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.255.248/29'::text as r) s;\n         r          |         r          \n--------------------+--------------------\n 255.255.255.248/29 | 255.255.255.248/29\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.255.240/28'::text as r) s;\n         r          |         r          \n--------------------+--------------------\n 255.255.255.240/28 | 255.255.255.240/28\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.255.224/27'::text as r) s;\n         r          |         r          \n--------------------+--------------------\n 255.255.255.224/27 | 255.255.255.224/27\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.255.192/26'::text as r) s;\n         r          |         r          \n--------------------+--------------------\n 255.255.255.192/26 | 255.255.255.192/26\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.255.128/25'::text as r) s;\n         r          |         r          \n--------------------+--------------------\n 255.255.255.128/25 | 255.255.255.128/25\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.255.0/24'::text as r) s;\n        r         |        r         \n------------------+------------------\n 255.255.255.0/24 | 255.255.255.0/24\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.254.0/23'::text as r) s;\n        r         |        r         \n------------------+------------------\n 255.255.254.0/23 | 255.255.254.0/23\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.252.0/22'::text as r) s;\n        r         |        r         \n------------------+------------------\n 255.255.252.0/22 | 255.255.252.0/22\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.248.0/21'::text as r) s;\n        r         |        r         \n------------------+------------------\n 255.255.248.0/21 | 255.255.248.0/21\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.240.0/20'::text as r) s;\n        r         |        r         \n------------------+------------------\n 255.255.240.0/20 | 255.255.240.0/20\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.224.0/19'::text as r) s;\n        r         |        r         \n------------------+------------------\n 255.255.224.0/19 | 255.255.224.0/19\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.192.0/18'::text as r) s;\n        r         |        r         \n------------------+------------------\n 255.255.192.0/18 | 255.255.192.0/18\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.128.0/17'::text as r) s;\n        r         |        r         \n------------------+------------------\n 255.255.128.0/17 | 255.255.128.0/17\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.255.0.0/16'::text as r) s;\n       r        |       r        \n----------------+----------------\n 255.255.0.0/16 | 255.255.0.0/16\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.254.0.0/15'::text as r) s;\n       r        |       r        \n----------------+----------------\n 255.254.0.0/15 | 255.254.0.0/15\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.252.0.0/14'::text as r) s;\n       r        |       r        \n----------------+----------------\n 255.252.0.0/14 | 255.252.0.0/14\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.248.0.0/13'::text as r) s;\n       r        |       r        \n----------------+----------------\n 255.248.0.0/13 | 255.248.0.0/13\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.240.0.0/12'::text as r) s;\n       r        |       r        \n----------------+----------------\n 255.240.0.0/12 | 255.240.0.0/12\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.224.0.0/11'::text as r) s;\n       r        |       r        \n----------------+----------------\n 255.224.0.0/11 | 255.224.0.0/11\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.192.0.0/10'::text as r) s;\n       r        |       r        \n----------------+----------------\n 255.192.0.0/10 | 255.192.0.0/10\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.128.0.0/9'::text as r) s;\n       r       |       r       \n---------------+---------------\n 255.128.0.0/9 | 255.128.0.0/9\n(1 row)\n\nselect r::iprange, r::ip4r from (select '255.0.0.0/8'::text as r) s;\n      r      |      r      \n-------------+-------------\n 255.0.0.0/8 | 255.0.0.0/8\n(1 row)\n\nselect r::iprange, r::ip4r from (select '254.0.0.0/7'::text as r) s;\n      r      |      r      \n-------------+-------------\n 254.0.0.0/7 | 254.0.0.0/7\n(1 row)\n\nselect r::iprange, r::ip4r from (select '252.0.0.0/6'::text as r) s;\n      r      |      r      \n-------------+-------------\n 252.0.0.0/6 | 252.0.0.0/6\n(1 row)\n\nselect r::iprange, r::ip4r from (select '248.0.0.0/5'::text as r) s;\n      r      |      r      \n-------------+-------------\n 248.0.0.0/5 | 248.0.0.0/5\n(1 row)\n\nselect r::iprange, r::ip4r from (select '240.0.0.0/4'::text as r) s;\n      r      |      r      \n-------------+-------------\n 240.0.0.0/4 | 240.0.0.0/4\n(1 row)\n\nselect r::iprange, r::ip4r from (select '224.0.0.0/3'::text as r) s;\n      r      |      r      \n-------------+-------------\n 224.0.0.0/3 | 224.0.0.0/3\n(1 row)\n\nselect r::iprange, r::ip4r from (select '192.0.0.0/2'::text as r) s;\n      r      |      r      \n-------------+-------------\n 192.0.0.0/2 | 192.0.0.0/2\n(1 row)\n\nselect r::iprange, r::ip4r from (select '128.0.0.0/1'::text as r) s;\n      r      |      r      \n-------------+-------------\n 128.0.0.0/1 | 128.0.0.0/1\n(1 row)\n\nselect r::iprange, r::ip4r from (select '0.0.0.0/0'::text as r) s;\n     r     |     r     \n-----------+-----------\n 0.0.0.0/0 | 0.0.0.0/0\n(1 row)\n\nselect r::iprange, r::ip4r from (select '1.2.3.4-5.6.7.8'::text as r) s;\n        r        |        r        \n-----------------+-----------------\n 1.2.3.4-5.6.7.8 | 1.2.3.4-5.6.7.8\n(1 row)\n\nselect r::iprange, r::ip4r from (select '5.6.7.8-1.2.3.4'::text as r) s;\n        r        |        r        \n-----------------+-----------------\n 1.2.3.4-5.6.7.8 | 1.2.3.4-5.6.7.8\n(1 row)\n\nselect r::iprange, r::ip4r from (select '1.2.3.4-1.2.3.4'::text as r) s;\n    r    |    r    \n---------+---------\n 1.2.3.4 | 1.2.3.4\n(1 row)\n\nselect r::iprange, r::ip6r from (select '::'::text as r) s;\n r  | r  \n----+----\n :: | ::\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::text as r) s;\n                    r                    |                    r                    \n-----------------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::iprange, r::ip6r from (select '1::2'::text as r) s;\n  r   |  r   \n------+------\n 1::2 | 1::2\n(1 row)\n\nselect r::iprange, r::ip6r from (select '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::text as r) s;\n  r   |  r   \n------+------\n ::/0 | ::/0\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::text as r) s;\n  r   |  r   \n------+------\n ::/0 | ::/0\n(1 row)\n\nselect r::iprange, r::ip6r from (select '1::2-3::4'::text as r) s;\n     r     |     r     \n-----------+-----------\n 1::2-3::4 | 1::2-3::4\n(1 row)\n\nselect r::iprange, r::ip6r from (select '3::4-3::4'::text as r) s;\n  r   |  r   \n------+------\n 3::4 | 3::4\n(1 row)\n\nselect r::iprange, r::ip6r from (select '3::4-1::2'::text as r) s;\n     r     |     r     \n-----------+-----------\n 1::2-3::4 | 1::2-3::4\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::text as r) s;\n                    r                    |                    r                    \n-----------------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127'::text as r) s;\n                      r                      |                      r                      \n---------------------------------------------+---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126'::text as r) s;\n                      r                      |                      r                      \n---------------------------------------------+---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125'::text as r) s;\n                      r                      |                      r                      \n---------------------------------------------+---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124'::text as r) s;\n                      r                      |                      r                      \n---------------------------------------------+---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120'::text as r) s;\n                      r                      |                      r                      \n---------------------------------------------+---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116'::text as r) s;\n                      r                      |                      r                      \n---------------------------------------------+---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0000/112'::text as r) s;\n                    r                     |                    r                     \n------------------------------------------+------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:0/112 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:0/112\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:0000:0000/96'::text as r) s;\n                 r                  |                 r                  \n------------------------------------+------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff::/96 | ffff:ffff:ffff:ffff:ffff:ffff::/96\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:0000:0000:0000/80'::text as r) s;\n               r               |               r               \n-------------------------------+-------------------------------\n ffff:ffff:ffff:ffff:ffff::/80 | ffff:ffff:ffff:ffff:ffff::/80\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:fff0:0000:0000:0000/76'::text as r) s;\n               r               |               r               \n-------------------------------+-------------------------------\n ffff:ffff:ffff:ffff:fff0::/76 | ffff:ffff:ffff:ffff:fff0::/76\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ff00:0000:0000:0000/72'::text as r) s;\n               r               |               r               \n-------------------------------+-------------------------------\n ffff:ffff:ffff:ffff:ff00::/72 | ffff:ffff:ffff:ffff:ff00::/72\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:f000:0000:0000:0000/68'::text as r) s;\n               r               |               r               \n-------------------------------+-------------------------------\n ffff:ffff:ffff:ffff:f000::/68 | ffff:ffff:ffff:ffff:f000::/68\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:e000:0000:0000:0000/67'::text as r) s;\n               r               |               r               \n-------------------------------+-------------------------------\n ffff:ffff:ffff:ffff:e000::/67 | ffff:ffff:ffff:ffff:e000::/67\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:c000:0000:0000:0000/66'::text as r) s;\n               r               |               r               \n-------------------------------+-------------------------------\n ffff:ffff:ffff:ffff:c000::/66 | ffff:ffff:ffff:ffff:c000::/66\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:8000:0000:0000:0000/65'::text as r) s;\n               r               |               r               \n-------------------------------+-------------------------------\n ffff:ffff:ffff:ffff:8000::/65 | ffff:ffff:ffff:ffff:8000::/65\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:0000:0000:0000:0000/64'::text as r) s;\n            r             |            r             \n--------------------------+--------------------------\n ffff:ffff:ffff:ffff::/64 | ffff:ffff:ffff:ffff::/64\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:fffe:0000:0000:0000:0000/63'::text as r) s;\n            r             |            r             \n--------------------------+--------------------------\n ffff:ffff:ffff:fffe::/63 | ffff:ffff:ffff:fffe::/63\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:fffc:0000:0000:0000:0000/62'::text as r) s;\n            r             |            r             \n--------------------------+--------------------------\n ffff:ffff:ffff:fffc::/62 | ffff:ffff:ffff:fffc::/62\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:fff8:0000:0000:0000:0000/61'::text as r) s;\n            r             |            r             \n--------------------------+--------------------------\n ffff:ffff:ffff:fff8::/61 | ffff:ffff:ffff:fff8::/61\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:fff0:0000:0000:0000:0000/60'::text as r) s;\n            r             |            r             \n--------------------------+--------------------------\n ffff:ffff:ffff:fff0::/60 | ffff:ffff:ffff:fff0::/60\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ff00:0000:0000:0000:0000/56'::text as r) s;\n            r             |            r             \n--------------------------+--------------------------\n ffff:ffff:ffff:ff00::/56 | ffff:ffff:ffff:ff00::/56\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:f000:0000:0000:0000:0000/52'::text as r) s;\n            r             |            r             \n--------------------------+--------------------------\n ffff:ffff:ffff:f000::/52 | ffff:ffff:ffff:f000::/52\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:0000:0000:0000:0000:0000/48'::text as r) s;\n          r          |          r          \n---------------------+---------------------\n ffff:ffff:ffff::/48 | ffff:ffff:ffff::/48\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:ffff:0000:0000:0000:0000:0000:0000/32'::text as r) s;\n       r        |       r        \n----------------+----------------\n ffff:ffff::/32 | ffff:ffff::/32\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ffff:0000:0000:0000:0000:0000:0000:0000/16'::text as r) s;\n     r     |     r     \n-----------+-----------\n ffff::/16 | ffff::/16\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'fff0:0000:0000:0000:0000:0000:0000:0000/12'::text as r) s;\n     r     |     r     \n-----------+-----------\n fff0::/12 | fff0::/12\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'ff00:0000:0000:0000:0000:0000:0000:0000/8'::text as r) s;\n    r     |    r     \n----------+----------\n ff00::/8 | ff00::/8\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'f000:0000:0000:0000:0000:0000:0000:0000/4'::text as r) s;\n    r     |    r     \n----------+----------\n f000::/4 | f000::/4\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'e000:0000:0000:0000:0000:0000:0000:0000/3'::text as r) s;\n    r     |    r     \n----------+----------\n e000::/3 | e000::/3\n(1 row)\n\nselect r::iprange, r::ip6r from (select 'c000:0000:0000:0000:0000:0000:0000:0000/2'::text as r) s;\n    r     |    r     \n----------+----------\n c000::/2 | c000::/2\n(1 row)\n\nselect r::iprange, r::ip6r from (select '8000:0000:0000:0000:0000:0000:0000:0000/1'::text as r) s;\n    r     |    r     \n----------+----------\n 8000::/1 | 8000::/1\n(1 row)\n\nselect r::iprange, r::ip6r from (select '0000:0000:0000:0000:0000:0000:0000:0000/0'::text as r) s;\n  r   |  r   \n------+------\n ::/0 | ::/0\n(1 row)\n\n-- invalid text casts\nselect '1.2.3'::text::ip4;\nERROR:  invalid IP4 value in text\nselect '0'::text::ip4;\nERROR:  invalid IP4 value in text\nselect ' 1.2.3.4'::text::ip4;\nERROR:  invalid IP4 value in text\nselect '1.2.3.4 '::text::ip4;\nERROR:  invalid IP4 value in text\nselect '0.0.0.256'::text::ip4;\nERROR:  invalid IP4 value in text\nselect '0.0.256'::text::ip4;\nERROR:  invalid IP4 value in text\nselect '0..255.0'::text::ip4;\nERROR:  invalid IP4 value in text\nselect '+0.255.0.0'::text::ip4;\nERROR:  invalid IP4 value in text\nselect '1.2.3.4-1.2.3.4'::text::ip4;\nERROR:  invalid IP4 value in text\nselect '1.2.3'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '255.255.255.255.255.255.255.255.255'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '255.255.255.255.255-255.255.255.255.255'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '255.255.255.255-1.2.3.4.5'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '255.255.255.255-1.2.3'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/31'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/30'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/29'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/28'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/27'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/26'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/25'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/24'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/23'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/22'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/21'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/20'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/19'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/18'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/17'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/16'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/15'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/14'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/13'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/12'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/11'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/10'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/9'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/8'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/7'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/6'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/5'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/4'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/3'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/2'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/1'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.1/0'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.2/30'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.4/29'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.8/28'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.16/27'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.32/26'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.64/25'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.128/24'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.1.0/23'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.2.0/22'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.4.0/21'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.8.0/20'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.16.0/19'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.32.0/18'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.64.0/17'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.128.0/16'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.1.0.0/15'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.2.0.0/14'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.4.0.0/13'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.8.0.0/12'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.16.0.0/11'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.32.0.0/10'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.64.0.0/9'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.128.0.0/8'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '1.0.0.0/7'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '2.0.0.0/6'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '4.0.0.0/5'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '8.0.0.0/4'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '16.0.0.0/3'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '32.0.0.0/2'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '64.0.0.0/1'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '128.0.0.0/0'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.0/33'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.0/3.0'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect '0.0.0.0/+33'::text::ip4r;\nERROR:  invalid IP4R value in text\nselect ''::text::ip6;\nERROR:  invalid IP6 value in text\nselect '02001:0000:1234:0000:0000:C1C0:ABCD:0876'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1.2.3.4:1111:2222:3333:4444::5555'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1.2.3.4:1111:2222:3333::5555'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1.2.3.4:1111:2222::5555'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1.2.3.4:1111::5555'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1.2.3.4::'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1.2.3.4::5555'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1111:'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1111:2222:3333:4444::5555:'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1111:2222:3333::5555:'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1111:2222::5555:'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1111::5555:'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '123'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '12345::6:7:8'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '127.0.0.1'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1:2:3:4:5:6:7:8:9'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1:2:3::4:5:6:7:8:9'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1:2:3::4:5::7:8'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::1.2.256.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::1.2.3.256'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::1.2.3.300'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::1.2.3.900'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::1.2.300.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::1.2.900.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::1.256.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::1.300.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::1.900.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::256.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::260.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::2::3'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::300.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::300.300.300.300'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::3000.30.30.30'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::400.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:1.2.256.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:1.2.3.256'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:1.2.3.300'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:1.2.3.900'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:1.2.300.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:1.2.900.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:1.256.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:1.300.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:1.900.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:256.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:260.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:300.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:300.300.300.300'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:3000.30.30.30'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:400.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::5:900.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1::900.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '1:::3:4:5'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '2001:0000:1234: 0000:0000:C1C0:ABCD:0876'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '2001:0000:1234:0000:00001:C1C0:ABCD:0876'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '2001::FFD3::57ab'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '2001:DB8:0:0:8:800:200C:417A:221'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '2001:db8:85a3::8a2e:37023:7334'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '2001:db8:85a3::8a2e:370k:7334'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '3ffe:0b00:0000:0001:0000:0000:000a'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '3ffe:b00::1::a'::text::ip6;\nERROR:  invalid IP6 value in text\nselect ':'::text::ip6;\nERROR:  invalid IP6 value in text\nselect ':1111:2222:3333:4444::5555'::text::ip6;\nERROR:  invalid IP6 value in text\nselect ':1111:2222:3333::5555'::text::ip6;\nERROR:  invalid IP6 value in text\nselect ':1111:2222::5555'::text::ip6;\nERROR:  invalid IP6 value in text\nselect ':1111::5555'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::1.2.256.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::1.2.3.256'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::1.2.3.300'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::1.2.3.900'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::1.2.300.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::1.2.900.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::1.256.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::1.300.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::1.900.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::1111:2222:3333:4444:5555:6666::'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::256.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::260.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::300.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::300.300.300.300'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::3000.30.30.30'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::400.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::5555:'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::900.2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect ':::'::text::ip6;\nERROR:  invalid IP6 value in text\nselect ':::5555'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::ffff:2.3.4'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::ffff:257.1.2.3'::text::ip6;\nERROR:  invalid IP6 value in text\nselect 'FF01::101::2'::text::ip6;\nERROR:  invalid IP6 value in text\nselect 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'::text::ip6;\nERROR:  invalid IP6 value in text\nselect 'ldkfj'::text::ip6;\nERROR:  invalid IP6 value in text\nselect '::-::-::'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0001/127'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0001/120'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0001/112'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0001/96'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0001/80'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0001/64'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0001/48'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0001/32'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0001/16'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0001/8'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0001/4'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0001/0'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0008/124'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:0080/120'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:0000:8000/112'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:0000:8000:0000/96'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:0000:8000:0000:0000/80'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:0000:8000:0000:0000:0000/64'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:0000:8000:0000:0000:0000:0000/48'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:0000:8000:0000:0000:0000:0000:0000/32'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0000:8000:0000:0000:0000:0000:0000:0000/16'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0080:0000:0000:0000:0000:0000:0000:0000/8'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '0800:0000:0000:0000:0000:0000:0000:0000/4'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '8000:0000:0000:0000:0000:0000:0000:0000/0'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '::/129'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '::/255'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '::/256'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '::/+0'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '::/0-0'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '::-::/0'::text::ip6r;\nERROR:  invalid IP6R value in text\nselect '1.2.3'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '0'::text::ipaddress;\nERROR:  invalid IP value in text\nselect ' 1.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1.2.3.4 '::text::ipaddress;\nERROR:  invalid IP value in text\nselect '0.0.0.256'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '0.0.256'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '0..255.0'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '+0.255.0.0'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1.2.3.4-1.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect ''::text::ipaddress;\nERROR:  invalid IP value in text\nselect '02001:0000:1234:0000:0000:C1C0:ABCD:0876'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1.2.3.4:1111:2222:3333:4444::5555'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1.2.3.4:1111:2222:3333::5555'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1.2.3.4:1111:2222::5555'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1.2.3.4:1111::5555'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1.2.3.4::'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1.2.3.4::5555'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1111:'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1111:2222:3333:4444::5555:'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1111:2222:3333::5555:'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1111:2222::5555:'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1111::5555:'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '123'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '12345::6:7:8'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1:2:3:4:5:6:7:8:9'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1:2:3::4:5:6:7:8:9'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1:2:3::4:5::7:8'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::1.2.256.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::1.2.3.256'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::1.2.3.300'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::1.2.3.900'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::1.2.300.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::1.2.900.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::1.256.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::1.300.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::1.900.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::256.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::260.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::2::3'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::300.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::300.300.300.300'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::3000.30.30.30'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::400.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:1.2.256.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:1.2.3.256'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:1.2.3.300'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:1.2.3.900'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:1.2.300.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:1.2.900.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:1.256.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:1.300.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:1.900.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:256.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:260.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:300.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:300.300.300.300'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:3000.30.30.30'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:400.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::5:900.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1::900.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '1:::3:4:5'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '2001:0000:1234: 0000:0000:C1C0:ABCD:0876'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '2001:0000:1234:0000:00001:C1C0:ABCD:0876'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '2001::FFD3::57ab'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '2001:DB8:0:0:8:800:200C:417A:221'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '2001:db8:85a3::8a2e:37023:7334'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '2001:db8:85a3::8a2e:370k:7334'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '3ffe:0b00:0000:0001:0000:0000:000a'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '3ffe:b00::1::a'::text::ipaddress;\nERROR:  invalid IP value in text\nselect ':'::text::ipaddress;\nERROR:  invalid IP value in text\nselect ':1111:2222:3333:4444::5555'::text::ipaddress;\nERROR:  invalid IP value in text\nselect ':1111:2222:3333::5555'::text::ipaddress;\nERROR:  invalid IP value in text\nselect ':1111:2222::5555'::text::ipaddress;\nERROR:  invalid IP value in text\nselect ':1111::5555'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::1.2.256.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::1.2.3.256'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::1.2.3.300'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::1.2.3.900'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::1.2.300.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::1.2.900.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::1.256.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::1.300.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::1.900.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::1111:2222:3333:4444:5555:6666::'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::256.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::260.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::300.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::300.300.300.300'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::3000.30.30.30'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::400.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::5555:'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::900.2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect ':::'::text::ipaddress;\nERROR:  invalid IP value in text\nselect ':::5555'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::ffff:2.3.4'::text::ipaddress;\nERROR:  invalid IP value in text\nselect '::ffff:257.1.2.3'::text::ipaddress;\nERROR:  invalid IP value in text\nselect 'FF01::101::2'::text::ipaddress;\nERROR:  invalid IP value in text\nselect 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'::text::ipaddress;\nERROR:  invalid IP value in text\nselect 'ldkfj'::text::ipaddress;\nERROR:  invalid IP value in text\n-- numeric casts\nselect n::ip4 from (select 0::bigint as n) s;\n    n    \n---------\n 0.0.0.0\n(1 row)\n\nselect n::ip4 from (select 256::bigint as n) s;\n    n    \n---------\n 0.0.1.0\n(1 row)\n\nselect n::ip4 from (select 65536::bigint as n) s;\n    n    \n---------\n 0.1.0.0\n(1 row)\n\nselect n::ip4 from (select 16777216::bigint as n) s;\n    n    \n---------\n 1.0.0.0\n(1 row)\n\nselect n::ip4 from (select -1::bigint as n) s;\n        n        \n-----------------\n 255.255.255.255\n(1 row)\n\nselect n::ip4 from (select -2147483647::bigint as n) s;\n     n     \n-----------\n 128.0.0.1\n(1 row)\n\nselect n::ip4 from (select -2147483648::bigint as n) s;\n     n     \n-----------\n 128.0.0.0\n(1 row)\n\nselect n::ip4 from (select 2147483647::bigint as n) s;\n        n        \n-----------------\n 127.255.255.255\n(1 row)\n\nselect n::ip4 from (select 2147483648::bigint as n) s;\n     n     \n-----------\n 128.0.0.0\n(1 row)\n\nselect n::ip4 from (select 4294967295::bigint as n) s;\n        n        \n-----------------\n 255.255.255.255\n(1 row)\n\nselect n::ip4 from (select 0::float8 as n) s;\n    n    \n---------\n 0.0.0.0\n(1 row)\n\nselect n::ip4 from (select 256::float8 as n) s;\n    n    \n---------\n 0.0.1.0\n(1 row)\n\nselect n::ip4 from (select 65536::float8 as n) s;\n    n    \n---------\n 0.1.0.0\n(1 row)\n\nselect n::ip4 from (select 16777216::float8 as n) s;\n    n    \n---------\n 1.0.0.0\n(1 row)\n\nselect n::ip4 from (select -1::float8 as n) s;\n        n        \n-----------------\n 255.255.255.255\n(1 row)\n\nselect n::ip4 from (select -2147483647::float8 as n) s;\n     n     \n-----------\n 128.0.0.1\n(1 row)\n\nselect n::ip4 from (select -2147483648::float8 as n) s;\n     n     \n-----------\n 128.0.0.0\n(1 row)\n\nselect n::ip4 from (select 2147483647::float8 as n) s;\n        n        \n-----------------\n 127.255.255.255\n(1 row)\n\nselect n::ip4 from (select 2147483648::float8 as n) s;\n     n     \n-----------\n 128.0.0.0\n(1 row)\n\nselect n::ip4 from (select 4294967295::float8 as n) s;\n        n        \n-----------------\n 255.255.255.255\n(1 row)\n\nselect n::ip4 from (select 0::numeric as n) s;\n    n    \n---------\n 0.0.0.0\n(1 row)\n\nselect n::ip4 from (select 256::numeric as n) s;\n    n    \n---------\n 0.0.1.0\n(1 row)\n\nselect n::ip4 from (select 65536::numeric as n) s;\n    n    \n---------\n 0.1.0.0\n(1 row)\n\nselect n::ip4 from (select 16777216::numeric as n) s;\n    n    \n---------\n 1.0.0.0\n(1 row)\n\nselect n::ip4 from (select -1::numeric as n) s;\n        n        \n-----------------\n 255.255.255.255\n(1 row)\n\nselect n::ip4 from (select -2147483647::numeric as n) s;\n     n     \n-----------\n 128.0.0.1\n(1 row)\n\nselect n::ip4 from (select -2147483648::numeric as n) s;\n     n     \n-----------\n 128.0.0.0\n(1 row)\n\nselect n::ip4 from (select 2147483647::numeric as n) s;\n        n        \n-----------------\n 127.255.255.255\n(1 row)\n\nselect n::ip4 from (select 2147483648::numeric as n) s;\n     n     \n-----------\n 128.0.0.0\n(1 row)\n\nselect n::ip4 from (select 4294967295::numeric as n) s;\n        n        \n-----------------\n 255.255.255.255\n(1 row)\n\nselect n::ip6 from (select 0::numeric as n) s;\n n  \n----\n ::\n(1 row)\n\nselect n::ip6 from (select 256::numeric as n) s;\n   n   \n-------\n ::100\n(1 row)\n\nselect n::ip6 from (select 65536::numeric as n) s;\n     n     \n-----------\n ::0.1.0.0\n(1 row)\n\nselect n::ip6 from (select 16777216::numeric as n) s;\n     n     \n-----------\n ::1.0.0.0\n(1 row)\n\nselect n::ip6 from (select 4294967296::numeric as n) s;\n    n    \n---------\n ::1:0:0\n(1 row)\n\nselect n::ip6 from (select 281474976710656::numeric as n) s;\n     n     \n-----------\n ::1:0:0:0\n(1 row)\n\nselect n::ip6 from (select 18446744073709551616::numeric as n) s;\n     n     \n-----------\n 0:0:0:1::\n(1 row)\n\nselect n::ip6 from (select 1208925819614629174706176::numeric as n) s;\n    n    \n---------\n 0:0:1::\n(1 row)\n\nselect n::ip6 from (select 79228162514264337593543950336::numeric as n) s;\n   n   \n-------\n 0:1::\n(1 row)\n\nselect n::ip6 from (select 5192296858534827628530496329220096::numeric as n) s;\n  n  \n-----\n 1::\n(1 row)\n\nselect n::ip6 from (select 170141183460469231731687303715884105728::numeric as n) s;\n   n    \n--------\n 8000::\n(1 row)\n\nselect n::ip6 from (select 340282366920938463463374607431768211455::numeric as n) s;\n                    n                    \n-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric, a::bigint, a::float8 from (select '0.0.0.0'::ip4 as a) s;\n a | a | a | a \n---+---+---+---\n 0 | 0 | 0 | 0\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric, a::bigint, a::float8 from (select '255.255.255.255'::ip4 as a) s;\n     a      |     a      |     a      |     a      \n------------+------------+------------+------------\n 4294967295 | 4294967295 | 4294967295 | 4294967295\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric, a::bigint, a::float8 from (select '0.0.0.1'::ip4 as a) s;\n a | a | a | a \n---+---+---+---\n 1 | 1 | 1 | 1\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric, a::bigint, a::float8 from (select '0.0.1.0'::ip4 as a) s;\n  a  |  a  |  a  |  a  \n-----+-----+-----+-----\n 256 | 256 | 256 | 256\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric, a::bigint, a::float8 from (select '0.1.0.0'::ip4 as a) s;\n   a   |   a   |   a   |   a   \n-------+-------+-------+-------\n 65536 | 65536 | 65536 | 65536\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric, a::bigint, a::float8 from (select '1.0.0.0'::ip4 as a) s;\n    a     |    a     |    a     |    a     \n----------+----------+----------+----------\n 16777216 | 16777216 | 16777216 | 16777216\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric from (select '::'::ip6 as a) s;\n a | a \n---+---\n 0 | 0\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6 as a) s;\n                    a                    |                    a                    \n-----------------------------------------+-----------------------------------------\n 340282366920938463463374607431768211455 | 340282366920938463463374607431768211455\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric from (select '::1'::ip6 as a) s;\n a | a \n---+---\n 1 | 1\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric from (select '::1:0'::ip6 as a) s;\n   a   |   a   \n-------+-------\n 65536 | 65536\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric from (select '::1:0:0'::ip6 as a) s;\n     a      |     a      \n------------+------------\n 4294967296 | 4294967296\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric from (select '::1:0:0:0'::ip6 as a) s;\n        a        |        a        \n-----------------+-----------------\n 281474976710656 | 281474976710656\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric from (select '0:0:0:1::'::ip6 as a) s;\n          a           |          a           \n----------------------+----------------------\n 18446744073709551616 | 18446744073709551616\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric from (select '0:0:1::'::ip6 as a) s;\n             a             |             a             \n---------------------------+---------------------------\n 1208925819614629174706176 | 1208925819614629174706176\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric from (select '0:1::'::ip6 as a) s;\n               a               |               a               \n-------------------------------+-------------------------------\n 79228162514264337593543950336 | 79228162514264337593543950336\n(1 row)\n\nselect a::numeric, a::ipaddress::numeric from (select '1::'::ip6 as a) s;\n                 a                  |                 a                  \n------------------------------------+------------------------------------\n 5192296858534827628530496329220096 | 5192296858534827628530496329220096\n(1 row)\n\n-- invalid numeric casts\nselect (-4294967295::bigint)::ip4;\nERROR:  ip address out of range\nselect (4294967296::bigint)::ip4;\nERROR:  ip address out of range\nselect 0.1::float8::ip4;\nWARNING:  double converted to IP4 is not integral\n   ip4   \n---------\n 0.0.0.0\n(1 row)\n\nselect (-0.1)::float8::ip4;\nWARNING:  double converted to IP4 is not integral\n   ip4   \n---------\n 0.0.0.0\n(1 row)\n\nselect (-4294967295::float8)::ip4;\nERROR:  ip address out of range\nselect (4294967296::float8)::ip4;\nERROR:  ip address out of range\nselect (-3000000000::float8)::ip4;\nERROR:  ip address out of range\nselect 6000000000::float8::ip4;\nERROR:  ip address out of range\nselect 6e10::float8::ip4;\nERROR:  ip address out of range\nselect 6e30::float8::ip4;\nERROR:  ip address out of range\nselect (-1::numeric)::ip6;\nERROR:  invalid numeric value for conversion to IP6\nselect 340282366920938463463374607431768211456::numeric::ip6;\nERROR:  numeric value too large for conversion to IP6\nselect 0.1::numeric::ip6;\nERROR:  invalid numeric value for conversion to IP6\nselect 0.00000000000000000001::numeric::ip6;\nERROR:  invalid numeric value for conversion to IP6\nselect (-0.00000000000000000001::numeric)::ip6;\nERROR:  invalid numeric value for conversion to IP6\n-- inet/cidr casts\nselect a::ip4, a::ipaddress from (select '0.0.0.0'::inet as a) s;\n    a    |    a    \n---------+---------\n 0.0.0.0 | 0.0.0.0\n(1 row)\n\nselect a::ip4, a::ipaddress from (select '1.2.3.4'::inet as a) s;\n    a    |    a    \n---------+---------\n 1.2.3.4 | 1.2.3.4\n(1 row)\n\nselect a::ip4, a::ipaddress from (select '255.255.255.255'::inet as a) s;\n        a        |        a        \n-----------------+-----------------\n 255.255.255.255 | 255.255.255.255\n(1 row)\n\nselect a::ip4, a::ipaddress from (select '10.20.30.40/24'::inet as a) s;\n      a      |      a      \n-------------+-------------\n 10.20.30.40 | 10.20.30.40\n(1 row)\n\nselect a::ip4, a::ipaddress from (select '10.20.30.40/16'::inet as a) s;\n      a      |      a      \n-------------+-------------\n 10.20.30.40 | 10.20.30.40\n(1 row)\n\nselect a::ip6, a::ipaddress from (select '::'::inet as a) s;\n a  | a  \n----+----\n :: | ::\n(1 row)\n\nselect a::ip6, a::ipaddress from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::inet as a) s;\n                    a                    |                    a                    \n-----------------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect a::ip6, a::ipaddress from (select '::1'::inet as a) s;\n  a  |  a  \n-----+-----\n ::1 | ::1\n(1 row)\n\nselect a::ip6, a::ipaddress from (select '1234:2345:3456:4567:5678:6789:789a:89ab'::inet as a) s;\n                    a                    |                    a                    \n-----------------------------------------+-----------------------------------------\n 1234:2345:3456:4567:5678:6789:789a:89ab | 1234:2345:3456:4567:5678:6789:789a:89ab\n(1 row)\n\nselect a::ip6, a::ipaddress from (select '1234:2345:3456:4567:5678:6789:789a:89ab/96'::inet as a) s;\n                    a                    |                    a                    \n-----------------------------------------+-----------------------------------------\n 1234:2345:3456:4567:5678:6789:789a:89ab | 1234:2345:3456:4567:5678:6789:789a:89ab\n(1 row)\n\nselect a::ip6, a::ipaddress from (select '1234:2345:3456:4567:5678:6789:789a:89ab/64'::inet as a) s;\n                    a                    |                    a                    \n-----------------------------------------+-----------------------------------------\n 1234:2345:3456:4567:5678:6789:789a:89ab | 1234:2345:3456:4567:5678:6789:789a:89ab\n(1 row)\n\nselect a::ip6, a::ipaddress from (select '1234:2345:3456:4567:5678:6789:789a:89ab/32'::inet as a) s;\n                    a                    |                    a                    \n-----------------------------------------+-----------------------------------------\n 1234:2345:3456:4567:5678:6789:789a:89ab | 1234:2345:3456:4567:5678:6789:789a:89ab\n(1 row)\n\nselect a::ip4r, a::iprange from (select '0.0.0.0/16'::cidr as a) s;\n     a      |     a      \n------------+------------\n 0.0.0.0/16 | 0.0.0.0/16\n(1 row)\n\nselect a::ip4r, a::iprange from (select '0.1.0.0/16'::cidr as a) s;\n     a      |     a      \n------------+------------\n 0.1.0.0/16 | 0.1.0.0/16\n(1 row)\n\nselect a::ip4r, a::iprange from (select '1.2.3.0/24'::cidr as a) s;\n     a      |     a      \n------------+------------\n 1.2.3.0/24 | 1.2.3.0/24\n(1 row)\n\nselect a::ip4r, a::iprange from (select '0.0.0.0/0'::cidr as a) s;\n     a     |     a     \n-----------+-----------\n 0.0.0.0/0 | 0.0.0.0/0\n(1 row)\n\nselect a::ip6r, a::iprange from (select '::/0'::cidr as a) s;\n  a   |  a   \n------+------\n ::/0 | ::/0\n(1 row)\n\nselect a::ip6r, a::iprange from (select 'ffff::/64'::cidr as a) s;\n     a     |     a     \n-----------+-----------\n ffff::/64 | ffff::/64\n(1 row)\n\nselect a::ip6r, a::iprange from (select '0:0:0:0:ffff::/128'::cidr as a) s;\n        a         |        a         \n------------------+------------------\n ::ffff:0:0.0.0.0 | ::ffff:0:0.0.0.0\n(1 row)\n\nselect a::ip6r, a::iprange from (select '1234:2345:3456:4567:5678:6789::/96'::cidr as a) s;\n                 a                  |                 a                  \n------------------------------------+------------------------------------\n 1234:2345:3456:4567:5678:6789::/96 | 1234:2345:3456:4567:5678:6789::/96\n(1 row)\n\nselect '1.2.3.4'::ip4::cidr;\n    cidr    \n------------\n 1.2.3.4/32\n(1 row)\n\nselect '0.0.0.0'::ip4::cidr;\n    cidr    \n------------\n 0.0.0.0/32\n(1 row)\n\nselect '255.255.255.255'::ip4::cidr;\n        cidr        \n--------------------\n 255.255.255.255/32\n(1 row)\n\nselect '1.2.3.0/24'::ip4r::cidr;\n    cidr    \n------------\n 1.2.3.0/24\n(1 row)\n\nselect '0.0.0.0/0'::ip4r::cidr;\n   cidr    \n-----------\n 0.0.0.0/0\n(1 row)\n\nselect '255.255.255.255/32'::ip4r::cidr;\n        cidr        \n--------------------\n 255.255.255.255/32\n(1 row)\n\nselect '1234:2345:3456:4567:5678:6789:789a:89ab'::ip6::cidr;\n                    cidr                     \n---------------------------------------------\n 1234:2345:3456:4567:5678:6789:789a:89ab/128\n(1 row)\n\nselect '::'::ip6::cidr;\n  cidr  \n--------\n ::/128\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6::cidr;\n                    cidr                     \n---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128\n(1 row)\n\nselect '1234:2345:3456:4567:5678:6789:789a:0000/112'::ip6r::cidr;\n                   cidr                   \n------------------------------------------\n 1234:2345:3456:4567:5678:6789:789a:0/112\n(1 row)\n\nselect '::/0'::ip6r::cidr;\n cidr \n------\n ::/0\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::ip6r::cidr;\n                    cidr                     \n---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128\n(1 row)\n\nselect 'ffff:ffff:ffff::/48'::ip6r::cidr;\n        cidr         \n---------------------\n ffff:ffff:ffff::/48\n(1 row)\n\nselect '1.2.3.4'::ipaddress::cidr;\n    cidr    \n------------\n 1.2.3.4/32\n(1 row)\n\nselect '0.0.0.0'::ipaddress::cidr;\n    cidr    \n------------\n 0.0.0.0/32\n(1 row)\n\nselect '255.255.255.255'::ipaddress::cidr;\n        cidr        \n--------------------\n 255.255.255.255/32\n(1 row)\n\nselect '1234:2345:3456:4567:5678:6789:789a:89ab'::ipaddress::cidr;\n                    cidr                     \n---------------------------------------------\n 1234:2345:3456:4567:5678:6789:789a:89ab/128\n(1 row)\n\nselect '::'::ipaddress::cidr;\n  cidr  \n--------\n ::/128\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ipaddress::cidr;\n                    cidr                     \n---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128\n(1 row)\n\nselect '1.2.3.0/24'::iprange::cidr;\n    cidr    \n------------\n 1.2.3.0/24\n(1 row)\n\nselect '0.0.0.0/0'::iprange::cidr;\n   cidr    \n-----------\n 0.0.0.0/0\n(1 row)\n\nselect '255.255.255.255/32'::iprange::cidr;\n        cidr        \n--------------------\n 255.255.255.255/32\n(1 row)\n\nselect '1234:2345:3456:4567:5678:6789:789a:0000/112'::iprange::cidr;\n                   cidr                   \n------------------------------------------\n 1234:2345:3456:4567:5678:6789:789a:0/112\n(1 row)\n\nselect '::/0'::iprange::cidr;\n cidr \n------\n ::/0\n(1 row)\n\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::iprange::cidr;\n                    cidr                     \n---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128\n(1 row)\n\nselect 'ffff:ffff:ffff::/48'::iprange::cidr;\n        cidr         \n---------------------\n ffff:ffff:ffff::/48\n(1 row)\n\nselect '-'::iprange::cidr;\n cidr \n------\n \n(1 row)\n\n-- invalid inet/cidr casts\nselect '::'::inet::ip4;\nERROR:  invalid INET value for conversion to IP4\nselect '0.0.0.0'::inet::ip6;\nERROR:  invalid INET value for conversion to IP6\nselect '::/128'::cidr::ip4r;\nERROR:  invalid CIDR value for conversion to IP4R\nselect '0.0.0.0/32'::cidr::ip6r;\nERROR:  invalid CIDR value for conversion to IP6R\n-- invalid cross-type casts\nselect '::/0'::iprange::ip4r;\nERROR:  invalid IPR value for conversion to IP4R\nselect '0.0.0.0/0'::iprange::ip6r;\nERROR:  invalid IPR value for conversion to IP6R\nselect '::'::ipaddress::ip4;\nERROR:  invalid IP value in cast to IP4\nselect '0.0.0.0'::ipaddress::ip6;\nERROR:  invalid IP value in cast to IP4\n-- bit casts\nselect (x'01020304')::ip4;\n   ip4   \n---------\n 1.2.3.4\n(1 row)\n\nselect (x'fff0fff1fff2fff3000000000000fff4')::ip6;\n            ip6            \n---------------------------\n fff0:fff1:fff2:fff3::fff4\n(1 row)\n\nselect (x'01020304')::ipaddress;\n ipaddress \n-----------\n 1.2.3.4\n(1 row)\n\nselect (x'fff0fff1fff2fff3000000000000fff4')::ipaddress;\n         ipaddress         \n---------------------------\n fff0:fff1:fff2:fff3::fff4\n(1 row)\n\nselect (b'0001')::varbit::ip4r;\n    ip4r    \n------------\n 16.0.0.0/4\n(1 row)\n\nselect (b'0001')::varbit::ip6r;\n   ip6r   \n----------\n 1000::/4\n(1 row)\n\nselect (x'fff0fff1fff2fff3000000000000fff')::varbit::ip6r;\n             ip6r              \n-------------------------------\n fff0:fff1:fff2:fff3::fff0/124\n(1 row)\n\nselect (ip4 '1.2.3.4')::varbit;\n              varbit              \n----------------------------------\n 00000001000000100000001100000100\n(1 row)\n\nselect (ip6 'fff0:fff1:fff2:fff3::fff4')::varbit;\n                                                              varbit                                                              \n----------------------------------------------------------------------------------------------------------------------------------\n 11111111111100001111111111110001111111111111001011111111111100110000000000000000000000000000000000000000000000001111111111110100\n(1 row)\n\nselect (ipaddress '1.2.3.4')::varbit;\n              varbit              \n----------------------------------\n 00000001000000100000001100000100\n(1 row)\n\nselect (ipaddress 'fff0:fff1:fff2:fff3::fff4')::varbit;\n                                                              varbit                                                              \n----------------------------------------------------------------------------------------------------------------------------------\n 11111111111100001111111111110001111111111111001011111111111100110000000000000000000000000000000000000000000000001111111111110100\n(1 row)\n\nselect (ip4r '1.2.3.0/24')::varbit;\n          varbit          \n--------------------------\n 000000010000001000000011\n(1 row)\n\nselect (ip6r 'fff0::/12')::varbit;\n    varbit    \n--------------\n 111111111111\n(1 row)\n\nselect (ip6r 'fff0::/127')::varbit;\n                                                             varbit                                                              \n---------------------------------------------------------------------------------------------------------------------------------\n 1111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n(1 row)\n\nselect (iprange '-')::varbit;\n varbit \n--------\n \n(1 row)\n\nselect (iprange '1.2.3.0/24')::varbit;\n          varbit          \n--------------------------\n 000000010000001000000011\n(1 row)\n\nselect (iprange '1.2.3.1-1.2.3.2')::varbit;\n varbit \n--------\n \n(1 row)\n\nselect (iprange 'fff0::/12')::varbit;\n    varbit    \n--------------\n 111111111111\n(1 row)\n\nselect (iprange 'fff0::0001-fff0::0002')::varbit;\n varbit \n--------\n \n(1 row)\n\n-- invalid bit casts\nselect (x'0102030')::ip4;\nERROR:  invalid BIT value for conversion to IP4\nselect (x'0102030405')::ip4;\nERROR:  invalid BIT value for conversion to IP4\nselect (x'fff0fff1fff2fff3000000000000fff')::ip6;\nERROR:  invalid BIT value for conversion to IP6\nselect (x'fff0fff1fff2fff3000000000000fff4f')::ip6;\nERROR:  invalid BIT value for conversion to IP6\nselect (x'0102030')::ipaddress;\nERROR:  invalid BIT value for conversion to IPADDRESS\nselect (x'0102030405')::ipaddress;\nERROR:  invalid BIT value for conversion to IPADDRESS\nselect (x'fff0fff1fff2fff3000000000000fff')::ipaddress;\nERROR:  invalid BIT value for conversion to IPADDRESS\nselect (x'fff0fff1fff2fff3000000000000fff4f')::ipaddress;\nERROR:  invalid BIT value for conversion to IPADDRESS\n-- bytea casts\nselect (decode('01020304','hex'))::ip4;\n decode  \n---------\n 1.2.3.4\n(1 row)\n\nselect (decode('fff0fff1fff2fff3000000000000fff4','hex'))::ip6;\n          decode           \n---------------------------\n fff0:fff1:fff2:fff3::fff4\n(1 row)\n\nselect (decode('01020304','hex'))::ipaddress;\n decode  \n---------\n 1.2.3.4\n(1 row)\n\nselect (decode('fff0fff1fff2fff3000000000000fff4','hex'))::ipaddress;\n          decode           \n---------------------------\n fff0:fff1:fff2:fff3::fff4\n(1 row)\n\nselect encode((ip4 '1.2.3.4')::bytea,'hex');\n  encode  \n----------\n 01020304\n(1 row)\n\nselect encode((ip6 'fff0:fff1:fff2:fff3::fff4')::bytea,'hex');\n              encode              \n----------------------------------\n fff0fff1fff2fff3000000000000fff4\n(1 row)\n\nselect encode((ipaddress '1.2.3.4')::bytea,'hex');\n  encode  \n----------\n 01020304\n(1 row)\n\nselect encode((ipaddress 'fff0:fff1:fff2:fff3::fff4')::bytea,'hex');\n              encode              \n----------------------------------\n fff0fff1fff2fff3000000000000fff4\n(1 row)\n\n-- invalid bytea casts\nselect (decode('010203','hex'))::ip4;\nERROR:  invalid BYTEA value for conversion to IP4\nselect (decode('0102030405','hex'))::ip4;\nERROR:  invalid BYTEA value for conversion to IP4\nselect (decode('fff0fff1fff2fff3000000000000ff','hex'))::ip6;\nERROR:  invalid BYTEA value for conversion to IP4\nselect (decode('0102030405','hex'))::ipaddress;\nERROR:  invalid BYTEA value for conversion to IPADDRESS\nselect (decode('fff0fff1fff2fff3000000000000ff','hex'))::ipaddress;\nERROR:  invalid BYTEA value for conversion to IPADDRESS\nselect (decode('fff0fff1fff2fff3000000000000ffffff','hex'))::ipaddress;\nERROR:  invalid BYTEA value for conversion to IPADDRESS\n-- constructor functions\nselect ip4r('0.0.0.0','255.255.255.255');\n   ip4r    \n-----------\n 0.0.0.0/0\n(1 row)\n\nselect ip4r('255.255.255.255','0.0.0.0');\n   ip4r    \n-----------\n 0.0.0.0/0\n(1 row)\n\nselect ip4r('1.2.3.4','5.6.7.8');\n      ip4r       \n-----------------\n 1.2.3.4-5.6.7.8\n(1 row)\n\nselect ip6r('::','ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff');\n ip6r \n------\n ::/0\n(1 row)\n\nselect ip6r('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff','::');\n ip6r \n------\n ::/0\n(1 row)\n\nselect ip6r('1234:2345:3456:4567:5678:6789:789a:89ab','ffff::ffff');\n                        ip6r                        \n----------------------------------------------------\n 1234:2345:3456:4567:5678:6789:789a:89ab-ffff::ffff\n(1 row)\n\nselect iprange('0.0.0.0'::ip4,'255.255.255.255'::ip4);\n  iprange  \n-----------\n 0.0.0.0/0\n(1 row)\n\nselect iprange('255.255.255.255'::ip4,'0.0.0.0'::ip4);\n  iprange  \n-----------\n 0.0.0.0/0\n(1 row)\n\nselect iprange('1.2.3.4'::ip4,'5.6.7.8'::ip4);\n     iprange     \n-----------------\n 1.2.3.4-5.6.7.8\n(1 row)\n\nselect iprange('::'::ip6,'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6);\n iprange \n---------\n ::/0\n(1 row)\n\nselect iprange('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6,'::'::ip6);\n iprange \n---------\n ::/0\n(1 row)\n\nselect iprange('1234:2345:3456:4567:5678:6789:789a:89ab'::ip6,'ffff::ffff'::ip6);\n                      iprange                       \n----------------------------------------------------\n 1234:2345:3456:4567:5678:6789:789a:89ab-ffff::ffff\n(1 row)\n\nselect iprange('0.0.0.0'::ipaddress,'255.255.255.255'::ipaddress);\n  iprange  \n-----------\n 0.0.0.0/0\n(1 row)\n\nselect iprange('255.255.255.255'::ipaddress,'0.0.0.0'::ipaddress);\n  iprange  \n-----------\n 0.0.0.0/0\n(1 row)\n\nselect iprange('1.2.3.4'::ipaddress,'5.6.7.8'::ipaddress);\n     iprange     \n-----------------\n 1.2.3.4-5.6.7.8\n(1 row)\n\nselect iprange('::'::ipaddress,'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ipaddress);\n iprange \n---------\n ::/0\n(1 row)\n\nselect iprange('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ipaddress,'::'::ipaddress);\n iprange \n---------\n ::/0\n(1 row)\n\nselect iprange('1234:2345:3456:4567:5678:6789:789a:89ab'::ipaddress,'ffff::ffff'::ipaddress);\n                      iprange                       \n----------------------------------------------------\n 1234:2345:3456:4567:5678:6789:789a:89ab-ffff::ffff\n(1 row)\n\n-- utility functions\n-- (family, lower, upper were tested above)\nselect ip4_netmask(0), ip4_netmask(1), ip4_netmask(31), ip4_netmask(32);\n ip4_netmask | ip4_netmask |   ip4_netmask   |   ip4_netmask   \n-------------+-------------+-----------------+-----------------\n 0.0.0.0     | 128.0.0.0   | 255.255.255.254 | 255.255.255.255\n(1 row)\n\nselect ip4_netmask(33);\nERROR:  prefix length out of range\nselect ip4_netmask(-1);\nERROR:  prefix length out of range\nselect ip6_netmask(0), ip6_netmask(1);\n ip6_netmask | ip6_netmask \n-------------+-------------\n ::          | 8000::\n(1 row)\n\nselect ip6_netmask(63), ip6_netmask(64), ip6_netmask(65);\n      ip6_netmask      |      ip6_netmask      |        ip6_netmask         \n-----------------------+-----------------------+----------------------------\n ffff:ffff:ffff:fffe:: | ffff:ffff:ffff:ffff:: | ffff:ffff:ffff:ffff:8000::\n(1 row)\n\nselect ip6_netmask(127), ip6_netmask(128);\n               ip6_netmask               |               ip6_netmask               \n-----------------------------------------+-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect ip6_netmask(129);\nERROR:  prefix length out of range\nselect ip6_netmask(-1);\nERROR:  prefix length out of range\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '1.2.3.4-5.6.7.8'::ip4r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n f       | f       |         |        \n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '1.2.3.0-1.2.3.255'::ip4r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |      24 |      24\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '0.0.0.0/32'::ip4r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |      32 |      32\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '0.0.0.0/31'::ip4r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |      31 |      31\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '0.0.0.0/1'::ip4r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |       1 |       1\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '0.0.0.0/0'::ip4r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |       0 |       0\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '255.255.255.255/32'::ip4r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |      32 |      32\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '255.255.255.254/31'::ip4r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |      31 |      31\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '128.0.0.0/1'::ip4r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |       1 |       1\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '1234::-5678::ffff:0'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n f       | f       |         |        \n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '::1234-::5678'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n f       | f       |         |        \n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff::-ffff::ffff:0'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n f       | f       |         |        \n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff::-ffff::ffff'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |     112 |     112\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff::-ffff:0:0:0:ffff:ffff:ffff:ffff'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |      64 |      64\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff::-ffff:0:0:1:ffff:ffff:ffff:ffff'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |      63 |      63\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '::/128'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |     128 |     128\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '::/127'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |     127 |     127\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '::/1'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |       1 |       1\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '::/0'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |       0 |       0\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |     128 |     128\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |     127 |     127\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff:ffff:ffff:ffff:8000::/65'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |      65 |      65\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff:ffff:ffff:ffff::/64'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |      64 |      64\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff:ffff:ffff:fffe::/63'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |      63 |      63\n(1 row)\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::ip6r as a) s;\n is_cidr | is_cidr | masklen | masklen \n---------+---------+---------+---------\n t       | t       |     128 |     128\n(1 row)\n\nselect ip4_net_lower('255.255.255.255',0);\n ip4_net_lower \n---------------\n 0.0.0.0\n(1 row)\n\nselect ip4_net_lower('255.255.255.255',1);\n ip4_net_lower \n---------------\n 128.0.0.0\n(1 row)\n\nselect ip4_net_lower('255.255.255.255',24);\n ip4_net_lower \n---------------\n 255.255.255.0\n(1 row)\n\nselect ip4_net_lower('255.255.255.255',31);\n  ip4_net_lower  \n-----------------\n 255.255.255.254\n(1 row)\n\nselect ip4_net_lower('255.255.255.255',32);\n  ip4_net_lower  \n-----------------\n 255.255.255.255\n(1 row)\n\nselect ip4_net_lower('255.255.255.255',33);\nERROR:  prefix length out of range\nselect ip4_net_lower('255.255.255.255',-1);\nERROR:  prefix length out of range\nselect ip4_net_upper('0.0.0.0',0);\n  ip4_net_upper  \n-----------------\n 255.255.255.255\n(1 row)\n\nselect ip4_net_upper('0.0.0.0',1);\n  ip4_net_upper  \n-----------------\n 127.255.255.255\n(1 row)\n\nselect ip4_net_upper('0.0.0.0',24);\n ip4_net_upper \n---------------\n 0.0.0.255\n(1 row)\n\nselect ip4_net_upper('0.0.0.0',31);\n ip4_net_upper \n---------------\n 0.0.0.1\n(1 row)\n\nselect ip4_net_upper('0.0.0.0',32);\n ip4_net_upper \n---------------\n 0.0.0.0\n(1 row)\n\nselect ip4_net_upper('0.0.0.0',33);\nERROR:  prefix length out of range\nselect ip4_net_upper('0.0.0.0',-1);\nERROR:  prefix length out of range\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',0);\n ip6_net_lower \n---------------\n ::\n(1 row)\n\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',1);\n ip6_net_lower \n---------------\n 8000::\n(1 row)\n\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',63);\n     ip6_net_lower     \n-----------------------\n ffff:ffff:ffff:fffe::\n(1 row)\n\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',64);\n     ip6_net_lower     \n-----------------------\n ffff:ffff:ffff:ffff::\n(1 row)\n\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',65);\n       ip6_net_lower        \n----------------------------\n ffff:ffff:ffff:ffff:8000::\n(1 row)\n\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',127);\n              ip6_net_lower              \n-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe\n(1 row)\n\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',128);\n              ip6_net_lower              \n-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',129);\nERROR:  prefix length out of range\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',-1);\nERROR:  prefix length out of range\nselect ip6_net_upper('::',0);\n              ip6_net_upper              \n-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect ip6_net_upper('::',1);\n              ip6_net_upper              \n-----------------------------------------\n 7fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect ip6_net_upper('::',63);\n      ip6_net_upper      \n-------------------------\n ::1:ffff:ffff:ffff:ffff\n(1 row)\n\nselect ip6_net_upper('::',64);\n     ip6_net_upper     \n-----------------------\n ::ffff:ffff:ffff:ffff\n(1 row)\n\nselect ip6_net_upper('::',65);\n     ip6_net_upper     \n-----------------------\n ::7fff:ffff:ffff:ffff\n(1 row)\n\nselect ip6_net_upper('::',127);\n ip6_net_upper \n---------------\n ::1\n(1 row)\n\nselect ip6_net_upper('::',128);\n ip6_net_upper \n---------------\n ::\n(1 row)\n\nselect ip6_net_upper('::',129);\nERROR:  prefix length out of range\nselect ip6_net_upper('::',-1);\nERROR:  prefix length out of range\nselect ipaddress_net_lower('255.255.255.255',0);\n ipaddress_net_lower \n---------------------\n 0.0.0.0\n(1 row)\n\nselect ipaddress_net_lower('255.255.255.255',1);\n ipaddress_net_lower \n---------------------\n 128.0.0.0\n(1 row)\n\nselect ipaddress_net_lower('255.255.255.255',24);\n ipaddress_net_lower \n---------------------\n 255.255.255.0\n(1 row)\n\nselect ipaddress_net_lower('255.255.255.255',31);\n ipaddress_net_lower \n---------------------\n 255.255.255.254\n(1 row)\n\nselect ipaddress_net_lower('255.255.255.255',32);\n ipaddress_net_lower \n---------------------\n 255.255.255.255\n(1 row)\n\nselect ipaddress_net_lower('255.255.255.255',33);\nERROR:  prefix length out of range\nselect ipaddress_net_lower('255.255.255.255',-1);\nERROR:  prefix length out of range\nselect ipaddress_net_upper('0.0.0.0',0);\n ipaddress_net_upper \n---------------------\n 255.255.255.255\n(1 row)\n\nselect ipaddress_net_upper('0.0.0.0',1);\n ipaddress_net_upper \n---------------------\n 127.255.255.255\n(1 row)\n\nselect ipaddress_net_upper('0.0.0.0',24);\n ipaddress_net_upper \n---------------------\n 0.0.0.255\n(1 row)\n\nselect ipaddress_net_upper('0.0.0.0',31);\n ipaddress_net_upper \n---------------------\n 0.0.0.1\n(1 row)\n\nselect ipaddress_net_upper('0.0.0.0',32);\n ipaddress_net_upper \n---------------------\n 0.0.0.0\n(1 row)\n\nselect ipaddress_net_upper('0.0.0.0',33);\nERROR:  prefix length out of range\nselect ipaddress_net_upper('0.0.0.0',-1);\nERROR:  prefix length out of range\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',0);\n ipaddress_net_lower \n---------------------\n ::\n(1 row)\n\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',1);\n ipaddress_net_lower \n---------------------\n 8000::\n(1 row)\n\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',63);\n  ipaddress_net_lower  \n-----------------------\n ffff:ffff:ffff:fffe::\n(1 row)\n\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',64);\n  ipaddress_net_lower  \n-----------------------\n ffff:ffff:ffff:ffff::\n(1 row)\n\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',65);\n    ipaddress_net_lower     \n----------------------------\n ffff:ffff:ffff:ffff:8000::\n(1 row)\n\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',127);\n           ipaddress_net_lower           \n-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe\n(1 row)\n\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',128);\n           ipaddress_net_lower           \n-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',129);\nERROR:  prefix length out of range\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',-1);\nERROR:  prefix length out of range\nselect ipaddress_net_upper('::',0);\n           ipaddress_net_upper           \n-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect ipaddress_net_upper('::',1);\n           ipaddress_net_upper           \n-----------------------------------------\n 7fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect ipaddress_net_upper('::',63);\n   ipaddress_net_upper   \n-------------------------\n ::1:ffff:ffff:ffff:ffff\n(1 row)\n\nselect ipaddress_net_upper('::',64);\n  ipaddress_net_upper  \n-----------------------\n ::ffff:ffff:ffff:ffff\n(1 row)\n\nselect ipaddress_net_upper('::',65);\n  ipaddress_net_upper  \n-----------------------\n ::7fff:ffff:ffff:ffff\n(1 row)\n\nselect ipaddress_net_upper('::',127);\n ipaddress_net_upper \n---------------------\n ::1\n(1 row)\n\nselect ipaddress_net_upper('::',128);\n ipaddress_net_upper \n---------------------\n ::\n(1 row)\n\nselect ipaddress_net_upper('::',129);\nERROR:  prefix length out of range\nselect ipaddress_net_upper('::',-1);\nERROR:  prefix length out of range\nselect ip4r_union('1.0.0.0/24','2.0.0.0/16');\n     ip4r_union      \n---------------------\n 1.0.0.0-2.0.255.255\n(1 row)\n\nselect ip4r_union('0.0.0.0/0','2.0.0.0/16');\n ip4r_union \n------------\n 0.0.0.0/0\n(1 row)\n\nselect ip4r_union('0.0.0.0-3.0.0.0','2.0.0.0-4.0.0.0');\n   ip4r_union    \n-----------------\n 0.0.0.0-4.0.0.0\n(1 row)\n\nselect ip6r_union('2000::/16','3000::/16');\n                   ip6r_union                   \n------------------------------------------------\n 2000::-3000:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect ip6r_union('2000::-4000::','3000::-5000::');\n  ip6r_union   \n---------------\n 2000::-5000::\n(1 row)\n\nselect ip6r_union('::/0','3000::-5000::');\n ip6r_union \n------------\n ::/0\n(1 row)\n\nselect iprange_union('0.0.0.0/0','::/0');\n iprange_union \n---------------\n -\n(1 row)\n\nselect iprange_union('128.0.0.0/32','8000::/16');\n iprange_union \n---------------\n -\n(1 row)\n\nselect iprange_union('1.0.0.0/24','2.0.0.0/16');\n    iprange_union    \n---------------------\n 1.0.0.0-2.0.255.255\n(1 row)\n\nselect iprange_union('0.0.0.0/0','2.0.0.0/16');\n iprange_union \n---------------\n 0.0.0.0/0\n(1 row)\n\nselect iprange_union('0.0.0.0-3.0.0.0','2.0.0.0-4.0.0.0');\n  iprange_union  \n-----------------\n 0.0.0.0-4.0.0.0\n(1 row)\n\nselect iprange_union('2000::/16','3000::/16');\n                 iprange_union                  \n------------------------------------------------\n 2000::-3000:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect iprange_union('2000::-4000::','3000::-5000::');\n iprange_union \n---------------\n 2000::-5000::\n(1 row)\n\nselect iprange_union('::/0','3000::-5000::');\n iprange_union \n---------------\n ::/0\n(1 row)\n\nselect ip4r_inter('1.0.0.0/24','2.0.0.0/16');\n ip4r_inter \n------------\n \n(1 row)\n\nselect ip4r_inter('0.0.0.0/0','2.0.0.0/16');\n ip4r_inter \n------------\n 2.0.0.0/16\n(1 row)\n\nselect ip4r_inter('0.0.0.0-3.0.0.0','2.0.0.0-4.0.0.0');\n   ip4r_inter    \n-----------------\n 2.0.0.0-3.0.0.0\n(1 row)\n\nselect ip6r_inter('2000::/16','3000::/16');\n ip6r_inter \n------------\n \n(1 row)\n\nselect ip6r_inter('2000::-4000::','3000::-5000::');\n  ip6r_inter   \n---------------\n 3000::-4000::\n(1 row)\n\nselect ip6r_inter('::/0','3000::-5000::');\n  ip6r_inter   \n---------------\n 3000::-5000::\n(1 row)\n\nselect iprange_inter('0.0.0.0/0','::/0');\n iprange_inter \n---------------\n \n(1 row)\n\nselect iprange_inter('128.0.0.0/32','8000::/16');\n iprange_inter \n---------------\n \n(1 row)\n\nselect iprange_inter('1.0.0.0/24','2.0.0.0/16');\n iprange_inter \n---------------\n \n(1 row)\n\nselect iprange_inter('0.0.0.0/0','2.0.0.0/16');\n iprange_inter \n---------------\n 2.0.0.0/16\n(1 row)\n\nselect iprange_inter('0.0.0.0-3.0.0.0','2.0.0.0-4.0.0.0');\n  iprange_inter  \n-----------------\n 2.0.0.0-3.0.0.0\n(1 row)\n\nselect iprange_inter('2000::/16','3000::/16');\n iprange_inter \n---------------\n \n(1 row)\n\nselect iprange_inter('2000::-4000::','3000::-5000::');\n iprange_inter \n---------------\n 3000::-4000::\n(1 row)\n\nselect iprange_inter('::/0','3000::-5000::');\n iprange_inter \n---------------\n 3000::-5000::\n(1 row)\n\n-- split\nselect * from cidr_split(ip4r '1.2.3.4-5.6.7.8');\n  cidr_split  \n--------------\n 1.2.3.4/30\n 1.2.3.8/29\n 1.2.3.16/28\n 1.2.3.32/27\n 1.2.3.64/26\n 1.2.3.128/25\n 1.2.4.0/22\n 1.2.8.0/21\n 1.2.16.0/20\n 1.2.32.0/19\n 1.2.64.0/18\n 1.2.128.0/17\n 1.3.0.0/16\n 1.4.0.0/14\n 1.8.0.0/13\n 1.16.0.0/12\n 1.32.0.0/11\n 1.64.0.0/10\n 1.128.0.0/9\n 2.0.0.0/7\n 4.0.0.0/8\n 5.0.0.0/14\n 5.4.0.0/15\n 5.6.0.0/22\n 5.6.4.0/23\n 5.6.6.0/24\n 5.6.7.0/29\n 5.6.7.8\n(28 rows)\n\nselect * from cidr_split(ip4r '1.2.3.5-5.6.7.7');\n  cidr_split  \n--------------\n 1.2.3.5\n 1.2.3.6/31\n 1.2.3.8/29\n 1.2.3.16/28\n 1.2.3.32/27\n 1.2.3.64/26\n 1.2.3.128/25\n 1.2.4.0/22\n 1.2.8.0/21\n 1.2.16.0/20\n 1.2.32.0/19\n 1.2.64.0/18\n 1.2.128.0/17\n 1.3.0.0/16\n 1.4.0.0/14\n 1.8.0.0/13\n 1.16.0.0/12\n 1.32.0.0/11\n 1.64.0.0/10\n 1.128.0.0/9\n 2.0.0.0/7\n 4.0.0.0/8\n 5.0.0.0/14\n 5.4.0.0/15\n 5.6.0.0/22\n 5.6.4.0/23\n 5.6.6.0/24\n 5.6.7.0/29\n(28 rows)\n\nselect * from cidr_split(ip4r '1.0.0.0-1.0.255.255');\n cidr_split \n------------\n 1.0.0.0/16\n(1 row)\n\nselect * from cidr_split(ip4r '0.0.0.0-255.255.255.255');\n cidr_split \n------------\n 0.0.0.0/0\n(1 row)\n\nselect * from cidr_split(ip4r '0.0.0.0-0.0.0.9');\n cidr_split \n------------\n 0.0.0.0/29\n 0.0.0.8/31\n(2 rows)\n\nselect * from cidr_split(ip4r '255.255.255.251-255.255.255.255');\n     cidr_split     \n--------------------\n 255.255.255.251\n 255.255.255.252/30\n(2 rows)\n\nselect * from cidr_split(ip6r 'ffff::1234-ffff::1243');\n   cidr_split   \n----------------\n ffff::1234/126\n ffff::1238/125\n ffff::1240/126\n(3 rows)\n\nselect * from cidr_split(ip6r 'ffff:0:0:1234::-ffff:0:0:1243::');\n     cidr_split     \n--------------------\n ffff:0:0:1234::/62\n ffff:0:0:1238::/61\n ffff:0:0:1240::/63\n ffff:0:0:1242::/64\n ffff:0:0:1243::\n(5 rows)\n\nselect * from cidr_split(ip6r 'aaaa::cdef-aaaa::fedc');\n   cidr_split   \n----------------\n aaaa::cdef\n aaaa::cdf0/124\n aaaa::ce00/119\n aaaa::d000/116\n aaaa::e000/116\n aaaa::f000/117\n aaaa::f800/118\n aaaa::fc00/119\n aaaa::fe00/121\n aaaa::fe80/122\n aaaa::fec0/124\n aaaa::fed0/125\n aaaa::fed8/126\n aaaa::fedc\n(14 rows)\n\nselect * from cidr_split(ip6r 'ffff:0:0:aaaa::/64');\n     cidr_split     \n--------------------\n ffff:0:0:aaaa::/64\n(1 row)\n\nselect * from cidr_split(ip6r '::-::0009');\n cidr_split \n------------\n ::/125\n ::8/127\n(2 rows)\n\nselect * from cidr_split(ip6r 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff3-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff');\n                 cidr_split                  \n---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff3\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff4/126\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125\n(3 rows)\n\nselect * from cidr_split(iprange '1.2.3.4-5.6.7.8');\n  cidr_split  \n--------------\n 1.2.3.4/30\n 1.2.3.8/29\n 1.2.3.16/28\n 1.2.3.32/27\n 1.2.3.64/26\n 1.2.3.128/25\n 1.2.4.0/22\n 1.2.8.0/21\n 1.2.16.0/20\n 1.2.32.0/19\n 1.2.64.0/18\n 1.2.128.0/17\n 1.3.0.0/16\n 1.4.0.0/14\n 1.8.0.0/13\n 1.16.0.0/12\n 1.32.0.0/11\n 1.64.0.0/10\n 1.128.0.0/9\n 2.0.0.0/7\n 4.0.0.0/8\n 5.0.0.0/14\n 5.4.0.0/15\n 5.6.0.0/22\n 5.6.4.0/23\n 5.6.6.0/24\n 5.6.7.0/29\n 5.6.7.8\n(28 rows)\n\nselect * from cidr_split(iprange '1.2.3.5-5.6.7.7');\n  cidr_split  \n--------------\n 1.2.3.5\n 1.2.3.6/31\n 1.2.3.8/29\n 1.2.3.16/28\n 1.2.3.32/27\n 1.2.3.64/26\n 1.2.3.128/25\n 1.2.4.0/22\n 1.2.8.0/21\n 1.2.16.0/20\n 1.2.32.0/19\n 1.2.64.0/18\n 1.2.128.0/17\n 1.3.0.0/16\n 1.4.0.0/14\n 1.8.0.0/13\n 1.16.0.0/12\n 1.32.0.0/11\n 1.64.0.0/10\n 1.128.0.0/9\n 2.0.0.0/7\n 4.0.0.0/8\n 5.0.0.0/14\n 5.4.0.0/15\n 5.6.0.0/22\n 5.6.4.0/23\n 5.6.6.0/24\n 5.6.7.0/29\n(28 rows)\n\nselect * from cidr_split(iprange 'ffff::1234-ffff::1243');\n   cidr_split   \n----------------\n ffff::1234/126\n ffff::1238/125\n ffff::1240/126\n(3 rows)\n\nselect * from cidr_split(iprange 'aaaa::cdef-aaaa::fedc');\n   cidr_split   \n----------------\n aaaa::cdef\n aaaa::cdf0/124\n aaaa::ce00/119\n aaaa::d000/116\n aaaa::e000/116\n aaaa::f000/117\n aaaa::f800/118\n aaaa::fc00/119\n aaaa::fe00/121\n aaaa::fe80/122\n aaaa::fec0/124\n aaaa::fed0/125\n aaaa::fed8/126\n aaaa::fedc\n(14 rows)\n\nselect * from cidr_split(iprange '1.0.0.0/16');\n cidr_split \n------------\n 1.0.0.0/16\n(1 row)\n\nselect * from cidr_split(iprange 'ffff:0:0:aaaa::/64');\n     cidr_split     \n--------------------\n ffff:0:0:aaaa::/64\n(1 row)\n\nselect * from cidr_split(iprange '-');\n cidr_split \n------------\n 0.0.0.0/0\n ::/0\n(2 rows)\n\n-- rescan\nwith d(a) as (values (ip4r '1.2.3.4-1.2.4.3'),(ip4r '10.2.3.5-10.2.4.4'))\nselect *, (select * from cidr_split(a) limit 1) as s from d;\n         a         |     s      \n-------------------+------------\n 1.2.3.4-1.2.4.3   | 1.2.3.4/30\n 10.2.3.5-10.2.4.4 | 10.2.3.5\n(2 rows)\n\nwith d(a) as (values (ip6r 'ffff::1234-ffff::1243'),(ip6r 'aaaa::cdef-aaaa::fedc'))\nselect *, (select * from cidr_split(a) limit 1) as s from d;\n           a           |       s        \n-----------------------+----------------\n ffff::1234-ffff::1243 | ffff::1234/126\n aaaa::cdef-aaaa::fedc | aaaa::cdef\n(2 rows)\n\nwith d(a) as (values (iprange '-'),(iprange '1.2.3.4-1.2.4.3'),\n                     (iprange 'aaaa::fedc-aaaa::cdef'),(iprange '-'))\nselect *, (select * from cidr_split(a) limit 1) as s from d;\n           a           |     s      \n-----------------------+------------\n -                     | 0.0.0.0/0\n 1.2.3.4-1.2.4.3       | 1.2.3.4/30\n aaaa::cdef-aaaa::fedc | aaaa::cdef\n -                     | 0.0.0.0/0\n(4 rows)\n\n-- operators\nselect ip4 '255.255.255.255' / 32;\n    ?column?     \n-----------------\n 255.255.255.255\n(1 row)\n\nselect ip4 '255.255.255.255' / 31;\n      ?column?      \n--------------------\n 255.255.255.254/31\n(1 row)\n\nselect ip4 '255.255.255.255' / 16;\n    ?column?    \n----------------\n 255.255.0.0/16\n(1 row)\n\nselect ip4 '255.255.255.255' / 0;\n ?column?  \n-----------\n 0.0.0.0/0\n(1 row)\n\nselect ip4 '255.255.255.255' / 1;\n  ?column?   \n-------------\n 128.0.0.0/1\n(1 row)\n\nselect ip4 '255.255.255.255' / 33;\nERROR:  prefix length out of range\nselect ip4 '255.255.255.255' / -1;\nERROR:  prefix length out of range\nselect ip4 '255.255.255.255' / ip4 '255.255.255.0';\n     ?column?     \n------------------\n 255.255.255.0/24\n(1 row)\n\nselect ip4 '255.255.255.255' / ip4 '255.0.0.0';\n  ?column?   \n-------------\n 255.0.0.0/8\n(1 row)\n\nselect ip4 '255.255.255.255' / ip4 '0.255.255.255';\nERROR:  invalid netmask\nselect ip4 '255.255.255.255' / ip4 '255.254.255.255';\nERROR:  invalid netmask\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 128;\n                ?column?                 \n-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 127;\n                  ?column?                   \n---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127\n(1 row)\n\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 65;\n           ?column?            \n-------------------------------\n ffff:ffff:ffff:ffff:8000::/65\n(1 row)\n\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 64;\n         ?column?         \n--------------------------\n ffff:ffff:ffff:ffff::/64\n(1 row)\n\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 63;\n         ?column?         \n--------------------------\n ffff:ffff:ffff:fffe::/63\n(1 row)\n\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 1;\n ?column? \n----------\n 8000::/1\n(1 row)\n\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 0;\n ?column? \n----------\n ::/0\n(1 row)\n\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 129;\nERROR:  prefix length out of range\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / -1;\nERROR:  prefix length out of range\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ip6 'ffff:ffff:ffff:ffff:ffff::';\n           ?column?            \n-------------------------------\n ffff:ffff:ffff:ffff:ffff::/80\n(1 row)\n\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ip6 'ffff:ffff:ffff::';\n      ?column?       \n---------------------\n ffff:ffff:ffff::/48\n(1 row)\n\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ip6 'ffff:ffff:ffff:ffff:ffff::ffff';\nERROR:  invalid netmask\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ip6 'ffff:ffff:ffff::ffff';\nERROR:  invalid netmask\nselect ipaddress '255.255.255.255' / 32;\n    ?column?     \n-----------------\n 255.255.255.255\n(1 row)\n\nselect ipaddress '255.255.255.255' / 31;\n      ?column?      \n--------------------\n 255.255.255.254/31\n(1 row)\n\nselect ipaddress '255.255.255.255' / 16;\n    ?column?    \n----------------\n 255.255.0.0/16\n(1 row)\n\nselect ipaddress '255.255.255.255' / 0;\n ?column?  \n-----------\n 0.0.0.0/0\n(1 row)\n\nselect ipaddress '255.255.255.255' / 1;\n  ?column?   \n-------------\n 128.0.0.0/1\n(1 row)\n\nselect ipaddress '255.255.255.255' / 33;\nERROR:  prefix length out of range\nselect ipaddress '255.255.255.255' / -1;\nERROR:  prefix length out of range\nselect ipaddress '255.255.255.255' / ipaddress '255.255.255.0';\n     ?column?     \n------------------\n 255.255.255.0/24\n(1 row)\n\nselect ipaddress '255.255.255.255' / ipaddress '255.0.0.0';\n  ?column?   \n-------------\n 255.0.0.0/8\n(1 row)\n\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 128;\n                ?column?                 \n-----------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n(1 row)\n\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 127;\n                  ?column?                   \n---------------------------------------------\n ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127\n(1 row)\n\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 65;\n           ?column?            \n-------------------------------\n ffff:ffff:ffff:ffff:8000::/65\n(1 row)\n\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 64;\n         ?column?         \n--------------------------\n ffff:ffff:ffff:ffff::/64\n(1 row)\n\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 63;\n         ?column?         \n--------------------------\n ffff:ffff:ffff:fffe::/63\n(1 row)\n\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 1;\n ?column? \n----------\n 8000::/1\n(1 row)\n\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 0;\n ?column? \n----------\n ::/0\n(1 row)\n\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 129;\nERROR:  prefix length out of range\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / -1;\nERROR:  prefix length out of range\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ipaddress 'ffff:ffff:ffff:ffff:ffff::';\n           ?column?            \n-------------------------------\n ffff:ffff:ffff:ffff:ffff::/80\n(1 row)\n\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ipaddress 'ffff:ffff:ffff::';\n      ?column?       \n---------------------\n ffff:ffff:ffff::/48\n(1 row)\n\nselect ipaddress '255.255.255.255' / ipaddress '0.255.255.255';\nERROR:  invalid netmask\nselect ipaddress '255.255.255.255' / ipaddress '255.254.255.255';\nERROR:  invalid netmask\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ipaddress 'ffff:ffff:ffff:ffff:ffff::ffff';\nERROR:  invalid netmask\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ipaddress 'ffff:ffff:ffff::ffff';\nERROR:  invalid netmask\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ipaddress '0.0.0.0';\nERROR:  invalid mixing of IP address families\nselect ipaddress '255.255.255.255' / ipaddress '::';\nERROR:  invalid mixing of IP address families\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '0.0.0.0/32'::ip4r as a) s;\n ?column? | ?column? | ?column? | ?column? \n----------+----------+----------+----------\n        1 |        1 |        1 |        1\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '0.0.0.0/31'::ip4r as a) s;\n ?column? | ?column? | ?column? | ?column? \n----------+----------+----------+----------\n        2 |        2 |        2 |        2\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '0.0.0.0/16'::ip4r as a) s;\n ?column? | ?column? | ?column? | ?column? \n----------+----------+----------+----------\n    65536 |    65536 |    65536 |    65536\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '0.0.0.0/1'::ip4r as a) s;\n  ?column?  |  ?column?  |  ?column?  |  ?column?  \n------------+------------+------------+------------\n 2147483648 | 2147483648 | 2147483648 | 2147483648\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '0.0.0.0/0'::ip4r as a) s;\n  ?column?  |  ?column?  |  ?column?  |  ?column?  \n------------+------------+------------+------------\n 4294967296 | 4294967296 | 4294967296 | 4294967296\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '1.2.3.4-5.6.7.8'::ip4r as a) s;\n ?column? | ?column? | ?column? | ?column? \n----------+----------+----------+----------\n 67372037 | 67372037 | 67372037 | 67372037\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/128'::ip6r as a) s;\n ?column? | ?column? | ?column? | ?column? \n----------+----------+----------+----------\n        1 |        1 |        1 |        1\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/127'::ip6r as a) s;\n ?column? | ?column? | ?column? | ?column? \n----------+----------+----------+----------\n        2 |        2 |        2 |        2\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/65'::ip6r as a) s;\n       ?column?       |      ?column?       |       ?column?       |      ?column?       \n----------------------+---------------------+----------------------+---------------------\n 9.22337203685478e+18 | 9223372036854775808 | 9.22337203685478e+18 | 9223372036854775808\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/64'::ip6r as a) s;\n       ?column?       |       ?column?       |       ?column?       |       ?column?       \n----------------------+----------------------+----------------------+----------------------\n 1.84467440737096e+19 | 18446744073709551616 | 1.84467440737096e+19 | 18446744073709551616\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/63'::ip6r as a) s;\n       ?column?       |       ?column?       |       ?column?       |       ?column?       \n----------------------+----------------------+----------------------+----------------------\n 3.68934881474191e+19 | 36893488147419103232 | 3.68934881474191e+19 | 36893488147419103232\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/1'::ip6r as a) s;\n       ?column?       |                ?column?                 |       ?column?       |                ?column?                 \n----------------------+-----------------------------------------+----------------------+-----------------------------------------\n 1.70141183460469e+38 | 170141183460469231731687303715884105728 | 1.70141183460469e+38 | 170141183460469231731687303715884105728\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/0'::ip6r as a) s;\n       ?column?       |                ?column?                 |       ?column?       |                ?column?                 \n----------------------+-----------------------------------------+----------------------+-----------------------------------------\n 3.40282366920938e+38 | 340282366920938463463374607431768211456 | 3.40282366920938e+38 | 340282366920938463463374607431768211456\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select 'ffff:ffff:ffff:ffff::-ffff:ffff:ffff:ffff:8000::'::ip6r as a) s;\n       ?column?       |      ?column?       |       ?column?       |      ?column?       \n----------------------+---------------------+----------------------+---------------------\n 9.22337203685478e+18 | 9223372036854775809 | 9.22337203685478e+18 | 9223372036854775809\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select 'ffff:ffff:ffff::-ffff:ffff:ffff:8000::'::ip6r as a) s;\n       ?column?       |         ?column?         |       ?column?       |         ?column?         \n----------------------+--------------------------+----------------------+--------------------------\n 6.04462909807315e+23 | 604462909807314587353089 | 6.04462909807315e+23 | 604462909807314587353089\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select 'ffff:ffff::-ffff:ffff:8000::'::ip6r as a) s;\n       ?column?       |           ?column?            |       ?column?       |           ?column?            \n----------------------+-------------------------------+----------------------+-------------------------------\n 3.96140812571322e+28 | 39614081257132168796771975169 | 3.96140812571322e+28 | 39614081257132168796771975169\n(1 row)\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select 'ffff::-ffff:8000::'::ip6r as a) s;\n       ?column?       |              ?column?              |       ?column?       |              ?column?              \n----------------------+------------------------------------+----------------------+------------------------------------\n 2.59614842926741e+33 | 2596148429267413814265248164610049 | 2.59614842926741e+33 | 2596148429267413814265248164610049\n(1 row)\n\nselect @ a, @@ a from (select '-'::iprange as a) s;\n       ?column?       |                ?column?                 \n----------------------+-----------------------------------------\n 6.80564733841877e+38 | 680564733841876926926749214863536422912\n(1 row)\n\n-- bitwise ops\nselect a & b, a::ipaddress & b::ipaddress from (select ip4 '1.2.3.4' as a, ip4 '255.0.255.0' as b) s;\n ?column? | ?column? \n----------+----------\n 1.0.3.0  | 1.0.3.0\n(1 row)\n\nselect a | b, a::ipaddress | b::ipaddress from (select ip4 '1.2.3.4' as a, ip4 '255.0.255.0' as b) s;\n  ?column?   |  ?column?   \n-------------+-------------\n 255.2.255.4 | 255.2.255.4\n(1 row)\n\nselect a # b, a::ipaddress # b::ipaddress from (select ip4 '1.2.3.4' as a, ip4 '255.0.255.0' as b) s;\n  ?column?   |  ?column?   \n-------------+-------------\n 254.2.252.4 | 254.2.252.4\n(1 row)\n\nselect ~a, ~(a::ipaddress) from (select ip4 '1.2.3.4' as a) s;\n    ?column?     |    ?column?     \n-----------------+-----------------\n 254.253.252.251 | 254.253.252.251\n(1 row)\n\nselect a & b, a::ipaddress & b::ipaddress from (select ip6 '1234::5678' as a, ip6 'ffff:0000:ffff:0000:ffff:0000:ffff:0000' as b) s;\n ?column? | ?column? \n----------+----------\n 1234::   | 1234::\n(1 row)\n\nselect a | b, a::ipaddress | b::ipaddress from (select ip6 '1234::5678' as a, ip6 'ffff:0000:ffff:0000:ffff:0000:ffff:0000' as b) s;\n            ?column?            |            ?column?            \n--------------------------------+--------------------------------\n ffff:0:ffff:0:ffff:0:ffff:5678 | ffff:0:ffff:0:ffff:0:ffff:5678\n(1 row)\n\nselect a # b, a::ipaddress # b::ipaddress from (select ip6 '1234::5678' as a, ip6 'ffff:0000:ffff:0000:ffff:0000:ffff:0000' as b) s;\n            ?column?            |            ?column?            \n--------------------------------+--------------------------------\n edcb:0:ffff:0:ffff:0:ffff:5678 | edcb:0:ffff:0:ffff:0:ffff:5678\n(1 row)\n\nselect ~a, ~(a::ipaddress) from (select ip6 '1234::5678' as a) s;\n                ?column?                 |                ?column?                 \n-----------------------------------------+-----------------------------------------\n edcb:ffff:ffff:ffff:ffff:ffff:ffff:a987 | edcb:ffff:ffff:ffff:ffff:ffff:ffff:a987\n(1 row)\n\n-- arithmetic\nselect a + 1234, a::ipaddress + 1234 from (select ip4 '0.0.0.0' as a) s;\n ?column?  | ?column?  \n-----------+-----------\n 0.0.4.210 | 0.0.4.210\n(1 row)\n\nselect a + 1, a::ipaddress + 1 from (select ip4 '255.255.255.254' as a) s;\n    ?column?     |    ?column?     \n-----------------+-----------------\n 255.255.255.255 | 255.255.255.255\n(1 row)\n\nselect a + 1 from (select ip4 '255.255.255.255' as a) s;\nERROR:  ip address out of range\nselect a::ipaddress + 1 from (select ip4 '255.255.255.255' as a) s;\nERROR:  ip address out of range\nselect a - 1234, a::ipaddress - 1234 from (select ip4 '1.0.0.0' as a) s;\n   ?column?   |   ?column?   \n--------------+--------------\n 0.255.251.46 | 0.255.251.46\n(1 row)\n\nselect a - 1, a::ipaddress - 1 from (select ip4 '0.0.0.1' as a) s;\n ?column? | ?column? \n----------+----------\n 0.0.0.0  | 0.0.0.0\n(1 row)\n\nselect a - 1 from (select ip4 '0.0.0.0' as a) s;\nERROR:  ip address out of range\nselect a::ipaddress - 1 from (select ip4 '0.0.0.0' as a) s;\nERROR:  ip address out of range\nselect a + 1234::bigint, a::ipaddress + 1234::bigint from (select ip4 '0.0.0.0' as a) s;\n ?column?  | ?column?  \n-----------+-----------\n 0.0.4.210 | 0.0.4.210\n(1 row)\n\nselect a + 1::bigint, a::ipaddress + 1::bigint from (select ip4 '255.255.255.254' as a) s;\n    ?column?     |    ?column?     \n-----------------+-----------------\n 255.255.255.255 | 255.255.255.255\n(1 row)\n\nselect a + 1::bigint from (select ip4 '255.255.255.255' as a) s;\nERROR:  ip address out of range\nselect a::ipaddress + 1::bigint from (select ip4 '255.255.255.255' as a) s;\nERROR:  ip address out of range\nselect a + 4294967296::bigint from (select ip4 '0.0.0.0' as a) s;\nERROR:  ip address out of range\nselect a::ipaddress + 4294967296::bigint from (select ip4 '0.0.0.0' as a) s;\nERROR:  ip address out of range\nselect a - 1234::bigint, a::ipaddress - 1234::bigint from (select ip4 '1.0.0.0' as a) s;\n   ?column?   |   ?column?   \n--------------+--------------\n 0.255.251.46 | 0.255.251.46\n(1 row)\n\nselect a - 1::bigint, a::ipaddress - 1::bigint from (select ip4 '0.0.0.1' as a) s;\n ?column? | ?column? \n----------+----------\n 0.0.0.0  | 0.0.0.0\n(1 row)\n\nselect a - 1::bigint from (select ip4 '0.0.0.0' as a) s;\nERROR:  ip address out of range\nselect a::ipaddress - 1::bigint from (select ip4 '0.0.0.0' as a) s;\nERROR:  ip address out of range\nselect a - 4294967296::bigint from (select ip4 '255.255.255.255' as a) s;\nERROR:  ip address out of range\nselect a::ipaddress - 4294967296::bigint from (select ip4 '255.255.255.255' as a) s;\nERROR:  ip address out of range\nselect a + 1234::numeric, a::ipaddress + 1234::numeric from (select ip4 '0.0.0.0' as a) s;\n ?column?  | ?column?  \n-----------+-----------\n 0.0.4.210 | 0.0.4.210\n(1 row)\n\nselect a + 1::numeric, a::ipaddress + 1::numeric from (select ip4 '255.255.255.254' as a) s;\n    ?column?     |    ?column?     \n-----------------+-----------------\n 255.255.255.255 | 255.255.255.255\n(1 row)\n\nselect a + 1::numeric from (select ip4 '255.255.255.255' as a) s;\nERROR:  ip address out of range\nselect a::ipaddress + 1::numeric from (select ip4 '255.255.255.255' as a) s;\nERROR:  ip address out of range\nselect a + 4294967296::numeric from (select ip4 '0.0.0.0' as a) s;\nERROR:  ip address out of range\nselect a::ipaddress + 4294967296::numeric from (select ip4 '0.0.0.0' as a) s;\nERROR:  ip address out of range\nselect a - 1234::numeric, a::ipaddress - 1234::numeric from (select ip4 '1.0.0.0' as a) s;\n   ?column?   |   ?column?   \n--------------+--------------\n 0.255.251.46 | 0.255.251.46\n(1 row)\n\nselect a - 1::numeric, a::ipaddress - 1::numeric from (select ip4 '0.0.0.1' as a) s;\n ?column? | ?column? \n----------+----------\n 0.0.0.0  | 0.0.0.0\n(1 row)\n\nselect a - 1::numeric from (select ip4 '0.0.0.0' as a) s;\nERROR:  ip address out of range\nselect a::ipaddress - 1::numeric from (select ip4 '0.0.0.0' as a) s;\nERROR:  ip address out of range\nselect a - 4294967296::bigint from (select ip4 '255.255.255.255' as a) s;\nERROR:  ip address out of range\nselect a::ipaddress - 4294967296::bigint from (select ip4 '255.255.255.255' as a) s;\nERROR:  ip address out of range\n-- predicates and indexing\ncreate table ipranges (r iprange, r4 ip4r, r6 ip6r);\ninsert into ipranges\nselect r, null, r\n  from (select ip6r(regexp_replace(ls, E'(....(?!$))', E'\\\\1:', 'g')::ip6,\n                    regexp_replace(substring(ls for n+1) || substring(us from n+2),\n                                   E'(....(?!$))', E'\\\\1:', 'g')::ip6) as r\n          from (select md5(i || ' lower 1') as ls,\n                       md5(i || ' upper 1') as us,\n                       (i % 11) + (i/11 % 11) + (i/121 % 11) as n\n                  from generate_series(1,13310) i) s1) s2;\ninsert into ipranges\nselect r, r, null\n  from (select ip4r(ip4 '0.0.0.0' + ((la & '::ffff:ffff') - ip6 '::'),\n                    ip4 '0.0.0.0' + ((( (la & ip6_netmask(127-n)) | (ua & ~ip6_netmask(127-n)) ) & '::ffff:ffff') - ip6 '::')) as r\n          from (select regexp_replace(md5(i || ' lower 2'), E'(....(?!$))', E'\\\\1:', 'g')::ip6 as la,\n                       regexp_replace(md5(i || ' upper 2'), E'(....(?!$))', E'\\\\1:', 'g')::ip6 as ua,\n                       (i % 11) + (i/11 % 11) + (i/121 % 11) as n\n                  from generate_series(1,1331) i) s1) s2;\ninsert into ipranges\nselect r, null, r\n  from (select n::ip6 / 68 as r\n          from (select ((8192 + i/256)::numeric * (2::numeric ^ 112)\n                       + (131072 + (i % 256))::numeric * (2::numeric ^ 60)) as n\n                  from generate_series(0,4095) i) s1) s2;\ninsert into ipranges\nselect r, r, null\n  from (select n / 28 as r\n          from (select ip4 '172.16.0.0' + (i * 256) as n\n                  from generate_series(0,4095) i) s1) s2;\ninsert into ipranges\nselect r, null, r\n  from (select n::ip6 / 48 as r\n          from (select ((8192 + i/256)::numeric * (2::numeric ^ 112)\n                       + (i % 256)::numeric * (2::numeric ^ 84)) as n\n                  from generate_series(0,4095) i) s1) s2;\ninsert into ipranges\nselect r, r, null\n  from (select n / 16 as r\n          from (select ip4 '128.0.0.0' + (i * 65536) as n\n                  from generate_series(0,4095) i) s1) s2;\ninsert into ipranges values ('-',null,null);\ncreate table ipaddrs (a ipaddress, a4 ip4, a6 ip6);\ninsert into ipaddrs\nselect a, null, a\n  from (select regexp_replace(md5(i || ' address 1'), E'(....(?!$))', E'\\\\1:', 'g')::ip6 as a\n          from generate_series(1,256) i) s1;\ninsert into ipaddrs\nselect a, a, null\n  from (select ip4 '0.0.0.0' + ((regexp_replace(md5(i || ' address 1'), E'(....(?!$))', E'\\\\1:', 'g')::ip6 & '::ffff:ffff') - '::') as a\n          from generate_series(1,16) i) s1;\nselect * from ipranges where r >>= '5555::' order by r;\n                                       r                                        | r4 |                                       r6                                       \n--------------------------------------------------------------------------------+----+--------------------------------------------------------------------------------\n -                                                                              |    | \n 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e |    | 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e\n(2 rows)\n\nselect * from ipranges where r <<= '5555::/16' order by r;\n                                        r                                        | r4 |                                       r6                                        \n---------------------------------------------------------------------------------+----+---------------------------------------------------------------------------------\n 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4 |    | 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4\n(1 row)\n\nselect * from ipranges where r && '5555::/16' order by r;\n                                        r                                        | r4 |                                       r6                                        \n---------------------------------------------------------------------------------+----+---------------------------------------------------------------------------------\n -                                                                               |    | \n 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e  |    | 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e\n 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4 |    | 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4\n(3 rows)\n\nselect * from ipranges where r6 >>= '5555::' order by r6;\n                                       r                                        | r4 |                                       r6                                       \n--------------------------------------------------------------------------------+----+--------------------------------------------------------------------------------\n 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e |    | 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e\n(1 row)\n\nselect * from ipranges where r6 <<= '5555::/16' order by r6;\n                                        r                                        | r4 |                                       r6                                        \n---------------------------------------------------------------------------------+----+---------------------------------------------------------------------------------\n 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4 |    | 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4\n(1 row)\n\nselect * from ipranges where r6 && '5555::/16' order by r6;\n                                        r                                        | r4 |                                       r6                                        \n---------------------------------------------------------------------------------+----+---------------------------------------------------------------------------------\n 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e  |    | 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e\n 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4 |    | 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4\n(2 rows)\n\nselect * from ipranges where r >>= '172.16.2.0' order by r;\n               r               |              r4               | r6 \n-------------------------------+-------------------------------+----\n -                             |                               | \n 155.206.49.182-190.20.159.162 | 155.206.49.182-190.20.159.162 | \n 172.16.2.0/28                 | 172.16.2.0/28                 | \n(3 rows)\n\nselect * from ipranges where r <<= '10.0.0.0/12' order by r;\n              r              |             r4              | r6 \n-----------------------------+-----------------------------+----\n 10.4.12.130-10.5.82.192     | 10.4.12.130-10.5.82.192     | \n 10.10.145.149-10.13.167.136 | 10.10.145.149-10.13.167.136 | \n(2 rows)\n\nselect * from ipranges where r && '10.128.0.0/12' order by r;\n             r              |             r4             | r6 \n----------------------------+----------------------------+----\n -                          |                            | \n 9.228.56.34-28.197.214.173 | 9.228.56.34-28.197.214.173 | \n(2 rows)\n\nselect * from ipranges where r4 >>= '172.16.2.0' order by r4;\n               r               |              r4               | r6 \n-------------------------------+-------------------------------+----\n 155.206.49.182-190.20.159.162 | 155.206.49.182-190.20.159.162 | \n 172.16.2.0/28                 | 172.16.2.0/28                 | \n(2 rows)\n\nselect * from ipranges where r4 <<= '10.0.0.0/12' order by r4;\n              r              |             r4              | r6 \n-----------------------------+-----------------------------+----\n 10.4.12.130-10.5.82.192     | 10.4.12.130-10.5.82.192     | \n 10.10.145.149-10.13.167.136 | 10.10.145.149-10.13.167.136 | \n(2 rows)\n\nselect * from ipranges where r4 && '10.128.0.0/12' order by r4;\n             r              |             r4             | r6 \n----------------------------+----------------------------+----\n 9.228.56.34-28.197.214.173 | 9.228.56.34-28.197.214.173 | \n(1 row)\n\nselect * from ipranges where r >>= '2001:0:0:2000:a123::' order by r;\n            r            | r4 |           r6            \n-------------------------+----+-------------------------\n -                       |    | \n 2001::/48               |    | 2001::/48\n 2001:0:0:2000:a000::/68 |    | 2001:0:0:2000:a000::/68\n(3 rows)\n\nselect * from ipranges where r >>= '2001:0:0:2000::' order by r;\n         r          | r4 |         r6         \n--------------------+----+--------------------\n -                  |    | \n 2001::/48          |    | 2001::/48\n 2001:0:0:2000::/68 |    | 2001:0:0:2000::/68\n(3 rows)\n\nselect * from ipranges where r >>= '2001:0:0:2000::/68' order by r;\n         r          | r4 |         r6         \n--------------------+----+--------------------\n -                  |    | \n 2001::/48          |    | 2001::/48\n 2001:0:0:2000::/68 |    | 2001:0:0:2000::/68\n(3 rows)\n\nselect * from ipranges where r >> '2001:0:0:2000::/68' order by r;\n     r     | r4 |    r6     \n-----------+----+-----------\n -         |    | \n 2001::/48 |    | 2001::/48\n(2 rows)\n\nselect * from ipranges where r6 >>= '2001:0:0:2000:a123::' order by r6;\n            r            | r4 |           r6            \n-------------------------+----+-------------------------\n 2001::/48               |    | 2001::/48\n 2001:0:0:2000:a000::/68 |    | 2001:0:0:2000:a000::/68\n(2 rows)\n\nselect * from ipranges where r6 >>= '2001:0:0:2000::' order by r6;\n         r          | r4 |         r6         \n--------------------+----+--------------------\n 2001::/48          |    | 2001::/48\n 2001:0:0:2000::/68 |    | 2001:0:0:2000::/68\n(2 rows)\n\nselect * from ipranges where r6 >>= '2001:0:0:2000::/68' order by r6;\n         r          | r4 |         r6         \n--------------------+----+--------------------\n 2001::/48          |    | 2001::/48\n 2001:0:0:2000::/68 |    | 2001:0:0:2000::/68\n(2 rows)\n\nselect * from ipranges where r6 >> '2001:0:0:2000::/68' order by r6;\n     r     | r4 |    r6     \n-----------+----+-----------\n 2001::/48 |    | 2001::/48\n(1 row)\n\nselect * from ipranges where r4 >>= '172.16.2.0/28' order by r4;\n               r               |              r4               | r6 \n-------------------------------+-------------------------------+----\n 155.206.49.182-190.20.159.162 | 155.206.49.182-190.20.159.162 | \n 172.16.2.0/28                 | 172.16.2.0/28                 | \n(2 rows)\n\nselect * from ipranges where r4 >> '172.16.2.0/28' order by r4;\n               r               |              r4               | r6 \n-------------------------------+-------------------------------+----\n 155.206.49.182-190.20.159.162 | 155.206.49.182-190.20.159.162 | \n(1 row)\n\nselect * from ipaddrs where a between '8.0.0.0' and '15.0.0.0' order by a;\n      a       |      a4      | a6 \n--------------+--------------+----\n 12.174.29.15 | 12.174.29.15 | \n(1 row)\n\nselect * from ipaddrs where a4 between '8.0.0.0' and '15.0.0.0' order by a4;\n      a       |      a4      | a6 \n--------------+--------------+----\n 12.174.29.15 | 12.174.29.15 | \n(1 row)\n\ncreate index ipranges_r on ipranges using gist (r);\ncreate index ipranges_r4 on ipranges using gist (r4);\ncreate index ipranges_r6 on ipranges using gist (r6);\ncreate index ipaddrs_a on ipaddrs (a);\ncreate index ipaddrs_a4 on ipaddrs (a4);\ncreate index ipaddrs_a6 on ipaddrs (a6);\nselect * from ipranges where r >>= '5555::' order by r;\n                                       r                                        | r4 |                                       r6                                       \n--------------------------------------------------------------------------------+----+--------------------------------------------------------------------------------\n -                                                                              |    | \n 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e |    | 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e\n(2 rows)\n\nselect * from ipranges where r <<= '5555::/16' order by r;\n                                        r                                        | r4 |                                       r6                                        \n---------------------------------------------------------------------------------+----+---------------------------------------------------------------------------------\n 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4 |    | 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4\n(1 row)\n\nselect * from ipranges where r && '5555::/16' order by r;\n                                        r                                        | r4 |                                       r6                                        \n---------------------------------------------------------------------------------+----+---------------------------------------------------------------------------------\n -                                                                               |    | \n 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e  |    | 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e\n 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4 |    | 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4\n(3 rows)\n\nselect * from ipranges where r6 >>= '5555::' order by r6;\n                                       r                                        | r4 |                                       r6                                       \n--------------------------------------------------------------------------------+----+--------------------------------------------------------------------------------\n 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e |    | 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e\n(1 row)\n\nselect * from ipranges where r6 <<= '5555::/16' order by r6;\n                                        r                                        | r4 |                                       r6                                        \n---------------------------------------------------------------------------------+----+---------------------------------------------------------------------------------\n 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4 |    | 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4\n(1 row)\n\nselect * from ipranges where r6 && '5555::/16' order by r6;\n                                        r                                        | r4 |                                       r6                                        \n---------------------------------------------------------------------------------+----+---------------------------------------------------------------------------------\n 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e  |    | 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e\n 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4 |    | 5555:50fc:35c2:a4c9:7424:1aac:86c8:b3db-5555:50fc:35c2:a4c9:7424:1aaf:fe86:d6d4\n(2 rows)\n\nselect * from ipranges where r >>= '172.16.2.0' order by r;\n               r               |              r4               | r6 \n-------------------------------+-------------------------------+----\n -                             |                               | \n 155.206.49.182-190.20.159.162 | 155.206.49.182-190.20.159.162 | \n 172.16.2.0/28                 | 172.16.2.0/28                 | \n(3 rows)\n\nselect * from ipranges where r <<= '10.0.0.0/12' order by r;\n              r              |             r4              | r6 \n-----------------------------+-----------------------------+----\n 10.4.12.130-10.5.82.192     | 10.4.12.130-10.5.82.192     | \n 10.10.145.149-10.13.167.136 | 10.10.145.149-10.13.167.136 | \n(2 rows)\n\nselect * from ipranges where r && '10.128.0.0/12' order by r;\n             r              |             r4             | r6 \n----------------------------+----------------------------+----\n -                          |                            | \n 9.228.56.34-28.197.214.173 | 9.228.56.34-28.197.214.173 | \n(2 rows)\n\nselect * from ipranges where r4 >>= '172.16.2.0' order by r4;\n               r               |              r4               | r6 \n-------------------------------+-------------------------------+----\n 155.206.49.182-190.20.159.162 | 155.206.49.182-190.20.159.162 | \n 172.16.2.0/28                 | 172.16.2.0/28                 | \n(2 rows)\n\nselect * from ipranges where r4 <<= '10.0.0.0/12' order by r4;\n              r              |             r4              | r6 \n-----------------------------+-----------------------------+----\n 10.4.12.130-10.5.82.192     | 10.4.12.130-10.5.82.192     | \n 10.10.145.149-10.13.167.136 | 10.10.145.149-10.13.167.136 | \n(2 rows)\n\nselect * from ipranges where r4 && '10.128.0.0/12' order by r4;\n             r              |             r4             | r6 \n----------------------------+----------------------------+----\n 9.228.56.34-28.197.214.173 | 9.228.56.34-28.197.214.173 | \n(1 row)\n\nselect * from ipranges where r >>= '2001:0:0:2000:a123::' order by r;\n            r            | r4 |           r6            \n-------------------------+----+-------------------------\n -                       |    | \n 2001::/48               |    | 2001::/48\n 2001:0:0:2000:a000::/68 |    | 2001:0:0:2000:a000::/68\n(3 rows)\n\nselect * from ipranges where r >>= '2001:0:0:2000::' order by r;\n         r          | r4 |         r6         \n--------------------+----+--------------------\n -                  |    | \n 2001::/48          |    | 2001::/48\n 2001:0:0:2000::/68 |    | 2001:0:0:2000::/68\n(3 rows)\n\nselect * from ipranges where r >>= '2001:0:0:2000::/68' order by r;\n         r          | r4 |         r6         \n--------------------+----+--------------------\n -                  |    | \n 2001::/48          |    | 2001::/48\n 2001:0:0:2000::/68 |    | 2001:0:0:2000::/68\n(3 rows)\n\nselect * from ipranges where r >> '2001:0:0:2000::/68' order by r;\n     r     | r4 |    r6     \n-----------+----+-----------\n -         |    | \n 2001::/48 |    | 2001::/48\n(2 rows)\n\nselect * from ipranges where r6 >>= '2001:0:0:2000:a123::' order by r6;\n            r            | r4 |           r6            \n-------------------------+----+-------------------------\n 2001::/48               |    | 2001::/48\n 2001:0:0:2000:a000::/68 |    | 2001:0:0:2000:a000::/68\n(2 rows)\n\nselect * from ipranges where r6 >>= '2001:0:0:2000::' order by r6;\n         r          | r4 |         r6         \n--------------------+----+--------------------\n 2001::/48          |    | 2001::/48\n 2001:0:0:2000::/68 |    | 2001:0:0:2000::/68\n(2 rows)\n\nselect * from ipranges where r6 >>= '2001:0:0:2000::/68' order by r6;\n         r          | r4 |         r6         \n--------------------+----+--------------------\n 2001::/48          |    | 2001::/48\n 2001:0:0:2000::/68 |    | 2001:0:0:2000::/68\n(2 rows)\n\nselect * from ipranges where r6 >> '2001:0:0:2000::/68' order by r6;\n     r     | r4 |    r6     \n-----------+----+-----------\n 2001::/48 |    | 2001::/48\n(1 row)\n\nselect * from ipranges where r4 >>= '172.16.2.0/28' order by r4;\n               r               |              r4               | r6 \n-------------------------------+-------------------------------+----\n 155.206.49.182-190.20.159.162 | 155.206.49.182-190.20.159.162 | \n 172.16.2.0/28                 | 172.16.2.0/28                 | \n(2 rows)\n\nselect * from ipranges where r4 >> '172.16.2.0/28' order by r4;\n               r               |              r4               | r6 \n-------------------------------+-------------------------------+----\n 155.206.49.182-190.20.159.162 | 155.206.49.182-190.20.159.162 | \n(1 row)\n\nselect * from ipaddrs where a between '8.0.0.0' and '15.0.0.0' order by a;\n      a       |      a4      | a6 \n--------------+--------------+----\n 12.174.29.15 | 12.174.29.15 | \n(1 row)\n\nselect * from ipaddrs where a4 between '8.0.0.0' and '15.0.0.0' order by a4;\n      a       |      a4      | a6 \n--------------+--------------+----\n 12.174.29.15 | 12.174.29.15 | \n(1 row)\n\nselect * from ipaddrs a join ipranges r on (r.r >>= a.a) order by a,r;\n                    a                    |       a4        |                   a6                    |                                        r                                        |               r4               |                                       r6                                        \n-----------------------------------------+-----------------+-----------------------------------------+---------------------------------------------------------------------------------+--------------------------------+---------------------------------------------------------------------------------\n 12.174.29.15                            | 12.174.29.15    |                                         | -                                                                               |                                | \n 12.174.29.15                            | 12.174.29.15    |                                         | 9.228.56.34-28.197.214.173                                                      | 9.228.56.34-28.197.214.173     | \n 33.8.16.211                             | 33.8.16.211     |                                         | -                                                                               |                                | \n 33.8.16.211                             | 33.8.16.211     |                                         | 32.219.217.193-34.140.113.120                                                   | 32.219.217.193-34.140.113.120  | \n 55.224.125.146                          | 55.224.125.146  |                                         | -                                                                               |                                | \n 73.239.169.71                           | 73.239.169.71   |                                         | -                                                                               |                                | \n 73.239.169.71                           | 73.239.169.71   |                                         | 65.76.62.93-75.189.2.219                                                        | 65.76.62.93-75.189.2.219       | \n 73.239.169.71                           | 73.239.169.71   |                                         | 70.178.141.1-79.252.178.95                                                      | 70.178.141.1-79.252.178.95     | \n 76.178.38.194                           | 76.178.38.194   |                                         | -                                                                               |                                | \n 76.178.38.194                           | 76.178.38.194   |                                         | 70.178.141.1-79.252.178.95                                                      | 70.178.141.1-79.252.178.95     | \n 76.178.38.194                           | 76.178.38.194   |                                         | 75.211.173.58-77.84.189.178                                                     | 75.211.173.58-77.84.189.178    | \n 76.178.38.194                           | 76.178.38.194   |                                         | 76.164.111.154-76.183.66.114                                                    | 76.164.111.154-76.183.66.114   | \n 96.76.124.246                           | 96.76.124.246   |                                         | -                                                                               |                                | \n 104.175.11.72                           | 104.175.11.72   |                                         | -                                                                               |                                | \n 104.175.11.72                           | 104.175.11.72   |                                         | 104.76.127.225-105.198.184.62                                                   | 104.76.127.225-105.198.184.62  | \n 163.145.90.183                          | 163.145.90.183  |                                         | -                                                                               |                                | \n 163.145.90.183                          | 163.145.90.183  |                                         | 155.206.49.182-190.20.159.162                                                   | 155.206.49.182-190.20.159.162  | \n 189.85.58.60                            | 189.85.58.60    |                                         | -                                                                               |                                | \n 189.85.58.60                            | 189.85.58.60    |                                         | 155.206.49.182-190.20.159.162                                                   | 155.206.49.182-190.20.159.162  | \n 189.85.58.60                            | 189.85.58.60    |                                         | 184.142.247.0-191.129.204.149                                                   | 184.142.247.0-191.129.204.149  | \n 195.58.214.186                          | 195.58.214.186  |                                         | -                                                                               |                                | \n 195.58.214.186                          | 195.58.214.186  |                                         | 192.198.196.94-195.116.202.186                                                  | 192.198.196.94-195.116.202.186 | \n 195.58.214.186                          | 195.58.214.186  |                                         | 194.50.23.161-195.215.1.54                                                      | 194.50.23.161-195.215.1.54     | \n 203.156.110.93                          | 203.156.110.93  |                                         | -                                                                               |                                | \n 223.213.219.214                         | 223.213.219.214 |                                         | -                                                                               |                                | \n 223.213.219.214                         | 223.213.219.214 |                                         | 207.129.8.36-240.135.140.181                                                    | 207.129.8.36-240.135.140.181   | \n 235.64.97.205                           | 235.64.97.205   |                                         | -                                                                               |                                | \n 235.64.97.205                           | 235.64.97.205   |                                         | 207.129.8.36-240.135.140.181                                                    | 207.129.8.36-240.135.140.181   | \n 235.64.97.205                           | 235.64.97.205   |                                         | 233.169.207.115-238.213.223.60                                                  | 233.169.207.115-238.213.223.60 | \n 235.64.97.205                           | 235.64.97.205   |                                         | 234.48.112.251-235.130.33.88                                                    | 234.48.112.251-235.130.33.88   | \n 240.116.30.226                          | 240.116.30.226  |                                         | -                                                                               |                                | \n 240.116.30.226                          | 240.116.30.226  |                                         | 207.129.8.36-240.135.140.181                                                    | 207.129.8.36-240.135.140.181   | \n 254.251.8.237                           | 254.251.8.237   |                                         | -                                                                               |                                | \n 255.226.130.53                          | 255.226.130.53  |                                         | -                                                                               |                                | \n 255.226.130.53                          | 255.226.130.53  |                                         | 255.148.94.59-255.232.142.189                                                   | 255.148.94.59-255.232.142.189  | \n 73:3c34:57a:2a84:b1df:81b0:eb40:61cd    |                 | 73:3c34:57a:2a84:b1df:81b0:eb40:61cd    | -                                                                               |                                | \n 73:3c34:57a:2a84:b1df:81b0:eb40:61cd    |                 | 73:3c34:57a:2a84:b1df:81b0:eb40:61cd    | 6d:d4d7:e3dc:b30c:d0f3:6ae3:907e:beb2-a4:f5d3:b64e:8e01:5f11:d5c3:be0b:e20c     |                                | 6d:d4d7:e3dc:b30c:d0f3:6ae3:907e:beb2-a4:f5d3:b64e:8e01:5f11:d5c3:be0b:e20c\n b6:8ebc:c326:48a6:5615:a65e:e87a:25d7   |                 | b6:8ebc:c326:48a6:5615:a65e:e87a:25d7   | -                                                                               |                                | \n 166:b8ea:1fc5:8913:17ea:d6a0:ac2b:90e1  |                 | 166:b8ea:1fc5:8913:17ea:d6a0:ac2b:90e1  | -                                                                               |                                | \n 227:b768:d43b:773d:6168:5133:867c:13f2  |                 | 227:b768:d43b:773d:6168:5133:867c:13f2  | -                                                                               |                                | \n 227:b768:d43b:773d:6168:5133:867c:13f2  |                 | 227:b768:d43b:773d:6168:5133:867c:13f2  | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679     |                                | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679\n 453:2d:fbd3:191:95c6:3751:eb62:e90      |                 | 453:2d:fbd3:191:95c6:3751:eb62:e90      | -                                                                               |                                | \n 453:2d:fbd3:191:95c6:3751:eb62:e90      |                 | 453:2d:fbd3:191:95c6:3751:eb62:e90      | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679     |                                | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679\n 4a6:7a28:b05b:f9b4:cc5b:9c4c:eefe:3e06  |                 | 4a6:7a28:b05b:f9b4:cc5b:9c4c:eefe:3e06  | -                                                                               |                                | \n 4a6:7a28:b05b:f9b4:cc5b:9c4c:eefe:3e06  |                 | 4a6:7a28:b05b:f9b4:cc5b:9c4c:eefe:3e06  | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679     |                                | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679\n 550:fe90:bd02:a3ed:35a2:3254:e280:cd20  |                 | 550:fe90:bd02:a3ed:35a2:3254:e280:cd20  | -                                                                               |                                | \n 550:fe90:bd02:a3ed:35a2:3254:e280:cd20  |                 | 550:fe90:bd02:a3ed:35a2:3254:e280:cd20  | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679     |                                | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679\n 75d:e701:5702:6087:a69a:1a2d:376e:4eb   |                 | 75d:e701:5702:6087:a69a:1a2d:376e:4eb   | -                                                                               |                                | \n 75d:e701:5702:6087:a69a:1a2d:376e:4eb   |                 | 75d:e701:5702:6087:a69a:1a2d:376e:4eb   | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679     |                                | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679\n 7e1:a608:dadd:684d:679e:698b:4db:c8c2   |                 | 7e1:a608:dadd:684d:679e:698b:4db:c8c2   | -                                                                               |                                | \n 7e1:a608:dadd:684d:679e:698b:4db:c8c2   |                 | 7e1:a608:dadd:684d:679e:698b:4db:c8c2   | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679     |                                | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679\n 9ec:8fec:9a0e:3f2a:66e2:9b5c:498a:1090  |                 | 9ec:8fec:9a0e:3f2a:66e2:9b5c:498a:1090  | -                                                                               |                                | \n a4b:4e55:7510:69b9:ba73:6550:eaa7:f16e  |                 | a4b:4e55:7510:69b9:ba73:6550:eaa7:f16e  | -                                                                               |                                | \n bdb:15d3:fbaf:4bf6:194e:4d0d:4cb2:26c2  |                 | bdb:15d3:fbaf:4bf6:194e:4d0d:4cb2:26c2  | -                                                                               |                                | \n cc6:3030:8e26:ed4a:ae48:4496:63c3:94d0  |                 | cc6:3030:8e26:ed4a:ae48:4496:63c3:94d0  | -                                                                               |                                | \n ce0:f080:aff1:6780:4951:55a7:4c23:f108  |                 | ce0:f080:aff1:6780:4951:55a7:4c23:f108  | -                                                                               |                                | \n d6b:f94a:4040:ba81:2347:d486:ac79:96f7  |                 | d6b:f94a:4040:ba81:2347:d486:ac79:96f7  | -                                                                               |                                | \n d9a:933a:3c47:801a:51d4:5a48:13bb:f59b  |                 | d9a:933a:3c47:801a:51d4:5a48:13bb:f59b  | -                                                                               |                                | \n ded:898a:e003:6046:72e6:5584:1012:62cc  |                 | ded:898a:e003:6046:72e6:5584:1012:62cc  | -                                                                               |                                | \n f47:6def:21e4:4620:3bc:9abc:8abd:aba2   |                 | f47:6def:21e4:4620:3bc:9abc:8abd:aba2   | -                                                                               |                                | \n 1009:d4ec:fe15:7946:eff2:6827:349e:6f0c |                 | 1009:d4ec:fe15:7946:eff2:6827:349e:6f0c | -                                                                               |                                | \n 10a5:994f:884d:9f98:4920:408d:1504:561d |                 | 10a5:994f:884d:9f98:4920:408d:1504:561d | -                                                                               |                                | \n 1378:f0c0:8ca:c76d:f062:4b7a:2573:5710  |                 | 1378:f0c0:8ca:c76d:f062:4b7a:2573:5710  | -                                                                               |                                | \n 1395:59cf:33f6:988:1cf8:5ef3:3c2f:64dc  |                 | 1395:59cf:33f6:988:1cf8:5ef3:3c2f:64dc  | -                                                                               |                                | \n 13d9:9e39:ff4a:875f:82a0:77bc:1559:cf8d |                 | 13d9:9e39:ff4a:875f:82a0:77bc:1559:cf8d | -                                                                               |                                | \n 13fb:9738:a243:f879:730:2b72:783f:75e9  |                 | 13fb:9738:a243:f879:730:2b72:783f:75e9  | -                                                                               |                                | \n 14fd:6de8:95f:fade:a20c:81d3:98da:c560  |                 | 14fd:6de8:95f:fade:a20c:81d3:98da:c560  | -                                                                               |                                | \n 1520:c2bc:8426:2927:9e12:5f90:f4b0:30e6 |                 | 1520:c2bc:8426:2927:9e12:5f90:f4b0:30e6 | -                                                                               |                                | \n 163a:503e:a2d7:c0d8:f5ee:657e:7f23:ea52 |                 | 163a:503e:a2d7:c0d8:f5ee:657e:7f23:ea52 | -                                                                               |                                | \n 1685:dcd3:5113:5d84:2e64:d9e2:a602:aab7 |                 | 1685:dcd3:5113:5d84:2e64:d9e2:a602:aab7 | -                                                                               |                                | \n 1839:8d68:ec5f:a4e7:711d:124e:150b:cddf |                 | 1839:8d68:ec5f:a4e7:711d:124e:150b:cddf | -                                                                               |                                | \n 1863:bf8e:aef5:1ac4:f85a:6683:8f7c:d191 |                 | 1863:bf8e:aef5:1ac4:f85a:6683:8f7c:d191 | -                                                                               |                                | \n 18e8:f97:72d0:5444:c94:99fe:4a9e:f657   |                 | 18e8:f97:72d0:5444:c94:99fe:4a9e:f657   | -                                                                               |                                | \n 18eb:378d:f12f:6114:34d2:ce03:e0d8:cffc |                 | 18eb:378d:f12f:6114:34d2:ce03:e0d8:cffc | -                                                                               |                                | \n 1962:ff9f:665f:ba25:d25a:f530:a391:5ab7 |                 | 1962:ff9f:665f:ba25:d25a:f530:a391:5ab7 | -                                                                               |                                | \n 1b96:6d23:348f:a5f2:1869:1cd5:eff5:d09a |                 | 1b96:6d23:348f:a5f2:1869:1cd5:eff5:d09a | -                                                                               |                                | \n 1bc2:3fea:257c:553e:eb87:d8c7:ef94:4c9  |                 | 1bc2:3fea:257c:553e:eb87:d8c7:ef94:4c9  | -                                                                               |                                | \n 1be9:3504:b341:17a8:10ec:e646:b0:433    |                 | 1be9:3504:b341:17a8:10ec:e646:b0:433    | -                                                                               |                                | \n 1c3e:17b6:1bfd:77ea:2185:9748:38d:ac80  |                 | 1c3e:17b6:1bfd:77ea:2185:9748:38d:ac80  | -                                                                               |                                | \n 1c3e:17b6:1bfd:77ea:2185:9748:38d:ac80  |                 | 1c3e:17b6:1bfd:77ea:2185:9748:38d:ac80  | 1c1d:d54b:5bb8:fe5b:db91:4edb:6870:34f5-1d9f:9898:7888:7b02:1064:a19a:ccc8:4849 |                                | 1c1d:d54b:5bb8:fe5b:db91:4edb:6870:34f5-1d9f:9898:7888:7b02:1064:a19a:ccc8:4849\n 1c90:5c1b:9431:11ea:f6dd:bb7c:c57f:6cc6 |                 | 1c90:5c1b:9431:11ea:f6dd:bb7c:c57f:6cc6 | -                                                                               |                                | \n 1c90:5c1b:9431:11ea:f6dd:bb7c:c57f:6cc6 |                 | 1c90:5c1b:9431:11ea:f6dd:bb7c:c57f:6cc6 | 1c1d:d54b:5bb8:fe5b:db91:4edb:6870:34f5-1d9f:9898:7888:7b02:1064:a19a:ccc8:4849 |                                | 1c1d:d54b:5bb8:fe5b:db91:4edb:6870:34f5-1d9f:9898:7888:7b02:1064:a19a:ccc8:4849\n 1cc5:18d6:116d:d727:86b:9655:f44d:4fb7  |                 | 1cc5:18d6:116d:d727:86b:9655:f44d:4fb7  | -                                                                               |                                | \n 1cc5:18d6:116d:d727:86b:9655:f44d:4fb7  |                 | 1cc5:18d6:116d:d727:86b:9655:f44d:4fb7  | 1c1d:d54b:5bb8:fe5b:db91:4edb:6870:34f5-1d9f:9898:7888:7b02:1064:a19a:ccc8:4849 |                                | 1c1d:d54b:5bb8:fe5b:db91:4edb:6870:34f5-1d9f:9898:7888:7b02:1064:a19a:ccc8:4849\n 1dbf:c6d8:ce1a:e3e3:c9a2:8458:3674:f6b  |                 | 1dbf:c6d8:ce1a:e3e3:c9a2:8458:3674:f6b  | -                                                                               |                                | \n 1f38:cd00:b368:80e5:7579:df75:3c50:b21b |                 | 1f38:cd00:b368:80e5:7579:df75:3c50:b21b | -                                                                               |                                | \n 204f:510d:e7e9:9c02:9576:48b1:bfb7:468  |                 | 204f:510d:e7e9:9c02:9576:48b1:bfb7:468  | -                                                                               |                                | \n 21ef:74a4:2571:e430:47b1:a582:9723:9b14 |                 | 21ef:74a4:2571:e430:47b1:a582:9723:9b14 | -                                                                               |                                | \n 2394:74d2:f34d:3801:3a23:f022:dc17:2cf  |                 | 2394:74d2:f34d:3801:3a23:f022:dc17:2cf  | -                                                                               |                                | \n 23fd:5d2:8e6a:628:b4e:3ff2:d386:d2b0    |                 | 23fd:5d2:8e6a:628:b4e:3ff2:d386:d2b0    | -                                                                               |                                | \n 2408:f23d:d1ac:746d:2c8f:3dd6:7ed0:5507 |                 | 2408:f23d:d1ac:746d:2c8f:3dd6:7ed0:5507 | -                                                                               |                                | \n 25d9:67f6:f409:c774:60ad:9d6a:b95b:4ad2 |                 | 25d9:67f6:f409:c774:60ad:9d6a:b95b:4ad2 | -                                                                               |                                | \n 25f0:72d:e515:bc9b:f9a2:6061:b18b:758e  |                 | 25f0:72d:e515:bc9b:f9a2:6061:b18b:758e  | -                                                                               |                                | \n 2689:eae5:4101:f97c:628a:58fa:f0b5:159  |                 | 2689:eae5:4101:f97c:628a:58fa:f0b5:159  | -                                                                               |                                | \n 26a3:7ac5:3ce2:cb2d:994d:8f10:82b6:419d |                 | 26a3:7ac5:3ce2:cb2d:994d:8f10:82b6:419d | -                                                                               |                                | \n 26ad:4d5b:192c:f85a:71db:38be:c6ca:19de |                 | 26ad:4d5b:192c:f85a:71db:38be:c6ca:19de | -                                                                               |                                | \n 28a6:2032:8a38:de85:f6f3:47bd:5124:7dc8 |                 | 28a6:2032:8a38:de85:f6f3:47bd:5124:7dc8 | -                                                                               |                                | \n 28a6:2032:8a38:de85:f6f3:47bd:5124:7dc8 |                 | 28a6:2032:8a38:de85:f6f3:47bd:5124:7dc8 | 282c:2276:9cc1:58aa:1e30:2fce:a695:c42e-28f8:52d4:b106:5e5c:b22a:6a84:e581:7934 |                                | 282c:2276:9cc1:58aa:1e30:2fce:a695:c42e-28f8:52d4:b106:5e5c:b22a:6a84:e581:7934\n 28e7:4441:e0a4:bf30:4cf4:edb0:638d:ad72 |                 | 28e7:4441:e0a4:bf30:4cf4:edb0:638d:ad72 | -                                                                               |                                | \n 28e7:4441:e0a4:bf30:4cf4:edb0:638d:ad72 |                 | 28e7:4441:e0a4:bf30:4cf4:edb0:638d:ad72 | 282c:2276:9cc1:58aa:1e30:2fce:a695:c42e-28f8:52d4:b106:5e5c:b22a:6a84:e581:7934 |                                | 282c:2276:9cc1:58aa:1e30:2fce:a695:c42e-28f8:52d4:b106:5e5c:b22a:6a84:e581:7934\n 29a4:a288:457e:57a9:bbb3:2a76:b117:b1e8 |                 | 29a4:a288:457e:57a9:bbb3:2a76:b117:b1e8 | -                                                                               |                                | \n 29b2:d3c1:26c4:86b6:19b5:14dc:ab2d:bc67 |                 | 29b2:d3c1:26c4:86b6:19b5:14dc:ab2d:bc67 | -                                                                               |                                | \n 2a8a:5b38:cbdd:5d1c:e1b0:d627:f31f:285a |                 | 2a8a:5b38:cbdd:5d1c:e1b0:d627:f31f:285a | -                                                                               |                                | \n 2b47:da0e:8c52:cc33:afaa:f85f:f143:88c6 |                 | 2b47:da0e:8c52:cc33:afaa:f85f:f143:88c6 | -                                                                               |                                | \n 2b47:da0e:8c52:cc33:afaa:f85f:f143:88c6 |                 | 2b47:da0e:8c52:cc33:afaa:f85f:f143:88c6 | 2b09:bce8:a5eb:7add:f388:6ff3:3247:6bc4-2bce:b195:8b4d:d7a2:e6f9:6325:c4cf:dcd7 |                                | 2b09:bce8:a5eb:7add:f388:6ff3:3247:6bc4-2bce:b195:8b4d:d7a2:e6f9:6325:c4cf:dcd7\n 2ee9:6428:5482:9721:9e51:ca52:ba3:99eb  |                 | 2ee9:6428:5482:9721:9e51:ca52:ba3:99eb  | -                                                                               |                                | \n 2f48:4d4b:443c:6de6:9cbe:9766:fd5:c88b  |                 | 2f48:4d4b:443c:6de6:9cbe:9766:fd5:c88b  | -                                                                               |                                | \n 2ff2:b6b6:ffd1:dc5f:fc2:defe:fd16:a414  |                 | 2ff2:b6b6:ffd1:dc5f:fc2:defe:fd16:a414  | -                                                                               |                                | \n 3138:9022:3412:4cfb:fc2a:729a:651c:40f9 |                 | 3138:9022:3412:4cfb:fc2a:729a:651c:40f9 | -                                                                               |                                | \n 318f:1162:8f48:3397:cb9a:f54e:f1e8:d05d |                 | 318f:1162:8f48:3397:cb9a:f54e:f1e8:d05d | -                                                                               |                                | \n 32ca:6639:c07e:c474:fa11:c83:2886:516c  |                 | 32ca:6639:c07e:c474:fa11:c83:2886:516c  | -                                                                               |                                | \n 35f1:eb03:921c:f397:cd41:9201:f7e0:dfad |                 | 35f1:eb03:921c:f397:cd41:9201:f7e0:dfad | -                                                                               |                                | \n 35f3:d696:b49e:1a25:375:5e28:15c9:96ce  |                 | 35f3:d696:b49e:1a25:375:5e28:15c9:96ce  | -                                                                               |                                | \n 3902:4c48:d872:37bd:2e53:678d:3a0a:3cf6 |                 | 3902:4c48:d872:37bd:2e53:678d:3a0a:3cf6 | -                                                                               |                                | \n 390b:b7a:6606:af43:233b:2e27:8336:5b2e  |                 | 390b:b7a:6606:af43:233b:2e27:8336:5b2e  | -                                                                               |                                | \n 39ec:d6ba:1f45:64d0:f4d2:3f0f:78e:a404  |                 | 39ec:d6ba:1f45:64d0:f4d2:3f0f:78e:a404  | -                                                                               |                                | \n 3af7:2de9:30a7:818d:9715:3eaf:d8f7:2583 |                 | 3af7:2de9:30a7:818d:9715:3eaf:d8f7:2583 | -                                                                               |                                | \n 3b13:802b:cfd:15ef:bab3:f337:8b00:5744  |                 | 3b13:802b:cfd:15ef:bab3:f337:8b00:5744  | -                                                                               |                                | \n 3bc9:de98:c700:5aa:d993:223e:dad:1949   |                 | 3bc9:de98:c700:5aa:d993:223e:dad:1949   | -                                                                               |                                | \n 4068:6d06:7463:589:3262:86d1:f1f1:f088  |                 | 4068:6d06:7463:589:3262:86d1:f1f1:f088  | -                                                                               |                                | \n 4068:6d06:7463:589:3262:86d1:f1f1:f088  |                 | 4068:6d06:7463:589:3262:86d1:f1f1:f088  | 403e:a65:913d:bf17:1650:f48c:967f:6cee-42a0:8ac9:38d0:b9ba:bc91:ac9:9f19:24f6   |                                | 403e:a65:913d:bf17:1650:f48c:967f:6cee-42a0:8ac9:38d0:b9ba:bc91:ac9:9f19:24f6\n 4111:e35f:ce3:c4de:dc4e:8764:8cd:1686   |                 | 4111:e35f:ce3:c4de:dc4e:8764:8cd:1686   | -                                                                               |                                | \n 4111:e35f:ce3:c4de:dc4e:8764:8cd:1686   |                 | 4111:e35f:ce3:c4de:dc4e:8764:8cd:1686   | 403e:a65:913d:bf17:1650:f48c:967f:6cee-42a0:8ac9:38d0:b9ba:bc91:ac9:9f19:24f6   |                                | 403e:a65:913d:bf17:1650:f48c:967f:6cee-42a0:8ac9:38d0:b9ba:bc91:ac9:9f19:24f6\n 4131:d8b6:82af:797d:25fd:7bd4:b94d:ce34 |                 | 4131:d8b6:82af:797d:25fd:7bd4:b94d:ce34 | -                                                                               |                                | \n 4131:d8b6:82af:797d:25fd:7bd4:b94d:ce34 |                 | 4131:d8b6:82af:797d:25fd:7bd4:b94d:ce34 | 403e:a65:913d:bf17:1650:f48c:967f:6cee-42a0:8ac9:38d0:b9ba:bc91:ac9:9f19:24f6   |                                | 403e:a65:913d:bf17:1650:f48c:967f:6cee-42a0:8ac9:38d0:b9ba:bc91:ac9:9f19:24f6\n 42e2:d76f:c784:7a61:67c1:b931:6f49:32c5 |                 | 42e2:d76f:c784:7a61:67c1:b931:6f49:32c5 | -                                                                               |                                | \n 4430:8b98:82c8:3d6c:dbd6:579e:c3fc:ec9d |                 | 4430:8b98:82c8:3d6c:dbd6:579e:c3fc:ec9d | -                                                                               |                                | \n 4439:44b6:c04:de6a:c0af:cf35:d9f3:f8ee  |                 | 4439:44b6:c04:de6a:c0af:cf35:d9f3:f8ee  | -                                                                               |                                | \n 450b:493b:a4d7:f0d3:6fe4:6da0:b550:f4ca |                 | 450b:493b:a4d7:f0d3:6fe4:6da0:b550:f4ca | -                                                                               |                                | \n 454c:20ee:35b9:b48b:a59f:e4bc:7b76:f228 |                 | 454c:20ee:35b9:b48b:a59f:e4bc:7b76:f228 | -                                                                               |                                | \n 454e:bfa0:ed21:4983:7572:22c9:413d:d4db |                 | 454e:bfa0:ed21:4983:7572:22c9:413d:d4db | -                                                                               |                                | \n 4620:c642:9985:6a1f:6c66:50c0:2108:10d3 |                 | 4620:c642:9985:6a1f:6c66:50c0:2108:10d3 | -                                                                               |                                | \n 4647:353:5292:8bef:e5b5:c13a:1176:deef  |                 | 4647:353:5292:8bef:e5b5:c13a:1176:deef  | -                                                                               |                                | \n 4bd6:2076:745e:acbe:c511:3786:60be:b51d |                 | 4bd6:2076:745e:acbe:c511:3786:60be:b51d | -                                                                               |                                | \n 4d6a:edd6:a446:6d89:e2a3:ab27:79ec:e148 |                 | 4d6a:edd6:a446:6d89:e2a3:ab27:79ec:e148 | -                                                                               |                                | \n 4ee3:bfaa:5f22:2c05:573e:e87c:a6c2:81e0 |                 | 4ee3:bfaa:5f22:2c05:573e:e87c:a6c2:81e0 | -                                                                               |                                | \n 53ad:31ab:bc5e:c535:bc7c:5762:c11e:fcec |                 | 53ad:31ab:bc5e:c535:bc7c:5762:c11e:fcec | -                                                                               |                                | \n 53d6:7f94:6b26:59cb:9c16:2aa:9722:b8ef  |                 | 53d6:7f94:6b26:59cb:9c16:2aa:9722:b8ef  | -                                                                               |                                | \n 5412:a54d:dbd8:8448:4728:5fb0:ec6f:4381 |                 | 5412:a54d:dbd8:8448:4728:5fb0:ec6f:4381 | -                                                                               |                                | \n 5466:93e3:8343:3686:394:778:79ac:772    |                 | 5466:93e3:8343:3686:394:778:79ac:772    | -                                                                               |                                | \n 54b6:4a85:c1a5:89b0:b7ff:5306:32be:d30f |                 | 54b6:4a85:c1a5:89b0:b7ff:5306:32be:d30f | -                                                                               |                                | \n 5637:5e57:c050:53fe:e182:697:ab46:21cc  |                 | 5637:5e57:c050:53fe:e182:697:ab46:21cc  | -                                                                               |                                | \n 56fd:83db:3ff7:b0b:7d5:8378:a486:f20    |                 | 56fd:83db:3ff7:b0b:7d5:8378:a486:f20    | -                                                                               |                                | \n 5721:3c79:a6ff:c8d8:5e3:c785:808:e40    |                 | 5721:3c79:a6ff:c8d8:5e3:c785:808:e40    | -                                                                               |                                | \n 5721:3c79:a6ff:c8d8:5e3:c785:808:e40    |                 | 5721:3c79:a6ff:c8d8:5e3:c785:808:e40    | 570d:9354:14c4:e9c9:dc63:be77:d70a:947c-57cb:4a7a:c3c:fcd2:e130:41d9:165:df     |                                | 570d:9354:14c4:e9c9:dc63:be77:d70a:947c-57cb:4a7a:c3c:fcd2:e130:41d9:165:df\n 5889:8398:cb90:8df:b3d6:3f5c:72cb:cd64  |                 | 5889:8398:cb90:8df:b3d6:3f5c:72cb:cd64  | -                                                                               |                                | \n 599b:9e01:9a22:aebf:a731:ce57:fefb:8ed  |                 | 599b:9e01:9a22:aebf:a731:ce57:fefb:8ed  | -                                                                               |                                | \n 5a0b:33a9:3407:aa9c:f1c7:a538:2f25:bf14 |                 | 5a0b:33a9:3407:aa9c:f1c7:a538:2f25:bf14 | -                                                                               |                                | \n 5a3f:b436:785f:32a4:8c86:13f8:e682:8b6a |                 | 5a3f:b436:785f:32a4:8c86:13f8:e682:8b6a | -                                                                               |                                | \n 5d63:9613:7b87:5c26:5c80:bbd3:14b5:1e63 |                 | 5d63:9613:7b87:5c26:5c80:bbd3:14b5:1e63 | -                                                                               |                                | \n 5d63:9613:7b87:5c26:5c80:bbd3:14b5:1e63 |                 | 5d63:9613:7b87:5c26:5c80:bbd3:14b5:1e63 | 5d63:3959:e781:2931:84ab:7fd7:2f85:8101-5d6c:d5a2:e9c3:9ab4:4aab:7f0a:9c18:8dca |                                | 5d63:3959:e781:2931:84ab:7fd7:2f85:8101-5d6c:d5a2:e9c3:9ab4:4aab:7f0a:9c18:8dca\n 5e52:9aa9:8f83:2a67:5959:720d:f6ba:5d42 |                 | 5e52:9aa9:8f83:2a67:5959:720d:f6ba:5d42 | -                                                                               |                                | \n 5ee2:4fab:1073:b2f5:61c1:eea6:302f:685  |                 | 5ee2:4fab:1073:b2f5:61c1:eea6:302f:685  | -                                                                               |                                | \n 5fa8:25bb:15e8:5b35:758c:2044:d194:1962 |                 | 5fa8:25bb:15e8:5b35:758c:2044:d194:1962 | -                                                                               |                                | \n 61f2:afe0:d1af:18e9:5d40:7a4d:f112:2d09 |                 | 61f2:afe0:d1af:18e9:5d40:7a4d:f112:2d09 | -                                                                               |                                | \n 6251:ab4b:3b37:d71f:6b5f:1b2d:bd55:3a3c |                 | 6251:ab4b:3b37:d71f:6b5f:1b2d:bd55:3a3c | -                                                                               |                                | \n 62b8:256d:637a:82bf:3b69:420:eea5:300b  |                 | 62b8:256d:637a:82bf:3b69:420:eea5:300b  | -                                                                               |                                | \n 62db:eab9:a54e:3cea:46f3:b7c2:cb9c:6e5d |                 | 62db:eab9:a54e:3cea:46f3:b7c2:cb9c:6e5d | -                                                                               |                                | \n 6656:e87d:865c:3237:8d42:ff01:a82b:f308 |                 | 6656:e87d:865c:3237:8d42:ff01:a82b:f308 | -                                                                               |                                | \n 6a93:ccd3:5002:233f:1c5f:400e:601c:75a  |                 | 6a93:ccd3:5002:233f:1c5f:400e:601c:75a  | -                                                                               |                                | \n 6b0c:4791:ccea:c286:437e:d268:87ef:b6ad |                 | 6b0c:4791:ccea:c286:437e:d268:87ef:b6ad | -                                                                               |                                | \n 6e1b:5e9c:f623:6134:7754:fdac:323a:dba2 |                 | 6e1b:5e9c:f623:6134:7754:fdac:323a:dba2 | -                                                                               |                                | \n 6e81:4a6a:d383:140d:8416:c09b:af3b:5b45 |                 | 6e81:4a6a:d383:140d:8416:c09b:af3b:5b45 | -                                                                               |                                | \n 6e9d:66e:27c5:c7c4:aefe:ecfc:6568:ccf   |                 | 6e9d:66e:27c5:c7c4:aefe:ecfc:6568:ccf   | -                                                                               |                                | \n 6ff2:94f5:5755:164d:1301:28ce:8a04:eac0 |                 | 6ff2:94f5:5755:164d:1301:28ce:8a04:eac0 | -                                                                               |                                | \n 72c4:104f:960c:baf1:8ef7:60d2:c58:8b03  |                 | 72c4:104f:960c:baf1:8ef7:60d2:c58:8b03  | -                                                                               |                                | \n 7341:d21f:e576:f226:f690:a99c:6b55:9933 |                 | 7341:d21f:e576:f226:f690:a99c:6b55:9933 | -                                                                               |                                | \n 739b:8093:31c6:a42f:a604:d5cb:1350:2d2f |                 | 739b:8093:31c6:a42f:a604:d5cb:1350:2d2f | -                                                                               |                                | \n 7524:1f76:fe52:991e:667b:a302:dfd5:dbd6 |                 | 7524:1f76:fe52:991e:667b:a302:dfd5:dbd6 | -                                                                               |                                | \n 7524:1f76:fe52:991e:667b:a302:dfd5:dbd6 |                 | 7524:1f76:fe52:991e:667b:a302:dfd5:dbd6 | 742e:1d26:42a5:cc7c:4ffd:726f:19e0:61f7-76b8:303d:bb7:c766:cf35:f22e:c86f:1400  |                                | 742e:1d26:42a5:cc7c:4ffd:726f:19e0:61f7-76b8:303d:bb7:c766:cf35:f22e:c86f:1400\n 7608:50bf:a29a:6805:c760:9ae3:1216:8e4a |                 | 7608:50bf:a29a:6805:c760:9ae3:1216:8e4a | -                                                                               |                                | \n 7608:50bf:a29a:6805:c760:9ae3:1216:8e4a |                 | 7608:50bf:a29a:6805:c760:9ae3:1216:8e4a | 742e:1d26:42a5:cc7c:4ffd:726f:19e0:61f7-76b8:303d:bb7:c766:cf35:f22e:c86f:1400  |                                | 742e:1d26:42a5:cc7c:4ffd:726f:19e0:61f7-76b8:303d:bb7:c766:cf35:f22e:c86f:1400\n 78c8:1cde:4b95:55d8:b211:a95d:37e0:7d92 |                 | 78c8:1cde:4b95:55d8:b211:a95d:37e0:7d92 | -                                                                               |                                | \n 7924:9e5b:2c7:3920:9c9f:bfb6:369d:fa4f  |                 | 7924:9e5b:2c7:3920:9c9f:bfb6:369d:fa4f  | -                                                                               |                                | \n 798f:ea8:61f6:5d79:1656:d8d8:9b6e:57f0  |                 | 798f:ea8:61f6:5d79:1656:d8d8:9b6e:57f0  | -                                                                               |                                | \n 79c9:d301:92cd:c774:abbb:2f7d:92c3:3ccd |                 | 79c9:d301:92cd:c774:abbb:2f7d:92c3:3ccd | -                                                                               |                                | \n 79eb:6133:5173:8f43:87d4:cb1d:906b:e8c9 |                 | 79eb:6133:5173:8f43:87d4:cb1d:906b:e8c9 | -                                                                               |                                | \n 7cba:a835:f850:6409:dba7:1300:f2b8:1db3 |                 | 7cba:a835:f850:6409:dba7:1300:f2b8:1db3 | -                                                                               |                                | \n 7cdf:1ed8:690e:9e54:6f39:613e:f187:8ef2 |                 | 7cdf:1ed8:690e:9e54:6f39:613e:f187:8ef2 | -                                                                               |                                | \n 7dcc:877b:8e07:aeb4:d891:581e:c10c:af54 |                 | 7dcc:877b:8e07:aeb4:d891:581e:c10c:af54 | -                                                                               |                                | \n 7e1f:eb76:49c9:39f8:deb9:c447:b40c:a13d |                 | 7e1f:eb76:49c9:39f8:deb9:c447:b40c:a13d | -                                                                               |                                | \n 7ec8:2b00:5994:7f0f:d765:5e16:c274:5645 |                 | 7ec8:2b00:5994:7f0f:d765:5e16:c274:5645 | -                                                                               |                                | \n 7f3d:d8ea:7a7c:8700:5b81:412f:c33a:d6ba |                 | 7f3d:d8ea:7a7c:8700:5b81:412f:c33a:d6ba | -                                                                               |                                | \n 7fa2:dbdb:e889:e24b:4d30:962e:89f3:676f |                 | 7fa2:dbdb:e889:e24b:4d30:962e:89f3:676f | -                                                                               |                                | \n 8119:1220:b888:3d8a:1250:ce77:b2b9:bdcd |                 | 8119:1220:b888:3d8a:1250:ce77:b2b9:bdcd | -                                                                               |                                | \n 8129:3e9c:70ff:1df1:f26f:86aa:c7ba:8245 |                 | 8129:3e9c:70ff:1df1:f26f:86aa:c7ba:8245 | -                                                                               |                                | \n 8172:4609:d700:5bd2:24a2:8f78:f1cc:c1a0 |                 | 8172:4609:d700:5bd2:24a2:8f78:f1cc:c1a0 | -                                                                               |                                | \n 8241:abe3:7537:de41:ef5a:7d2a:9e57:833b |                 | 8241:abe3:7537:de41:ef5a:7d2a:9e57:833b | -                                                                               |                                | \n 828e:fa1d:9bb1:ad4c:4874:9da8:40bf:25b5 |                 | 828e:fa1d:9bb1:ad4c:4874:9da8:40bf:25b5 | -                                                                               |                                | \n 828e:fa1d:9bb1:ad4c:4874:9da8:40bf:25b5 |                 | 828e:fa1d:9bb1:ad4c:4874:9da8:40bf:25b5 | 8261:c35e:8e93:a1d1:4000:42a9:b632:112c-82f4:6c3e:dff3:6472:7292:3bbc:abd7:1e73 |                                | 8261:c35e:8e93:a1d1:4000:42a9:b632:112c-82f4:6c3e:dff3:6472:7292:3bbc:abd7:1e73\n 8298:9399:271f:a3fe:270c:21cf:7c34:7340 |                 | 8298:9399:271f:a3fe:270c:21cf:7c34:7340 | -                                                                               |                                | \n 8298:9399:271f:a3fe:270c:21cf:7c34:7340 |                 | 8298:9399:271f:a3fe:270c:21cf:7c34:7340 | 8261:c35e:8e93:a1d1:4000:42a9:b632:112c-82f4:6c3e:dff3:6472:7292:3bbc:abd7:1e73 |                                | 8261:c35e:8e93:a1d1:4000:42a9:b632:112c-82f4:6c3e:dff3:6472:7292:3bbc:abd7:1e73\n 82ed:ac69:4ea7:5301:b005:3e17:f541:4fbc |                 | 82ed:ac69:4ea7:5301:b005:3e17:f541:4fbc | -                                                                               |                                | \n 82ed:ac69:4ea7:5301:b005:3e17:f541:4fbc |                 | 82ed:ac69:4ea7:5301:b005:3e17:f541:4fbc | 8261:c35e:8e93:a1d1:4000:42a9:b632:112c-82f4:6c3e:dff3:6472:7292:3bbc:abd7:1e73 |                                | 8261:c35e:8e93:a1d1:4000:42a9:b632:112c-82f4:6c3e:dff3:6472:7292:3bbc:abd7:1e73\n 8357:a24:2f6e:f909:3853:899a:68af:b48   |                 | 8357:a24:2f6e:f909:3853:899a:68af:b48   | -                                                                               |                                | \n 8474:e00a:5b49:6e2a:5074:ecd5:cece:7dad |                 | 8474:e00a:5b49:6e2a:5074:ecd5:cece:7dad | -                                                                               |                                | \n 84fe:7351:7b39:349e:1bb7:e333:daec:141a |                 | 84fe:7351:7b39:349e:1bb7:e333:daec:141a | -                                                                               |                                | \n 8586:595:7bdd:359b:2fd9:1ffa:49ef:a947  |                 | 8586:595:7bdd:359b:2fd9:1ffa:49ef:a947  | -                                                                               |                                | \n 86fa:3a3:6a26:5ce3:fd8d:6267:b3c:4bf0   |                 | 86fa:3a3:6a26:5ce3:fd8d:6267:b3c:4bf0   | -                                                                               |                                | \n 86fa:3a3:6a26:5ce3:fd8d:6267:b3c:4bf0   |                 | 86fa:3a3:6a26:5ce3:fd8d:6267:b3c:4bf0   | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |                                | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 874b:a74e:e292:c13:cf80:778c:35b4:d37c  |                 | 874b:a74e:e292:c13:cf80:778c:35b4:d37c  | -                                                                               |                                | \n 874b:a74e:e292:c13:cf80:778c:35b4:d37c  |                 | 874b:a74e:e292:c13:cf80:778c:35b4:d37c  | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |                                | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 88bb:cf40:1f19:c897:f001:2d56:8f4f:ac68 |                 | 88bb:cf40:1f19:c897:f001:2d56:8f4f:ac68 | -                                                                               |                                | \n 88bb:cf40:1f19:c897:f001:2d56:8f4f:ac68 |                 | 88bb:cf40:1f19:c897:f001:2d56:8f4f:ac68 | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |                                | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 8909:5e3:cff9:483c:1fb7:2ee2:ab05:222a  |                 | 8909:5e3:cff9:483c:1fb7:2ee2:ab05:222a  | -                                                                               |                                | \n 8909:5e3:cff9:483c:1fb7:2ee2:ab05:222a  |                 | 8909:5e3:cff9:483c:1fb7:2ee2:ab05:222a  | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |                                | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 890b:aa44:e2b1:ff61:eb7a:c4df:5a25:2eaf |                 | 890b:aa44:e2b1:ff61:eb7a:c4df:5a25:2eaf | -                                                                               |                                | \n 890b:aa44:e2b1:ff61:eb7a:c4df:5a25:2eaf |                 | 890b:aa44:e2b1:ff61:eb7a:c4df:5a25:2eaf | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |                                | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 8a1f:674e:63cd:f241:8f53:aec9:d8db:8e5c |                 | 8a1f:674e:63cd:f241:8f53:aec9:d8db:8e5c | -                                                                               |                                | \n 8a1f:674e:63cd:f241:8f53:aec9:d8db:8e5c |                 | 8a1f:674e:63cd:f241:8f53:aec9:d8db:8e5c | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |                                | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 8b0c:b103:3302:90bb:bac:809e:9c7d:3569  |                 | 8b0c:b103:3302:90bb:bac:809e:9c7d:3569  | -                                                                               |                                | \n 8b0c:b103:3302:90bb:bac:809e:9c7d:3569  |                 | 8b0c:b103:3302:90bb:bac:809e:9c7d:3569  | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |                                | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 8b61:6b31:d02c:87d3:22cf:f01c:c045:b822 |                 | 8b61:6b31:d02c:87d3:22cf:f01c:c045:b822 | -                                                                               |                                | \n 8b61:6b31:d02c:87d3:22cf:f01c:c045:b822 |                 | 8b61:6b31:d02c:87d3:22cf:f01c:c045:b822 | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |                                | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 8b87:864a:8e83:6783:c552:cb07:8e96:c0e5 |                 | 8b87:864a:8e83:6783:c552:cb07:8e96:c0e5 | -                                                                               |                                | \n 8b87:864a:8e83:6783:c552:cb07:8e96:c0e5 |                 | 8b87:864a:8e83:6783:c552:cb07:8e96:c0e5 | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |                                | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 8c86:2c19:c38d:626b:b5a4:e0cb:bbaf:476b |                 | 8c86:2c19:c38d:626b:b5a4:e0cb:bbaf:476b | -                                                                               |                                | \n 8c86:2c19:c38d:626b:b5a4:e0cb:bbaf:476b |                 | 8c86:2c19:c38d:626b:b5a4:e0cb:bbaf:476b | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |                                | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 8ec2:3493:ad95:cb7e:ae1c:8c2c:6a34:eccb |                 | 8ec2:3493:ad95:cb7e:ae1c:8c2c:6a34:eccb | -                                                                               |                                | \n 8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1 |                 | 8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1 | -                                                                               |                                | \n 8f7a:5e8b:f526:a8ba:8c6f:3cae:7b7e:1a5  |                 | 8f7a:5e8b:f526:a8ba:8c6f:3cae:7b7e:1a5  | -                                                                               |                                | \n 8fa1:e604:6ad4:c318:ba8f:eaec:76be:ad4b |                 | 8fa1:e604:6ad4:c318:ba8f:eaec:76be:ad4b | -                                                                               |                                | \n 8fac:3b7e:463d:1b38:2f59:6fdf:3bef:4aaf |                 | 8fac:3b7e:463d:1b38:2f59:6fdf:3bef:4aaf | -                                                                               |                                | \n 933f:d5b:d307:c3e0:5e0:b947:1cb5:6928   |                 | 933f:d5b:d307:c3e0:5e0:b947:1cb5:6928   | -                                                                               |                                | \n 9520:88f9:9498:8a73:ac7a:dc77:4495:3dfc |                 | 9520:88f9:9498:8a73:ac7a:dc77:4495:3dfc | -                                                                               |                                | \n 9631:3557:7591:6ade:1882:6dad:8413:c3b3 |                 | 9631:3557:7591:6ade:1882:6dad:8413:c3b3 | -                                                                               |                                | \n 977b:de6f:3ef9:3cad:fb02:fb07:458c:e88e |                 | 977b:de6f:3ef9:3cad:fb02:fb07:458c:e88e | -                                                                               |                                | \n 982a:e6d8:49bc:49a7:80b:4417:45f7:4fb7  |                 | 982a:e6d8:49bc:49a7:80b:4417:45f7:4fb7  | -                                                                               |                                | \n 9943:4095:cf6c:bf1d:f1b4:7883:f929:a315 |                 | 9943:4095:cf6c:bf1d:f1b4:7883:f929:a315 | -                                                                               |                                | \n 99b7:bba0:206c:6042:6778:2f3b:9a:6393   |                 | 99b7:bba0:206c:6042:6778:2f3b:9a:6393   | -                                                                               |                                | \n 9b3d:56d7:b18e:21b9:7448:3cea:2ec:77f8  |                 | 9b3d:56d7:b18e:21b9:7448:3cea:2ec:77f8  | -                                                                               |                                | \n 9c51:8c1b:a051:a87e:c65a:cc8:a38e:4953  |                 | 9c51:8c1b:a051:a87e:c65a:cc8:a38e:4953  | -                                                                               |                                | \n 9d35:9c4f:517d:2391:f59c:af03:1681:6d9b |                 | 9d35:9c4f:517d:2391:f59c:af03:1681:6d9b | -                                                                               |                                | \n 9da1:e3ce:660a:cde4:7576:554:55cc:38ad  |                 | 9da1:e3ce:660a:cde4:7576:554:55cc:38ad  | -                                                                               |                                | \n 9ee9:65bd:81d2:b2c6:c3c4:b36b:16a2:fc9e |                 | 9ee9:65bd:81d2:b2c6:c3c4:b36b:16a2:fc9e | -                                                                               |                                | \n a0d3:f0b5:7a50:2d3e:923e:3832:76c0:b15d |                 | a0d3:f0b5:7a50:2d3e:923e:3832:76c0:b15d | -                                                                               |                                | \n a252:248:a123:3287:680f:a67c:2fcd:b2a0  |                 | a252:248:a123:3287:680f:a67c:2fcd:b2a0  | -                                                                               |                                | \n a300:d184:bf44:e8f1:4a80:723c:909:f178  |                 | a300:d184:bf44:e8f1:4a80:723c:909:f178  | -                                                                               |                                | \n a335:f1a7:be5c:b341:5325:e8d3:2631:74ae |                 | a335:f1a7:be5c:b341:5325:e8d3:2631:74ae | -                                                                               |                                | \n a335:f1a7:be5c:b341:5325:e8d3:2631:74ae |                 | a335:f1a7:be5c:b341:5325:e8d3:2631:74ae | a306:48c9:17c3:be92:bc17:3993:65e5:6855-a346:5383:4104:e53d:72b3:7e11:4d32:d696 |                                | a306:48c9:17c3:be92:bc17:3993:65e5:6855-a346:5383:4104:e53d:72b3:7e11:4d32:d696\n a42d:662e:1816:1fe3:a392:9190:7d4e:f418 |                 | a42d:662e:1816:1fe3:a392:9190:7d4e:f418 | -                                                                               |                                | \n a52f:f73a:413e:a43a:5000:cd8f:ef1f:3603 |                 | a52f:f73a:413e:a43a:5000:cd8f:ef1f:3603 | -                                                                               |                                | \n a75b:c708:8e74:b252:f8e8:7269:c214:dc07 |                 | a75b:c708:8e74:b252:f8e8:7269:c214:dc07 | -                                                                               |                                | \n a87b:8920:6e0:9c1b:92a8:3a1e:f074:1ee2  |                 | a87b:8920:6e0:9c1b:92a8:3a1e:f074:1ee2  | -                                                                               |                                | \n a87b:8920:6e0:9c1b:92a8:3a1e:f074:1ee2  |                 | a87b:8920:6e0:9c1b:92a8:3a1e:f074:1ee2  | a798:ae68:f434:630e:121d:acf7:c1dd:ccf8-a94a:2e2c:77c1:f913:6d64:fc:7eb6:2507   |                                | a798:ae68:f434:630e:121d:acf7:c1dd:ccf8-a94a:2e2c:77c1:f913:6d64:fc:7eb6:2507\n a884:9796:ca7c:ec37:9cb4:4158:ce4c:ced5 |                 | a884:9796:ca7c:ec37:9cb4:4158:ce4c:ced5 | -                                                                               |                                | \n a884:9796:ca7c:ec37:9cb4:4158:ce4c:ced5 |                 | a884:9796:ca7c:ec37:9cb4:4158:ce4c:ced5 | a798:ae68:f434:630e:121d:acf7:c1dd:ccf8-a94a:2e2c:77c1:f913:6d64:fc:7eb6:2507   |                                | a798:ae68:f434:630e:121d:acf7:c1dd:ccf8-a94a:2e2c:77c1:f913:6d64:fc:7eb6:2507\n a9e9:74a5:864a:dfeb:a5f0:4424:d294:95a1 |                 | a9e9:74a5:864a:dfeb:a5f0:4424:d294:95a1 | -                                                                               |                                | \n a9e9:74a5:864a:dfeb:a5f0:4424:d294:95a1 |                 | a9e9:74a5:864a:dfeb:a5f0:4424:d294:95a1 | a993:6021:2abb:60c4:63fc:8e04:7b20:cbb4-ac46:82d9:f719:584:7006:227:6076:a331   |                                | a993:6021:2abb:60c4:63fc:8e04:7b20:cbb4-ac46:82d9:f719:584:7006:227:6076:a331\n ac4c:23a6:9c5f:8a2a:ccfc:ea69:48cd:dffc |                 | ac4c:23a6:9c5f:8a2a:ccfc:ea69:48cd:dffc | -                                                                               |                                | \n ac71:fd2c:4352:c28a:2f4b:3cd1:4d6f:927b |                 | ac71:fd2c:4352:c28a:2f4b:3cd1:4d6f:927b | -                                                                               |                                | \n ad73:992f:b3d8:31f7:306d:a418:fdcf:3e60 |                 | ad73:992f:b3d8:31f7:306d:a418:fdcf:3e60 | -                                                                               |                                | \n ae64:d6a3:11d7:b6bc:aa3:60c6:b16f:4305  |                 | ae64:d6a3:11d7:b6bc:aa3:60c6:b16f:4305  | -                                                                               |                                | \n af5a:6507:2c50:f0a8:b211:fc0d:425e:bd47 |                 | af5a:6507:2c50:f0a8:b211:fc0d:425e:bd47 | -                                                                               |                                | \n afeb:a771:735e:1a18:9297:e9f4:2e53:c5e1 |                 | afeb:a771:735e:1a18:9297:e9f4:2e53:c5e1 | -                                                                               |                                | \n b105:5518:a963:9a0a:d10d:b42b:dfd1:96a2 |                 | b105:5518:a963:9a0a:d10d:b42b:dfd1:96a2 | -                                                                               |                                | \n b113:66f:e222:f032:7161:1f27:b080:2111  |                 | b113:66f:e222:f032:7161:1f27:b080:2111  | -                                                                               |                                | \n b218:c6f2:4929:7d70:8b4d:5458:fc85:d0fc |                 | b218:c6f2:4929:7d70:8b4d:5458:fc85:d0fc | -                                                                               |                                | \n b237:dac3:62d7:725e:d772:c88c:af71:cec5 |                 | b237:dac3:62d7:725e:d772:c88c:af71:cec5 | -                                                                               |                                | \n b310:3d72:ea86:6ee:45fc:d57f:4a7a:bb43  |                 | b310:3d72:ea86:6ee:45fc:d57f:4a7a:bb43  | -                                                                               |                                | \n b3da:187b:cc2e:3c78:e060:aab6:63cb:1780 |                 | b3da:187b:cc2e:3c78:e060:aab6:63cb:1780 | -                                                                               |                                | \n b408:9874:22a3:9f56:35f:cfd1:b00:ddac   |                 | b408:9874:22a3:9f56:35f:cfd1:b00:ddac   | -                                                                               |                                | \n b48c:eccb:32f4:2b4:e2ee:e787:a16f:8647  |                 | b48c:eccb:32f4:2b4:e2ee:e787:a16f:8647  | -                                                                               |                                | \n b8ef:17e2:febe:431d:9d8c:88c6:6604:a678 |                 | b8ef:17e2:febe:431d:9d8c:88c6:6604:a678 | -                                                                               |                                | \n ba0d:d2d4:b5e3:573f:98f4:98e:aac1:47fa  |                 | ba0d:d2d4:b5e3:573f:98f4:98e:aac1:47fa  | -                                                                               |                                | \n baf9:2948:a8a1:8865:912a:839f:45e8:78d3 |                 | baf9:2948:a8a1:8865:912a:839f:45e8:78d3 | -                                                                               |                                | \n bb1b:6a20:8513:14e4:5fc6:c0e9:17df:9c0  |                 | bb1b:6a20:8513:14e4:5fc6:c0e9:17df:9c0  | -                                                                               |                                | \n bc1d:d3ba:50da:14d3:f496:6847:3b91:2830 |                 | bc1d:d3ba:50da:14d3:f496:6847:3b91:2830 | -                                                                               |                                | \n bc52:8171:9377:d593:1c0a:75e4:e2d:5e1a  |                 | bc52:8171:9377:d593:1c0a:75e4:e2d:5e1a  | -                                                                               |                                | \n bd6f:44b9:45d3:529f:84c7:612:b25c:aaf8  |                 | bd6f:44b9:45d3:529f:84c7:612:b25c:aaf8  | -                                                                               |                                | \n bd6f:44b9:45d3:529f:84c7:612:b25c:aaf8  |                 | bd6f:44b9:45d3:529f:84c7:612:b25c:aaf8  | bd2a:be6d:190:4507:74a2:e822:1268:d65b-bdd8:dc9a:1e65:6d42:1548:579b:2494:ad37  |                                | bd2a:be6d:190:4507:74a2:e822:1268:d65b-bdd8:dc9a:1e65:6d42:1548:579b:2494:ad37\n bdc5:94f5:8249:7120:8132:ca25:d3fc:c394 |                 | bdc5:94f5:8249:7120:8132:ca25:d3fc:c394 | -                                                                               |                                | \n bdc5:94f5:8249:7120:8132:ca25:d3fc:c394 |                 | bdc5:94f5:8249:7120:8132:ca25:d3fc:c394 | bd2a:be6d:190:4507:74a2:e822:1268:d65b-bdd8:dc9a:1e65:6d42:1548:579b:2494:ad37  |                                | bd2a:be6d:190:4507:74a2:e822:1268:d65b-bdd8:dc9a:1e65:6d42:1548:579b:2494:ad37\n c0fc:f3ee:3707:19dc:62c1:5c9a:df3d:1b58 |                 | c0fc:f3ee:3707:19dc:62c1:5c9a:df3d:1b58 | -                                                                               |                                | \n c0fc:f3ee:3707:19dc:62c1:5c9a:df3d:1b58 |                 | c0fc:f3ee:3707:19dc:62c1:5c9a:df3d:1b58 | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |                                | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c2e3:4cea:30dd:cb39:c5a0:86e7:8b05:3f7  |                 | c2e3:4cea:30dd:cb39:c5a0:86e7:8b05:3f7  | -                                                                               |                                | \n c2e3:4cea:30dd:cb39:c5a0:86e7:8b05:3f7  |                 | c2e3:4cea:30dd:cb39:c5a0:86e7:8b05:3f7  | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |                                | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c36f:f4fd:4853:a07c:c25d:349f:3af4:3432 |                 | c36f:f4fd:4853:a07c:c25d:349f:3af4:3432 | -                                                                               |                                | \n c36f:f4fd:4853:a07c:c25d:349f:3af4:3432 |                 | c36f:f4fd:4853:a07c:c25d:349f:3af4:3432 | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |                                | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c504:481e:2756:3ca2:f0c:a26a:4e64:7804  |                 | c504:481e:2756:3ca2:f0c:a26a:4e64:7804  | -                                                                               |                                | \n c504:481e:2756:3ca2:f0c:a26a:4e64:7804  |                 | c504:481e:2756:3ca2:f0c:a26a:4e64:7804  | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |                                | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c504:481e:2756:3ca2:f0c:a26a:4e64:7804  |                 | c504:481e:2756:3ca2:f0c:a26a:4e64:7804  | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8    |                                | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8\n c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d |                 | c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d | -                                                                               |                                | \n c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d |                 | c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |                                | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d |                 | c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8    |                                | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8\n c8c0:5117:331a:f029:8d24:6775:fe7d:5976 |                 | c8c0:5117:331a:f029:8d24:6775:fe7d:5976 | -                                                                               |                                | \n c8c0:5117:331a:f029:8d24:6775:fe7d:5976 |                 | c8c0:5117:331a:f029:8d24:6775:fe7d:5976 | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |                                | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c8c0:5117:331a:f029:8d24:6775:fe7d:5976 |                 | c8c0:5117:331a:f029:8d24:6775:fe7d:5976 | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8    |                                | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8\n c963:10d0:1586:d1d4:79bc:d7af:5486:43e5 |                 | c963:10d0:1586:d1d4:79bc:d7af:5486:43e5 | -                                                                               |                                | \n c963:10d0:1586:d1d4:79bc:d7af:5486:43e5 |                 | c963:10d0:1586:d1d4:79bc:d7af:5486:43e5 | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |                                | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c963:10d0:1586:d1d4:79bc:d7af:5486:43e5 |                 | c963:10d0:1586:d1d4:79bc:d7af:5486:43e5 | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8    |                                | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8\n c99c:bd43:6161:d17d:2fdd:ab61:922:ba62  |                 | c99c:bd43:6161:d17d:2fdd:ab61:922:ba62  | -                                                                               |                                | \n c99c:bd43:6161:d17d:2fdd:ab61:922:ba62  |                 | c99c:bd43:6161:d17d:2fdd:ab61:922:ba62  | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |                                | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c99c:bd43:6161:d17d:2fdd:ab61:922:ba62  |                 | c99c:bd43:6161:d17d:2fdd:ab61:922:ba62  | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8    |                                | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8\n cb2f:b8da:ba34:1c5c:4839:710a:f75b:bdd0 |                 | cb2f:b8da:ba34:1c5c:4839:710a:f75b:bdd0 | -                                                                               |                                | \n cb2f:b8da:ba34:1c5c:4839:710a:f75b:bdd0 |                 | cb2f:b8da:ba34:1c5c:4839:710a:f75b:bdd0 | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |                                | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n cb70:a0cc:6919:db7f:8fc8:cb69:6fcc:5f5b |                 | cb70:a0cc:6919:db7f:8fc8:cb69:6fcc:5f5b | -                                                                               |                                | \n cb70:a0cc:6919:db7f:8fc8:cb69:6fcc:5f5b |                 | cb70:a0cc:6919:db7f:8fc8:cb69:6fcc:5f5b | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |                                | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n cc17:3814:d80f:41a1:1309:35d3:ea0a:d31e |                 | cc17:3814:d80f:41a1:1309:35d3:ea0a:d31e | -                                                                               |                                | \n cc17:3814:d80f:41a1:1309:35d3:ea0a:d31e |                 | cc17:3814:d80f:41a1:1309:35d3:ea0a:d31e | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |                                | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n ce47:e5eb:41f3:23af:6209:5ade:82ce:3b00 |                 | ce47:e5eb:41f3:23af:6209:5ade:82ce:3b00 | -                                                                               |                                | \n ce47:e5eb:41f3:23af:6209:5ade:82ce:3b00 |                 | ce47:e5eb:41f3:23af:6209:5ade:82ce:3b00 | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |                                | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n cfb9:d37e:2427:af8d:b728:8f90:f54c:9141 |                 | cfb9:d37e:2427:af8d:b728:8f90:f54c:9141 | -                                                                               |                                | \n d066:f25b:e8a5:4ae6:4c99:2a98:8cb7:2530 |                 | d066:f25b:e8a5:4ae6:4c99:2a98:8cb7:2530 | -                                                                               |                                | \n d066:f25b:e8a5:4ae6:4c99:2a98:8cb7:2530 |                 | d066:f25b:e8a5:4ae6:4c99:2a98:8cb7:2530 | d05d:6ab5:422e:c783:15fc:6439:918c:f8bd-d091:8c1c:5e1d:903c:50fc:dded:2e4a:bf02 |                                | d05d:6ab5:422e:c783:15fc:6439:918c:f8bd-d091:8c1c:5e1d:903c:50fc:dded:2e4a:bf02\n d105:1597:c912:51c7:e5b6:f628:cae:1d0f  |                 | d105:1597:c912:51c7:e5b6:f628:cae:1d0f  | -                                                                               |                                | \n d2de:7aa1:975:e510:dfa1:2a3:89bc:eedb   |                 | d2de:7aa1:975:e510:dfa1:2a3:89bc:eedb   | -                                                                               |                                | \n d33e:e847:b4c6:d5ca:f75:216b:342c:3d04  |                 | d33e:e847:b4c6:d5ca:f75:216b:342c:3d04  | -                                                                               |                                | \n d395:c008:43a4:48d9:15a7:ce74:6546:c56b |                 | d395:c008:43a4:48d9:15a7:ce74:6546:c56b | -                                                                               |                                | \n d452:6fb9:f2b0:d387:80ca:47d5:330f:577  |                 | d452:6fb9:f2b0:d387:80ca:47d5:330f:577  | -                                                                               |                                | \n d524:77db:2a21:e05b:68c4:575c:f04b:b0b7 |                 | d524:77db:2a21:e05b:68c4:575c:f04b:b0b7 | -                                                                               |                                | \n d6d1:e96c:cd2f:8396:23f2:c96d:9376:54cb |                 | d6d1:e96c:cd2f:8396:23f2:c96d:9376:54cb | -                                                                               |                                | \n d76b:986d:d38b:252a:e6a2:254e:b0f7:db24 |                 | d76b:986d:d38b:252a:e6a2:254e:b0f7:db24 | -                                                                               |                                | \n d9f3:2018:6aa2:7ee4:64be:e2d:c32c:2d15  |                 | d9f3:2018:6aa2:7ee4:64be:e2d:c32c:2d15  | -                                                                               |                                | \n d9f3:2018:6aa2:7ee4:64be:e2d:c32c:2d15  |                 | d9f3:2018:6aa2:7ee4:64be:e2d:c32c:2d15  | d98e:be37:92ff:fcc7:2c26:4d2d:b393:95cb-d9fe:570d:e24e:1d2b:403:6c50:eb8d:fc3   |                                | d98e:be37:92ff:fcc7:2c26:4d2d:b393:95cb-d9fe:570d:e24e:1d2b:403:6c50:eb8d:fc3\n da3e:c57c:ccc8:edbf:f66e:85a5:e252:a3a4 |                 | da3e:c57c:ccc8:edbf:f66e:85a5:e252:a3a4 | -                                                                               |                                | \n da52:3791:27b8:f773:7a59:1414:6d76:bd8a |                 | da52:3791:27b8:f773:7a59:1414:6d76:bd8a | -                                                                               |                                | \n da97:ecc5:bf17:1bb2:5710:f753:604c:7cf6 |                 | da97:ecc5:bf17:1bb2:5710:f753:604c:7cf6 | -                                                                               |                                | \n dc61:8bf4:4b82:90a4:8af0:6a43:a917:14ee |                 | dc61:8bf4:4b82:90a4:8af0:6a43:a917:14ee | -                                                                               |                                | \n dd3b:ad95:1e55:a555:daae:8218:99d7:7bce |                 | dd3b:ad95:1e55:a555:daae:8218:99d7:7bce | -                                                                               |                                | \n defd:c729:62b4:8959:6ad1:7b1f:5835:8ffb |                 | defd:c729:62b4:8959:6ad1:7b1f:5835:8ffb | -                                                                               |                                | \n dfe2:c097:49ae:1d60:e3db:26c1:bb5d:c4e0 |                 | dfe2:c097:49ae:1d60:e3db:26c1:bb5d:c4e0 | -                                                                               |                                | \n e11c:4f21:dd57:c814:af4e:3f55:4adf:f1a0 |                 | e11c:4f21:dd57:c814:af4e:3f55:4adf:f1a0 | -                                                                               |                                | \n e11c:4f21:dd57:c814:af4e:3f55:4adf:f1a0 |                 | e11c:4f21:dd57:c814:af4e:3f55:4adf:f1a0 | e104:d364:b55e:bf80:97f3:cf03:61ed:c6ef-e1b7:f280:7b4a:2a4:2e0e:c372:f0ab:158   |                                | e104:d364:b55e:bf80:97f3:cf03:61ed:c6ef-e1b7:f280:7b4a:2a4:2e0e:c372:f0ab:158\n e199:2ea0:f3b4:3a31:5d15:dfc9:68cd:c948 |                 | e199:2ea0:f3b4:3a31:5d15:dfc9:68cd:c948 | -                                                                               |                                | \n e199:2ea0:f3b4:3a31:5d15:dfc9:68cd:c948 |                 | e199:2ea0:f3b4:3a31:5d15:dfc9:68cd:c948 | e104:d364:b55e:bf80:97f3:cf03:61ed:c6ef-e1b7:f280:7b4a:2a4:2e0e:c372:f0ab:158   |                                | e104:d364:b55e:bf80:97f3:cf03:61ed:c6ef-e1b7:f280:7b4a:2a4:2e0e:c372:f0ab:158\n e57b:76e8:3f3a:3020:a22a:38b7:9c02:5db4 |                 | e57b:76e8:3f3a:3020:a22a:38b7:9c02:5db4 | -                                                                               |                                | \n e6da:dc3c:a935:a718:4744:a216:84bd:cfa9 |                 | e6da:dc3c:a935:a718:4744:a216:84bd:cfa9 | -                                                                               |                                | \n e7a7:adbe:d6de:41ba:a34f:d10b:46a7:a4cf |                 | e7a7:adbe:d6de:41ba:a34f:d10b:46a7:a4cf | -                                                                               |                                | \n e86d:edb4:8702:1774:c97d:cbee:394:a083  |                 | e86d:edb4:8702:1774:c97d:cbee:394:a083  | -                                                                               |                                | \n e97f:c466:f346:cf67:23e4:bd36:72be:af44 |                 | e97f:c466:f346:cf67:23e4:bd36:72be:af44 | -                                                                               |                                | \n ec36:7c6d:3077:267e:399a:d47:55a4:218a  |                 | ec36:7c6d:3077:267e:399a:d47:55a4:218a  | -                                                                               |                                | \n ee1d:a078:25d4:94e3:9a89:707d:6fae:7573 |                 | ee1d:a078:25d4:94e3:9a89:707d:6fae:7573 | -                                                                               |                                | \n ee34:9ba:9281:593c:ab74:57fa:e439:e0f3  |                 | ee34:9ba:9281:593c:ab74:57fa:e439:e0f3  | -                                                                               |                                | \n ee76:e9ac:dd2:66c1:380:5f1e:1c4d:2867   |                 | ee76:e9ac:dd2:66c1:380:5f1e:1c4d:2867   | -                                                                               |                                | \n eea0:9aef:71b:3cfd:e2ad:864c:41b8:938c  |                 | eea0:9aef:71b:3cfd:e2ad:864c:41b8:938c  | -                                                                               |                                | \n ef15:3aa9:3c5b:b993:5209:a130:2d37:3a64 |                 | ef15:3aa9:3c5b:b993:5209:a130:2d37:3a64 | -                                                                               |                                | \n ef9a:b980:e9:d50a:d867:8a88:2cae:8aa1   |                 | ef9a:b980:e9:d50a:d867:8a88:2cae:8aa1   | -                                                                               |                                | \n effb:1a90:1dd5:e52c:1d7f:c716:3744:170a |                 | effb:1a90:1dd5:e52c:1d7f:c716:3744:170a | -                                                                               |                                | \n f0a1:e730:68b9:2e1c:649a:5450:a256:4665 |                 | f0a1:e730:68b9:2e1c:649a:5450:a256:4665 | -                                                                               |                                | \n f3df:f155:d5c6:d664:c93c:13fa:9d77:6bf2 |                 | f3df:f155:d5c6:d664:c93c:13fa:9d77:6bf2 | -                                                                               |                                | \n f499:668f:fbb8:f0dc:8e41:d43b:c025:26a  |                 | f499:668f:fbb8:f0dc:8e41:d43b:c025:26a  | -                                                                               |                                | \n f57a:a3dc:3b11:f28a:8b25:8d5b:ec2f:c729 |                 | f57a:a3dc:3b11:f28a:8b25:8d5b:ec2f:c729 | -                                                                               |                                | \n f7b8:dfc:496c:9718:ae3c:5c3e:b98a:4c5f  |                 | f7b8:dfc:496c:9718:ae3c:5c3e:b98a:4c5f  | -                                                                               |                                | \n fa78:68ce:4fb1:d54c:2007:1820:ffe2:8235 |                 | fa78:68ce:4fb1:d54c:2007:1820:ffe2:8235 | -                                                                               |                                | \n fbb6:2d70:42eb:55ab:6235:6867:2b3:8d47  |                 | fbb6:2d70:42eb:55ab:6235:6867:2b3:8d47  | -                                                                               |                                | \n fcea:f739:a97d:cefc:49c4:b3c3:c7b4:99d6 |                 | fcea:f739:a97d:cefc:49c4:b3c3:c7b4:99d6 | -                                                                               |                                | \n fda3:3e75:37c5:c1f:912b:5e32:6aa9:aeb2  |                 | fda3:3e75:37c5:c1f:912b:5e32:6aa9:aeb2  | -                                                                               |                                | \n ff3d:7d5b:b0fe:c30:9e6c:23e0:7b5:e9de   |                 | ff3d:7d5b:b0fe:c30:9e6c:23e0:7b5:e9de   | -                                                                               |                                | \n ff4a:cbbf:695a:9e46:f27c:e1be:861f:9e7  |                 | ff4a:cbbf:695a:9e46:f27c:e1be:861f:9e7  | -                                                                               |                                | \n ff6b:af36:5fc2:93d9:ebf3:3c62:a19f:307f |                 | ff6b:af36:5fc2:93d9:ebf3:3c62:a19f:307f | -                                                                               |                                | \n(351 rows)\n\nselect * from ipaddrs a join ipranges r on (r.r4 >>= a.a4) order by a4,r4;\n        a        |       a4        | a6 |               r                |               r4               | r6 \n-----------------+-----------------+----+--------------------------------+--------------------------------+----\n 12.174.29.15    | 12.174.29.15    |    | 9.228.56.34-28.197.214.173     | 9.228.56.34-28.197.214.173     | \n 33.8.16.211     | 33.8.16.211     |    | 32.219.217.193-34.140.113.120  | 32.219.217.193-34.140.113.120  | \n 73.239.169.71   | 73.239.169.71   |    | 65.76.62.93-75.189.2.219       | 65.76.62.93-75.189.2.219       | \n 73.239.169.71   | 73.239.169.71   |    | 70.178.141.1-79.252.178.95     | 70.178.141.1-79.252.178.95     | \n 76.178.38.194   | 76.178.38.194   |    | 70.178.141.1-79.252.178.95     | 70.178.141.1-79.252.178.95     | \n 76.178.38.194   | 76.178.38.194   |    | 75.211.173.58-77.84.189.178    | 75.211.173.58-77.84.189.178    | \n 76.178.38.194   | 76.178.38.194   |    | 76.164.111.154-76.183.66.114   | 76.164.111.154-76.183.66.114   | \n 104.175.11.72   | 104.175.11.72   |    | 104.76.127.225-105.198.184.62  | 104.76.127.225-105.198.184.62  | \n 163.145.90.183  | 163.145.90.183  |    | 155.206.49.182-190.20.159.162  | 155.206.49.182-190.20.159.162  | \n 189.85.58.60    | 189.85.58.60    |    | 155.206.49.182-190.20.159.162  | 155.206.49.182-190.20.159.162  | \n 189.85.58.60    | 189.85.58.60    |    | 184.142.247.0-191.129.204.149  | 184.142.247.0-191.129.204.149  | \n 195.58.214.186  | 195.58.214.186  |    | 192.198.196.94-195.116.202.186 | 192.198.196.94-195.116.202.186 | \n 195.58.214.186  | 195.58.214.186  |    | 194.50.23.161-195.215.1.54     | 194.50.23.161-195.215.1.54     | \n 223.213.219.214 | 223.213.219.214 |    | 207.129.8.36-240.135.140.181   | 207.129.8.36-240.135.140.181   | \n 235.64.97.205   | 235.64.97.205   |    | 207.129.8.36-240.135.140.181   | 207.129.8.36-240.135.140.181   | \n 235.64.97.205   | 235.64.97.205   |    | 233.169.207.115-238.213.223.60 | 233.169.207.115-238.213.223.60 | \n 235.64.97.205   | 235.64.97.205   |    | 234.48.112.251-235.130.33.88   | 234.48.112.251-235.130.33.88   | \n 240.116.30.226  | 240.116.30.226  |    | 207.129.8.36-240.135.140.181   | 207.129.8.36-240.135.140.181   | \n 255.226.130.53  | 255.226.130.53  |    | 255.148.94.59-255.232.142.189  | 255.148.94.59-255.232.142.189  | \n(19 rows)\n\nselect * from ipaddrs a join ipranges r on (r.r6 >>= a.a6) order by a6,r6;\n                    a                    | a4 |                   a6                    |                                        r                                        | r4 |                                       r6                                        \n-----------------------------------------+----+-----------------------------------------+---------------------------------------------------------------------------------+----+---------------------------------------------------------------------------------\n 73:3c34:57a:2a84:b1df:81b0:eb40:61cd    |    | 73:3c34:57a:2a84:b1df:81b0:eb40:61cd    | 6d:d4d7:e3dc:b30c:d0f3:6ae3:907e:beb2-a4:f5d3:b64e:8e01:5f11:d5c3:be0b:e20c     |    | 6d:d4d7:e3dc:b30c:d0f3:6ae3:907e:beb2-a4:f5d3:b64e:8e01:5f11:d5c3:be0b:e20c\n 227:b768:d43b:773d:6168:5133:867c:13f2  |    | 227:b768:d43b:773d:6168:5133:867c:13f2  | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679     |    | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679\n 453:2d:fbd3:191:95c6:3751:eb62:e90      |    | 453:2d:fbd3:191:95c6:3751:eb62:e90      | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679     |    | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679\n 4a6:7a28:b05b:f9b4:cc5b:9c4c:eefe:3e06  |    | 4a6:7a28:b05b:f9b4:cc5b:9c4c:eefe:3e06  | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679     |    | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679\n 550:fe90:bd02:a3ed:35a2:3254:e280:cd20  |    | 550:fe90:bd02:a3ed:35a2:3254:e280:cd20  | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679     |    | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679\n 75d:e701:5702:6087:a69a:1a2d:376e:4eb   |    | 75d:e701:5702:6087:a69a:1a2d:376e:4eb   | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679     |    | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679\n 7e1:a608:dadd:684d:679e:698b:4db:c8c2   |    | 7e1:a608:dadd:684d:679e:698b:4db:c8c2   | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679     |    | 176:6781:47c:8022:8ab8:8b64:a8ce:da2c-863:40d1:76b:fbce:b89e:221f:ddb0:7679\n 1c3e:17b6:1bfd:77ea:2185:9748:38d:ac80  |    | 1c3e:17b6:1bfd:77ea:2185:9748:38d:ac80  | 1c1d:d54b:5bb8:fe5b:db91:4edb:6870:34f5-1d9f:9898:7888:7b02:1064:a19a:ccc8:4849 |    | 1c1d:d54b:5bb8:fe5b:db91:4edb:6870:34f5-1d9f:9898:7888:7b02:1064:a19a:ccc8:4849\n 1c90:5c1b:9431:11ea:f6dd:bb7c:c57f:6cc6 |    | 1c90:5c1b:9431:11ea:f6dd:bb7c:c57f:6cc6 | 1c1d:d54b:5bb8:fe5b:db91:4edb:6870:34f5-1d9f:9898:7888:7b02:1064:a19a:ccc8:4849 |    | 1c1d:d54b:5bb8:fe5b:db91:4edb:6870:34f5-1d9f:9898:7888:7b02:1064:a19a:ccc8:4849\n 1cc5:18d6:116d:d727:86b:9655:f44d:4fb7  |    | 1cc5:18d6:116d:d727:86b:9655:f44d:4fb7  | 1c1d:d54b:5bb8:fe5b:db91:4edb:6870:34f5-1d9f:9898:7888:7b02:1064:a19a:ccc8:4849 |    | 1c1d:d54b:5bb8:fe5b:db91:4edb:6870:34f5-1d9f:9898:7888:7b02:1064:a19a:ccc8:4849\n 28a6:2032:8a38:de85:f6f3:47bd:5124:7dc8 |    | 28a6:2032:8a38:de85:f6f3:47bd:5124:7dc8 | 282c:2276:9cc1:58aa:1e30:2fce:a695:c42e-28f8:52d4:b106:5e5c:b22a:6a84:e581:7934 |    | 282c:2276:9cc1:58aa:1e30:2fce:a695:c42e-28f8:52d4:b106:5e5c:b22a:6a84:e581:7934\n 28e7:4441:e0a4:bf30:4cf4:edb0:638d:ad72 |    | 28e7:4441:e0a4:bf30:4cf4:edb0:638d:ad72 | 282c:2276:9cc1:58aa:1e30:2fce:a695:c42e-28f8:52d4:b106:5e5c:b22a:6a84:e581:7934 |    | 282c:2276:9cc1:58aa:1e30:2fce:a695:c42e-28f8:52d4:b106:5e5c:b22a:6a84:e581:7934\n 2b47:da0e:8c52:cc33:afaa:f85f:f143:88c6 |    | 2b47:da0e:8c52:cc33:afaa:f85f:f143:88c6 | 2b09:bce8:a5eb:7add:f388:6ff3:3247:6bc4-2bce:b195:8b4d:d7a2:e6f9:6325:c4cf:dcd7 |    | 2b09:bce8:a5eb:7add:f388:6ff3:3247:6bc4-2bce:b195:8b4d:d7a2:e6f9:6325:c4cf:dcd7\n 4068:6d06:7463:589:3262:86d1:f1f1:f088  |    | 4068:6d06:7463:589:3262:86d1:f1f1:f088  | 403e:a65:913d:bf17:1650:f48c:967f:6cee-42a0:8ac9:38d0:b9ba:bc91:ac9:9f19:24f6   |    | 403e:a65:913d:bf17:1650:f48c:967f:6cee-42a0:8ac9:38d0:b9ba:bc91:ac9:9f19:24f6\n 4111:e35f:ce3:c4de:dc4e:8764:8cd:1686   |    | 4111:e35f:ce3:c4de:dc4e:8764:8cd:1686   | 403e:a65:913d:bf17:1650:f48c:967f:6cee-42a0:8ac9:38d0:b9ba:bc91:ac9:9f19:24f6   |    | 403e:a65:913d:bf17:1650:f48c:967f:6cee-42a0:8ac9:38d0:b9ba:bc91:ac9:9f19:24f6\n 4131:d8b6:82af:797d:25fd:7bd4:b94d:ce34 |    | 4131:d8b6:82af:797d:25fd:7bd4:b94d:ce34 | 403e:a65:913d:bf17:1650:f48c:967f:6cee-42a0:8ac9:38d0:b9ba:bc91:ac9:9f19:24f6   |    | 403e:a65:913d:bf17:1650:f48c:967f:6cee-42a0:8ac9:38d0:b9ba:bc91:ac9:9f19:24f6\n 5721:3c79:a6ff:c8d8:5e3:c785:808:e40    |    | 5721:3c79:a6ff:c8d8:5e3:c785:808:e40    | 570d:9354:14c4:e9c9:dc63:be77:d70a:947c-57cb:4a7a:c3c:fcd2:e130:41d9:165:df     |    | 570d:9354:14c4:e9c9:dc63:be77:d70a:947c-57cb:4a7a:c3c:fcd2:e130:41d9:165:df\n 5d63:9613:7b87:5c26:5c80:bbd3:14b5:1e63 |    | 5d63:9613:7b87:5c26:5c80:bbd3:14b5:1e63 | 5d63:3959:e781:2931:84ab:7fd7:2f85:8101-5d6c:d5a2:e9c3:9ab4:4aab:7f0a:9c18:8dca |    | 5d63:3959:e781:2931:84ab:7fd7:2f85:8101-5d6c:d5a2:e9c3:9ab4:4aab:7f0a:9c18:8dca\n 7524:1f76:fe52:991e:667b:a302:dfd5:dbd6 |    | 7524:1f76:fe52:991e:667b:a302:dfd5:dbd6 | 742e:1d26:42a5:cc7c:4ffd:726f:19e0:61f7-76b8:303d:bb7:c766:cf35:f22e:c86f:1400  |    | 742e:1d26:42a5:cc7c:4ffd:726f:19e0:61f7-76b8:303d:bb7:c766:cf35:f22e:c86f:1400\n 7608:50bf:a29a:6805:c760:9ae3:1216:8e4a |    | 7608:50bf:a29a:6805:c760:9ae3:1216:8e4a | 742e:1d26:42a5:cc7c:4ffd:726f:19e0:61f7-76b8:303d:bb7:c766:cf35:f22e:c86f:1400  |    | 742e:1d26:42a5:cc7c:4ffd:726f:19e0:61f7-76b8:303d:bb7:c766:cf35:f22e:c86f:1400\n 828e:fa1d:9bb1:ad4c:4874:9da8:40bf:25b5 |    | 828e:fa1d:9bb1:ad4c:4874:9da8:40bf:25b5 | 8261:c35e:8e93:a1d1:4000:42a9:b632:112c-82f4:6c3e:dff3:6472:7292:3bbc:abd7:1e73 |    | 8261:c35e:8e93:a1d1:4000:42a9:b632:112c-82f4:6c3e:dff3:6472:7292:3bbc:abd7:1e73\n 8298:9399:271f:a3fe:270c:21cf:7c34:7340 |    | 8298:9399:271f:a3fe:270c:21cf:7c34:7340 | 8261:c35e:8e93:a1d1:4000:42a9:b632:112c-82f4:6c3e:dff3:6472:7292:3bbc:abd7:1e73 |    | 8261:c35e:8e93:a1d1:4000:42a9:b632:112c-82f4:6c3e:dff3:6472:7292:3bbc:abd7:1e73\n 82ed:ac69:4ea7:5301:b005:3e17:f541:4fbc |    | 82ed:ac69:4ea7:5301:b005:3e17:f541:4fbc | 8261:c35e:8e93:a1d1:4000:42a9:b632:112c-82f4:6c3e:dff3:6472:7292:3bbc:abd7:1e73 |    | 8261:c35e:8e93:a1d1:4000:42a9:b632:112c-82f4:6c3e:dff3:6472:7292:3bbc:abd7:1e73\n 86fa:3a3:6a26:5ce3:fd8d:6267:b3c:4bf0   |    | 86fa:3a3:6a26:5ce3:fd8d:6267:b3c:4bf0   | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |    | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 874b:a74e:e292:c13:cf80:778c:35b4:d37c  |    | 874b:a74e:e292:c13:cf80:778c:35b4:d37c  | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |    | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 88bb:cf40:1f19:c897:f001:2d56:8f4f:ac68 |    | 88bb:cf40:1f19:c897:f001:2d56:8f4f:ac68 | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |    | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 8909:5e3:cff9:483c:1fb7:2ee2:ab05:222a  |    | 8909:5e3:cff9:483c:1fb7:2ee2:ab05:222a  | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |    | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 890b:aa44:e2b1:ff61:eb7a:c4df:5a25:2eaf |    | 890b:aa44:e2b1:ff61:eb7a:c4df:5a25:2eaf | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |    | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 8a1f:674e:63cd:f241:8f53:aec9:d8db:8e5c |    | 8a1f:674e:63cd:f241:8f53:aec9:d8db:8e5c | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |    | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 8b0c:b103:3302:90bb:bac:809e:9c7d:3569  |    | 8b0c:b103:3302:90bb:bac:809e:9c7d:3569  | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |    | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 8b61:6b31:d02c:87d3:22cf:f01c:c045:b822 |    | 8b61:6b31:d02c:87d3:22cf:f01c:c045:b822 | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |    | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 8b87:864a:8e83:6783:c552:cb07:8e96:c0e5 |    | 8b87:864a:8e83:6783:c552:cb07:8e96:c0e5 | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |    | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n 8c86:2c19:c38d:626b:b5a4:e0cb:bbaf:476b |    | 8c86:2c19:c38d:626b:b5a4:e0cb:bbaf:476b | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422  |    | 8664:644c:adba:dc68:650:c853:c8b1:ee7e-8d83:a669:a387:5f8a:c300:f46a:aa19:2422\n a335:f1a7:be5c:b341:5325:e8d3:2631:74ae |    | a335:f1a7:be5c:b341:5325:e8d3:2631:74ae | a306:48c9:17c3:be92:bc17:3993:65e5:6855-a346:5383:4104:e53d:72b3:7e11:4d32:d696 |    | a306:48c9:17c3:be92:bc17:3993:65e5:6855-a346:5383:4104:e53d:72b3:7e11:4d32:d696\n a87b:8920:6e0:9c1b:92a8:3a1e:f074:1ee2  |    | a87b:8920:6e0:9c1b:92a8:3a1e:f074:1ee2  | a798:ae68:f434:630e:121d:acf7:c1dd:ccf8-a94a:2e2c:77c1:f913:6d64:fc:7eb6:2507   |    | a798:ae68:f434:630e:121d:acf7:c1dd:ccf8-a94a:2e2c:77c1:f913:6d64:fc:7eb6:2507\n a884:9796:ca7c:ec37:9cb4:4158:ce4c:ced5 |    | a884:9796:ca7c:ec37:9cb4:4158:ce4c:ced5 | a798:ae68:f434:630e:121d:acf7:c1dd:ccf8-a94a:2e2c:77c1:f913:6d64:fc:7eb6:2507   |    | a798:ae68:f434:630e:121d:acf7:c1dd:ccf8-a94a:2e2c:77c1:f913:6d64:fc:7eb6:2507\n a9e9:74a5:864a:dfeb:a5f0:4424:d294:95a1 |    | a9e9:74a5:864a:dfeb:a5f0:4424:d294:95a1 | a993:6021:2abb:60c4:63fc:8e04:7b20:cbb4-ac46:82d9:f719:584:7006:227:6076:a331   |    | a993:6021:2abb:60c4:63fc:8e04:7b20:cbb4-ac46:82d9:f719:584:7006:227:6076:a331\n bd6f:44b9:45d3:529f:84c7:612:b25c:aaf8  |    | bd6f:44b9:45d3:529f:84c7:612:b25c:aaf8  | bd2a:be6d:190:4507:74a2:e822:1268:d65b-bdd8:dc9a:1e65:6d42:1548:579b:2494:ad37  |    | bd2a:be6d:190:4507:74a2:e822:1268:d65b-bdd8:dc9a:1e65:6d42:1548:579b:2494:ad37\n bdc5:94f5:8249:7120:8132:ca25:d3fc:c394 |    | bdc5:94f5:8249:7120:8132:ca25:d3fc:c394 | bd2a:be6d:190:4507:74a2:e822:1268:d65b-bdd8:dc9a:1e65:6d42:1548:579b:2494:ad37  |    | bd2a:be6d:190:4507:74a2:e822:1268:d65b-bdd8:dc9a:1e65:6d42:1548:579b:2494:ad37\n c0fc:f3ee:3707:19dc:62c1:5c9a:df3d:1b58 |    | c0fc:f3ee:3707:19dc:62c1:5c9a:df3d:1b58 | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |    | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c2e3:4cea:30dd:cb39:c5a0:86e7:8b05:3f7  |    | c2e3:4cea:30dd:cb39:c5a0:86e7:8b05:3f7  | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |    | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c36f:f4fd:4853:a07c:c25d:349f:3af4:3432 |    | c36f:f4fd:4853:a07c:c25d:349f:3af4:3432 | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |    | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c504:481e:2756:3ca2:f0c:a26a:4e64:7804  |    | c504:481e:2756:3ca2:f0c:a26a:4e64:7804  | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |    | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c504:481e:2756:3ca2:f0c:a26a:4e64:7804  |    | c504:481e:2756:3ca2:f0c:a26a:4e64:7804  | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8    |    | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8\n c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d |    | c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |    | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d |    | c6ff:8d3c:d2d1:ee46:65ca:27f9:cc07:8e6d | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8    |    | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8\n c8c0:5117:331a:f029:8d24:6775:fe7d:5976 |    | c8c0:5117:331a:f029:8d24:6775:fe7d:5976 | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |    | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c8c0:5117:331a:f029:8d24:6775:fe7d:5976 |    | c8c0:5117:331a:f029:8d24:6775:fe7d:5976 | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8    |    | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8\n c963:10d0:1586:d1d4:79bc:d7af:5486:43e5 |    | c963:10d0:1586:d1d4:79bc:d7af:5486:43e5 | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |    | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c963:10d0:1586:d1d4:79bc:d7af:5486:43e5 |    | c963:10d0:1586:d1d4:79bc:d7af:5486:43e5 | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8    |    | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8\n c99c:bd43:6161:d17d:2fdd:ab61:922:ba62  |    | c99c:bd43:6161:d17d:2fdd:ab61:922:ba62  | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |    | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n c99c:bd43:6161:d17d:2fdd:ab61:922:ba62  |    | c99c:bd43:6161:d17d:2fdd:ab61:922:ba62  | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8    |    | c406:cc08:31e:a2ac:e9c0:e1a6:d216:8597-c9d1:f946:9f2b:487:86a1:a082:b31:c9e8\n cb2f:b8da:ba34:1c5c:4839:710a:f75b:bdd0 |    | cb2f:b8da:ba34:1c5c:4839:710a:f75b:bdd0 | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |    | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n cb70:a0cc:6919:db7f:8fc8:cb69:6fcc:5f5b |    | cb70:a0cc:6919:db7f:8fc8:cb69:6fcc:5f5b | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |    | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n cc17:3814:d80f:41a1:1309:35d3:ea0a:d31e |    | cc17:3814:d80f:41a1:1309:35d3:ea0a:d31e | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |    | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n ce47:e5eb:41f3:23af:6209:5ade:82ce:3b00 |    | ce47:e5eb:41f3:23af:6209:5ade:82ce:3b00 | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8  |    | c09a:e3ed:e52c:439b:84ae:dd00:96a1:d7f3-cebe:ab0d:21cd:f20:e2d6:1bbb:319a:55b8\n d066:f25b:e8a5:4ae6:4c99:2a98:8cb7:2530 |    | d066:f25b:e8a5:4ae6:4c99:2a98:8cb7:2530 | d05d:6ab5:422e:c783:15fc:6439:918c:f8bd-d091:8c1c:5e1d:903c:50fc:dded:2e4a:bf02 |    | d05d:6ab5:422e:c783:15fc:6439:918c:f8bd-d091:8c1c:5e1d:903c:50fc:dded:2e4a:bf02\n d9f3:2018:6aa2:7ee4:64be:e2d:c32c:2d15  |    | d9f3:2018:6aa2:7ee4:64be:e2d:c32c:2d15  | d98e:be37:92ff:fcc7:2c26:4d2d:b393:95cb-d9fe:570d:e24e:1d2b:403:6c50:eb8d:fc3   |    | d98e:be37:92ff:fcc7:2c26:4d2d:b393:95cb-d9fe:570d:e24e:1d2b:403:6c50:eb8d:fc3\n e11c:4f21:dd57:c814:af4e:3f55:4adf:f1a0 |    | e11c:4f21:dd57:c814:af4e:3f55:4adf:f1a0 | e104:d364:b55e:bf80:97f3:cf03:61ed:c6ef-e1b7:f280:7b4a:2a4:2e0e:c372:f0ab:158   |    | e104:d364:b55e:bf80:97f3:cf03:61ed:c6ef-e1b7:f280:7b4a:2a4:2e0e:c372:f0ab:158\n e199:2ea0:f3b4:3a31:5d15:dfc9:68cd:c948 |    | e199:2ea0:f3b4:3a31:5d15:dfc9:68cd:c948 | e104:d364:b55e:bf80:97f3:cf03:61ed:c6ef-e1b7:f280:7b4a:2a4:2e0e:c372:f0ab:158   |    | e104:d364:b55e:bf80:97f3:cf03:61ed:c6ef-e1b7:f280:7b4a:2a4:2e0e:c372:f0ab:158\n(60 rows)\n\n-- index-only, on versions that support it:\nvacuum ipranges;\nselect r from ipranges where r >>= '5555::' order by r;\n                                       r                                        \n--------------------------------------------------------------------------------\n -\n 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e\n(2 rows)\n\nselect r6 from ipranges where r6 >>= '5555::' order by r6;\n                                       r6                                       \n--------------------------------------------------------------------------------\n 5538:b6cb:ac50:bafe:dcd4:19e6:9ed0:2f2d-55f1:14f:6870:73ba:d803:ba0e:b968:d45e\n(1 row)\n\nselect r4 from ipranges where r4 >>= '172.16.2.0' order by r4;\n              r4               \n-------------------------------\n 155.206.49.182-190.20.159.162\n 172.16.2.0/28\n(2 rows)\n\n-- hashing\nselect lower(a / 4), count(*) from ipaddrs group by 1 order by 2,1;\n   lower   | count \n-----------+-------\n 0.0.0.0   |     1\n 32.0.0.0  |     1\n 48.0.0.0  |     1\n 160.0.0.0 |     1\n 176.0.0.0 |     1\n 208.0.0.0 |     1\n 224.0.0.0 |     1\n 64.0.0.0  |     2\n 96.0.0.0  |     2\n 192.0.0.0 |     2\n 240.0.0.0 |     3\n 3000::    |    11\n 6000::    |    11\n 9000::    |    12\n f000::    |    12\n c000::    |    13\n 4000::    |    14\n e000::    |    15\n 5000::    |    16\n a000::    |    16\n b000::    |    16\n 7000::    |    17\n d000::    |    17\n ::        |    18\n 2000::    |    19\n 1000::    |    23\n 8000::    |    26\n(27 rows)\n\nselect a4 & '240.0.0.0', count(*) from ipaddrs group by 1 order by 2,1;\n ?column?  | count \n-----------+-------\n 0.0.0.0   |     1\n 32.0.0.0  |     1\n 48.0.0.0  |     1\n 160.0.0.0 |     1\n 176.0.0.0 |     1\n 208.0.0.0 |     1\n 224.0.0.0 |     1\n 64.0.0.0  |     2\n 96.0.0.0  |     2\n 192.0.0.0 |     2\n 240.0.0.0 |     3\n           |   256\n(12 rows)\n\nselect a6 & 'f000::', count(*) from ipaddrs group by 1 order by 2,1;\n ?column? | count \n----------+-------\n 3000::   |    11\n 6000::   |    11\n 9000::   |    12\n f000::   |    12\n c000::   |    13\n 4000::   |    14\n e000::   |    15\n 5000::   |    16\n a000::   |    16\n b000::   |    16\n          |    16\n 7000::   |    17\n d000::   |    17\n ::       |    18\n 2000::   |    19\n 1000::   |    23\n 8000::   |    26\n(17 rows)\n\nselect a / 4, count(*) from ipaddrs group by 1 order by 2,1;\n  ?column?   | count \n-------------+-------\n 0.0.0.0/4   |     1\n 32.0.0.0/4  |     1\n 48.0.0.0/4  |     1\n 160.0.0.0/4 |     1\n 176.0.0.0/4 |     1\n 208.0.0.0/4 |     1\n 224.0.0.0/4 |     1\n 64.0.0.0/4  |     2\n 96.0.0.0/4  |     2\n 192.0.0.0/4 |     2\n 240.0.0.0/4 |     3\n 3000::/4    |    11\n 6000::/4    |    11\n 9000::/4    |    12\n f000::/4    |    12\n c000::/4    |    13\n 4000::/4    |    14\n e000::/4    |    15\n 5000::/4    |    16\n a000::/4    |    16\n b000::/4    |    16\n 7000::/4    |    17\n d000::/4    |    17\n ::/4        |    18\n 2000::/4    |    19\n 1000::/4    |    23\n 8000::/4    |    26\n(27 rows)\n\nselect a4 / 4, count(*) from ipaddrs group by 1 order by 2,1;\n  ?column?   | count \n-------------+-------\n 0.0.0.0/4   |     1\n 32.0.0.0/4  |     1\n 48.0.0.0/4  |     1\n 160.0.0.0/4 |     1\n 176.0.0.0/4 |     1\n 208.0.0.0/4 |     1\n 224.0.0.0/4 |     1\n 64.0.0.0/4  |     2\n 96.0.0.0/4  |     2\n 192.0.0.0/4 |     2\n 240.0.0.0/4 |     3\n             |   256\n(12 rows)\n\nselect a6 / 4, count(*) from ipaddrs group by 1 order by 2,1;\n ?column? | count \n----------+-------\n 3000::/4 |    11\n 6000::/4 |    11\n 9000::/4 |    12\n f000::/4 |    12\n c000::/4 |    13\n 4000::/4 |    14\n e000::/4 |    15\n 5000::/4 |    16\n a000::/4 |    16\n b000::/4 |    16\n          |    16\n 7000::/4 |    17\n d000::/4 |    17\n ::/4     |    18\n 2000::/4 |    19\n 1000::/4 |    23\n 8000::/4 |    26\n(17 rows)\n\n-- comparison ops\nselect\n  sum((r < '2000::/48')::integer) as s_lt,\n  sum((r <= '2000::/48')::integer) as s_le,\n  sum((r = '2000::/48')::integer) as s_eq,\n  sum((r >= '2000::/48')::integer) as s_ge,\n  sum((r > '2000::/48')::integer) as s_gt,\n  sum((r <> '2000::/48')::integer) as s_ne\n  from ipranges;\n s_lt  | s_le  | s_eq | s_ge  | s_gt  | s_ne  \n-------+-------+------+-------+-------+-------\n 11182 | 11183 |    1 | 19844 | 19843 | 31025\n(1 row)\n\nselect\n  sum((r6 < '2000::/48')::integer) as s_lt,\n  sum((r6 <= '2000::/48')::integer) as s_le,\n  sum((r6 = '2000::/48')::integer) as s_eq,\n  sum((r6 >= '2000::/48')::integer) as s_ge,\n  sum((r6 > '2000::/48')::integer) as s_gt,\n  sum((r6 <> '2000::/48')::integer) as s_ne\n  from ipranges;\n s_lt | s_le | s_eq | s_ge  | s_gt  | s_ne  \n------+------+------+-------+-------+-------\n 1658 | 1659 |    1 | 19844 | 19843 | 21501\n(1 row)\n\nselect\n  sum((r4 < '172.16.0.0/28')::integer) as s_lt,\n  sum((r4 <= '172.16.0.0/28')::integer) as s_le,\n  sum((r4 = '172.16.0.0/28')::integer) as s_eq,\n  sum((r4 >= '172.16.0.0/28')::integer) as s_ge,\n  sum((r4 > '172.16.0.0/28')::integer) as s_gt,\n  sum((r4 <> '172.16.0.0/28')::integer) as s_ne\n  from ipranges;\n s_lt | s_le | s_eq | s_ge | s_gt | s_ne \n------+------+------+------+------+------\n 5019 | 5020 |    1 | 4504 | 4503 | 9522\n(1 row)\n\nselect\n  sum((a < '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_lt,\n  sum((a <= '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_le,\n  sum((a = '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_eq,\n  sum((a >= '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_ge,\n  sum((a > '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_gt,\n  sum((a <> '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_ne\n  from ipaddrs;\n s_lt | s_le | s_eq | s_ge | s_gt | s_ne \n------+------+------+------+------+------\n  167 |  168 |    1 |  105 |  104 |  271\n(1 row)\n\nselect\n  sum((a6 < '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_lt,\n  sum((a6 <= '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_le,\n  sum((a6 = '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_eq,\n  sum((a6 >= '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_ge,\n  sum((a6 > '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_gt,\n  sum((a6 <> '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_ne\n  from ipaddrs;\n s_lt | s_le | s_eq | s_ge | s_gt | s_ne \n------+------+------+------+------+------\n  151 |  152 |    1 |  105 |  104 |  255\n(1 row)\n\nselect\n  sum((a4 < '104.175.11.72')::integer) as s_lt,\n  sum((a4 <= '104.175.11.72')::integer) as s_le,\n  sum((a4 = '104.175.11.72')::integer) as s_eq,\n  sum((a4 >= '104.175.11.72')::integer) as s_ge,\n  sum((a4 > '104.175.11.72')::integer) as s_gt,\n  sum((a4 <> '104.175.11.72')::integer) as s_ne\n  from ipaddrs;\n s_lt | s_le | s_eq | s_ge | s_gt | s_ne \n------+------+------+------+------+------\n    6 |    7 |    1 |   10 |    9 |   15\n(1 row)\n\n-- end\n"
  },
  {
    "path": "ip4r.control",
    "content": "# ip4r\ndefault_version = '2.4'\nrelocatable = 'true'\nmodule_pathname = '$libdir/ip4r'\n"
  },
  {
    "path": "scripts/ip4r--2.0--2.1.sql",
    "content": "/* ip4r--2.0--2.1.sql */\n\n-- complain if script is sourced in psql, rather than via ALTER EXTENSION\n\\echo Use \"ALTER EXTENSION ip4r UPDATE TO '2.1'\" to load this file. \\quit\n\n-- ugh. no ALTER CAST\n\nUPDATE pg_catalog.pg_cast SET castcontext = 'a'\n WHERE (castsource,casttarget) IN (\n        ('ipaddress'::regtype, 'ip4'::regtype),\n        ('ipaddress'::regtype, 'ip6'::regtype),\n        ('iprange'::regtype, 'ip4r'::regtype),\n        ('iprange'::regtype, 'ip6r'::regtype));\n\n-- double ugh, to finally fix long-standing issue with function signature\n-- of gist consistent functions\n\nWITH v(gname,gtype) AS (\n  VALUES ('gip4r_consistent'::name, 'ip4r'::regtype),\n         ('gip6r_consistent'::name, 'ip6r'::regtype),\n         ('gipr_consistent'::name,  'iprange'::regtype))\nUPDATE pg_catalog.pg_proc\n   SET pronargs = 5,\n       proargtypes = array_to_string(array['internal',\n                                           v.gtype,\n                                           'int2',\n                                           'oid',\n                                           'internal']::regtype[]::oid[],\n                                     ' ')::pg_catalog.oidvector\n  FROM v\n WHERE proname = v.gname\n   AND probin = 'MODULE_PATHNAME';\n\n-- actual new stuff\n\nCREATE FUNCTION gip4r_fetch(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gip6r_fetch(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gipr_fetch(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\n\nDO $s$\n  BEGIN\n    IF current_setting('server_version_num')::integer >= 90500 THEN\n      ALTER OPERATOR FAMILY gist_ip4r_ops USING gist ADD\n             FUNCTION\t9  (ip4r,ip4r)\tgip4r_fetch (internal);\n      ALTER OPERATOR FAMILY gist_ip6r_ops USING gist ADD\n             FUNCTION\t9  (ip6r,ip6r)\tgip6r_fetch (internal);\n      ALTER OPERATOR FAMILY gist_iprange_ops USING gist ADD\n             FUNCTION\t9  (iprange,iprange)\tgipr_fetch (internal);\n    END IF;\n    IF current_setting('server_version_num')::integer >= 90600 THEN\n      DECLARE\n        r record;\n      BEGIN\n        FOR r IN SELECT oid::regprocedure as fsig\n                   FROM pg_catalog.pg_proc\n                  WHERE (probin = 'MODULE_PATHNAME'\n                         AND prolang = (SELECT oid FROM pg_catalog.pg_language l WHERE l.lanname='c'))\n                     OR (oid in ('family(ip4)'::regprocedure,\n                                 'family(ip6)'::regprocedure,\n                                 'family(ip4r)'::regprocedure,\n                                 'family(ip6r)'::regprocedure))\n        LOOP\n          EXECUTE format('ALTER FUNCTION %s PARALLEL SAFE', r.fsig);\n        END LOOP;\n      END;\n    END IF;\n  END;\n$s$;\n\n-- end\n"
  },
  {
    "path": "scripts/ip4r--2.1--2.2.sql",
    "content": "/* ip4r--2.1--2.2.sql */\n\n-- complain if script is sourced in psql, rather than via ALTER EXTENSION\n\\echo Use \"ALTER EXTENSION ip4r UPDATE TO '2.2'\" to load this file. \\quit\n\n-- There's nothing actually new in this version, but it fixes an\n-- incorrect fix in 2.1.\n\nWITH v(gname,gtype) AS (\n  VALUES ('gip4r_consistent'::name, 'ip4r'::regtype),\n         ('gip6r_consistent'::name, 'ip6r'::regtype),\n         ('gipr_consistent'::name,  'iprange'::regtype))\nUPDATE pg_catalog.pg_proc\n   SET pronargs = 5,\n       proargtypes = array_to_string(array['internal',\n                                           v.gtype,\n                                           'int2',\n                                           'oid',\n                                           'internal']::regtype[]::oid[],\n                                     ' ')::pg_catalog.oidvector\n  FROM v\n WHERE proname = v.gname\n   AND probin = 'MODULE_PATHNAME';\n\n-- end\n"
  },
  {
    "path": "scripts/ip4r--2.2--2.4.sql",
    "content": "/* ip4r--2.2--2.4.sql */\n\n-- complain if script is sourced in psql, rather than via ALTER EXTENSION\n\\echo Use \"ALTER EXTENSION ip4r UPDATE TO '2.4'\" to load this file. \\quit\n\n-- new funcs\nCREATE FUNCTION cidr_split(ip4r) RETURNS SETOF ip4r AS 'MODULE_PATHNAME','ip4r_cidr_split' LANGUAGE C IMMUTABLE STRICT ROWS 10;\nCREATE FUNCTION cidr_split(ip6r) RETURNS SETOF ip6r AS 'MODULE_PATHNAME','ip6r_cidr_split' LANGUAGE C IMMUTABLE STRICT ROWS 50;\nCREATE FUNCTION cidr_split(iprange) RETURNS SETOF iprange AS 'MODULE_PATHNAME','iprange_cidr_split' LANGUAGE C IMMUTABLE STRICT ROWS 30;\n\n-- new casts\nCREATE FUNCTION ip4(bit) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4(varbit) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4(bytea) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_bytea' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6(bit) RETURNS ip6 AS 'MODULE_PATHNAME','ip6_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6(varbit) RETURNS ip6 AS 'MODULE_PATHNAME','ip6_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6(bytea) RETURNS ip6 AS 'MODULE_PATHNAME','ip6_cast_from_bytea' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress(bit) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress(varbit) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress(bytea) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_bytea' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r(varbit) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r(varbit) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bit(ip4) RETURNS varbit AS 'MODULE_PATHNAME','ip4_cast_to_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bit(ip6) RETURNS varbit AS 'MODULE_PATHNAME','ip6_cast_to_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bit(ipaddress) RETURNS varbit AS 'MODULE_PATHNAME','ipaddr_cast_to_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bit(ip4r) RETURNS varbit AS 'MODULE_PATHNAME','ip4r_cast_to_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bit(ip6r) RETURNS varbit AS 'MODULE_PATHNAME','ip6r_cast_to_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bit(iprange) RETURNS varbit AS 'MODULE_PATHNAME','iprange_cast_to_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bytea(ip4) RETURNS bytea AS 'MODULE_PATHNAME','ip4_cast_to_bytea' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bytea(ip6) RETURNS bytea AS 'MODULE_PATHNAME','ip6_cast_to_bytea' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bytea(ipaddress) RETURNS bytea AS 'MODULE_PATHNAME','ipaddr_cast_to_bytea' LANGUAGE C IMMUTABLE STRICT;\nCREATE CAST (ip4 as varbit) WITH FUNCTION to_bit(ip4);\nCREATE CAST (ip4 as bytea) WITH FUNCTION to_bytea(ip4);\nCREATE CAST (ip4r as varbit) WITH FUNCTION to_bit(ip4r);\nCREATE CAST (ip6 as varbit) WITH FUNCTION to_bit(ip6);\nCREATE CAST (ip6 as bytea) WITH FUNCTION to_bytea(ip6);\nCREATE CAST (ip6r as varbit) WITH FUNCTION to_bit(ip6r);\nCREATE CAST (ipaddress as varbit) WITH FUNCTION to_bit(ipaddress);\nCREATE CAST (ipaddress as bytea) WITH FUNCTION to_bytea(ipaddress);\nCREATE CAST (iprange as varbit) WITH FUNCTION to_bit(iprange);\nCREATE CAST (bit as ip4) WITH FUNCTION ip4(bit);\nCREATE CAST (bit as ip6) WITH FUNCTION ip6(bit);\nCREATE CAST (bit as ipaddress) WITH FUNCTION ipaddress(bit);\nCREATE CAST (varbit as ip4) WITH FUNCTION ip4(bit);\nCREATE CAST (varbit as ip6) WITH FUNCTION ip6(bit);\nCREATE CAST (varbit as ipaddress) WITH FUNCTION ipaddress(varbit);\nCREATE CAST (varbit as ip4r) WITH FUNCTION ip4r(varbit);\nCREATE CAST (varbit as ip6r) WITH FUNCTION ip6r(varbit);\nCREATE CAST (bytea as ip4) WITH FUNCTION ip4(bytea);\nCREATE CAST (bytea as ip6) WITH FUNCTION ip6(bytea);\nCREATE CAST (bytea as ipaddress) WITH FUNCTION ipaddress(bytea);\n\n-- new hash funcs\nCOMMENT ON FUNCTION iprangehash(iprange) IS 'deprecated, obsolete';\nCREATE FUNCTION iprange_hash(iprange) RETURNS integer AS 'MODULE_PATHNAME', 'iprange_hash_new' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4_hash_extended(ip4,bigint) RETURNS bigint AS 'MODULE_PATHNAME', 'ip4_hash_extended' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_hash_extended(ip6,bigint) RETURNS bigint AS 'MODULE_PATHNAME', 'ip6_hash_extended' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_hash_extended(ipaddress,bigint) RETURNS bigint AS 'MODULE_PATHNAME', 'ipaddr_hash_extended' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r_hash_extended(ip4r,bigint) RETURNS bigint AS 'MODULE_PATHNAME', 'ip4r_hash_extended' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_hash_extended(ip6r,bigint) RETURNS bigint AS 'MODULE_PATHNAME', 'ip6r_hash_extended' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_hash_extended(iprange,bigint) RETURNS bigint AS 'MODULE_PATHNAME', 'iprange_hash_extended' LANGUAGE C IMMUTABLE STRICT;\n\n-- new btree/range funcs\nCREATE FUNCTION in_range(ip4,ip4,bigint,boolean,boolean) RETURNS boolean AS 'MODULE_PATHNAME','ip4_in_range_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION in_range(ip4,ip4,ip4,boolean,boolean) RETURNS boolean AS 'MODULE_PATHNAME','ip4_in_range_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION in_range(ip6,ip6,bigint,boolean,boolean) RETURNS boolean AS 'MODULE_PATHNAME','ip6_in_range_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION in_range(ip6,ip6,ip6,boolean,boolean) RETURNS boolean AS 'MODULE_PATHNAME','ip6_in_range_ip6' LANGUAGE C IMMUTABLE STRICT;\n\n-- drop/create hash opclass\n\nDO $s$\n  DECLARE\n    r record;\n    opc_oid oid;\n    deps oid[];\n    cmds text[] := NULL;\n    str text;\n    cfgval text := NULL;\n  BEGIN\n    BEGIN\n      cfgval := current_setting('ip4r.update_indexes');\n    EXCEPTION WHEN OTHERS THEN\n      cfgval := NULL;\n    END;\n    IF cfgval NOT IN ('drop','rebuild') THEN\n      cfgval := NULL;\n    END IF;\n    SELECT oid INTO opc_oid\n      FROM pg_opclass\n     WHERE opcname='hash_iprange_ops'\n       AND pg_opclass_is_visible(oid);\n    -- first check for unknown/unexpected dependencies\n    SELECT format('%s object %s depends on hash_iprange_ops with type ''%s''',\n                  classid::regclass, objid, deptype)\n      INTO str\n      FROM pg_depend\n     WHERE refclassid = 'pg_opclass'::regclass\n       AND refobjid = opc_oid\n       AND classid <> 'pg_class'::regclass\n       AND deptype NOT IN ('a','i')\n     LIMIT 1;\n    IF FOUND THEN\n      RAISE EXCEPTION dependent_objects_still_exist USING\n        MESSAGE = 'unexpected dependency on hash opclass',\n\tDETAIL = str;\n    END IF;\n    -- find all dependent tables and indexes\n    deps := ARRAY(SELECT objid FROM pg_depend\n                   WHERE refclassid = 'pg_opclass'::regclass\n\t\t     AND refobjid = opc_oid\n\t\t     AND classid = 'pg_class'::regclass\n\t\t     AND deptype = 'n');\n    IF deps <> '{}' THEN\n      -- we don't expect to find anything except indexes\n      SELECT format('Table %s depends on hash_iprange_ops', oid::regclass)\n        INTO str\n        FROM pg_class\n       WHERE oid = ANY (deps)\n         AND relkind <> 'i';\n      IF FOUND THEN\n        RAISE EXCEPTION dependent_objects_still_exist USING\n          MESSAGE = 'unexpected table dependency on hash opclass',\n\t  DETAIL = str;\n      END IF;\n      -- must be only indexes, as expected\n      IF cfgval IS NULL THEN\n        FOR r IN SELECT ci.relname as indexname,\n\t                n.nspname as schemaname,\n\t\t\tct.relname as tablename\n\t           FROM pg_index i\n\t\t   JOIN pg_class ci ON ci.oid=i.indexrelid\n\t\t   JOIN pg_class ct ON ct.oid=i.indrelid\n\t\t   JOIN pg_namespace n ON n.oid=ct.relnamespace\n\t\t   WHERE i.indexrelid = ANY (deps)\n        LOOP\n\t  RAISE INFO USING\n\t    MESSAGE = format('index %I on table %I.%I depends on hash_iprange_ops',\n\t                     r.indexname, r.schemaname, r.tablename);\n\tEND LOOP;\n        RAISE EXCEPTION dependent_objects_still_exist USING\n          MESSAGE = 'existing indexes depend on hash opclass',\n\t  DETAIL = 'See previous INFO messages for list',\n\t  HINT = 'Use SET ip4r.update_indexes = ''drop'' or ''rebuild'' to process automatically';\n      ELSIF cfgval = 'drop' THEN\n        CREATE SCHEMA ip4r_update_to_2_4;\n\tALTER EXTENSION ip4r DROP SCHEMA ip4r_update_to_2_4;\n\tCREATE TABLE ip4r_update_to_2_4.update_indexes\n\t  AS SELECT ct.oid as table_oid,\n\t            n.nspname as schemaname,\n\t\t    ct.relname as tablename,\n\t\t    ci.relname as indexname,\n\t\t    pg_get_indexdef(ci.oid) as command\n\t       FROM pg_index i\n\t\t    JOIN pg_class ci ON ci.oid=i.indexrelid\n\t\t    JOIN pg_class ct ON ct.oid=i.indrelid\n\t\t    JOIN pg_namespace n ON n.oid=ct.relnamespace\n\t\t    WHERE i.indexrelid = ANY (deps);\n        ALTER EXTENSION ip4r DROP TABLE ip4r_update_to_2_4.update_indexes;\n\tFOR r IN SELECT format('DROP INDEX %s RESTRICT', o::regclass) as cmd\n\t           FROM UNNEST(deps) u(o) LOOP\n          RAISE INFO 'executing %', r.cmd;\n\t  EXECUTE r.cmd;\n\tEND LOOP;\n      ELSIF cfgval = 'rebuild' THEN\n        cmds := '{}';\n\tFOR r IN SELECT format('DROP INDEX %s RESTRICT', o::regclass) as dropcmd,\n\t                pg_get_indexdef(o) as createcmd\n\t           FROM UNNEST(deps) u(o) LOOP\n          RAISE INFO 'executing %', r.dropcmd;\n\t  EXECUTE r.dropcmd;\n\t  cmds := cmds || r.createcmd;\n\tEND LOOP;\n      END IF;\n    END IF;\n    -- have now processed any dependencies, so try the actual drop\n    -- this will error out on the RESTRICT if we somehow missed any\n    -- relevant dependency in our checks.\n    ALTER EXTENSION ip4r DROP OPERATOR CLASS hash_iprange_ops USING hash;\n    DROP OPERATOR CLASS hash_iprange_ops USING hash RESTRICT;\n    CREATE OPERATOR CLASS hash_iprange_ops DEFAULT FOR TYPE iprange USING hash AS\n           OPERATOR 1  = ,\n           FUNCTION 1  iprange_hash(iprange);\n    IF cmds IS NOT NULL THEN\n      FOR r IN SELECT cmd FROM UNNEST(cmds) u(cmd) LOOP\n        -- we rely here on CREATE INDEX not recording a dependency on\n\t-- the extension\n        RAISE INFO 'executing %', r.cmd;\n        EXECUTE r.cmd;\n      END LOOP;\n      RAISE INFO 'index rebuilds completed';\n    ELSIF cfgval = 'drop' AND deps <> '{}' THEN\n      RAISE LOG 'table ip4r_update_to_2_4.update_indexes was created';\n      RAISE INFO 'table ip4r_update_to_2_4.update_indexes was created';\n    END IF;\n  END;\n$s$;\n\nDO $s$\n  DECLARE\n    pg_ver integer := current_setting('server_version_num')::integer;\n    r record;\n  BEGIN\n    IF pg_ver >= 90600 THEN\n      FOR r IN SELECT oid::regprocedure as fsig\n\t\t FROM pg_catalog.pg_proc\n\t\tWHERE (probin = 'MODULE_PATHNAME'\n\t\t       AND prolang = (SELECT oid FROM pg_catalog.pg_language l WHERE l.lanname='c'))\n\t\t   OR (oid in ('family(ip4)'::regprocedure,\n\t\t\t       'family(ip6)'::regprocedure,\n\t\t\t       'family(ip4r)'::regprocedure,\n\t\t\t       'family(ip6r)'::regprocedure))\n      LOOP\n\tEXECUTE format('ALTER FUNCTION %s PARALLEL SAFE', r.fsig);\n      END LOOP;\n    END IF;\n    IF pg_ver >= 110000 THEN\n      FOR r IN SELECT tname\n                 FROM UNNEST(ARRAY['ip4','ip4r',\n                                   'ip6','ip6r',\n                                   'ipaddress','iprange']) u(tname)\n      LOOP\n        EXECUTE format('ALTER OPERATOR FAMILY %I USING hash'\n                       '  ADD FUNCTION 2 %I(%I,bigint)',\n                      format('hash_%s_ops', r.tname),\n                      format('%s_hash_extended', r.tname),\n                      r.tname);\n      END LOOP;\n      ALTER OPERATOR FAMILY btree_ip4_ops USING btree\n        ADD FUNCTION 3 (ip4,bigint) in_range(ip4,ip4,bigint,boolean,boolean);\n      ALTER OPERATOR FAMILY btree_ip4_ops USING btree\n        ADD FUNCTION 3 (ip4,ip4) in_range(ip4,ip4,ip4,boolean,boolean);\n      ALTER OPERATOR FAMILY btree_ip6_ops USING btree\n        ADD FUNCTION 3 (ip6,bigint) in_range(ip6,ip6,bigint,boolean,boolean);\n      ALTER OPERATOR FAMILY btree_ip6_ops USING btree\n        ADD FUNCTION 3 (ip6,ip6) in_range(ip6,ip6,ip6,boolean,boolean);\n    END IF;\n  END;\n$s$;\n\n-- end\n"
  },
  {
    "path": "scripts/ip4r--2.4.sql",
    "content": "-- ip4r extension\n\n-- complain if script is sourced in psql, rather than via CREATE EXTENSION\n\\echo Use \"CREATE EXTENSION ip4r\" to load this file. \\quit\n\n-- ----------------------------------------------------------------------\n-- Type definitions\n\n-- type creation is needlessly chatty\n\nCREATE TYPE ip4;\n\nCREATE FUNCTION ip4_in(cstring) RETURNS ip4 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4_out(ip4) RETURNS cstring AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4_recv(internal) RETURNS ip4 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4_send(ip4) RETURNS bytea AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE TYPE ip4 (\n       INPUT = ip4_in, OUTPUT = ip4_out,\n       RECEIVE = ip4_recv, SEND = ip4_send,\n       INTERNALLENGTH = 4, ALIGNMENT = int4, PASSEDBYVALUE\n);\n\nCOMMENT ON TYPE ip4 IS 'IPv4 address ''#.#.#.#''';\n\nCREATE TYPE ip4r;\n\nCREATE FUNCTION ip4r_in(cstring) RETURNS ip4r AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r_out(ip4r) RETURNS cstring AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r_recv(internal) RETURNS ip4r AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r_send(ip4r) RETURNS bytea AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE TYPE ip4r (\n       INPUT = ip4r_in, OUTPUT = ip4r_out,\n       RECEIVE = ip4r_recv, SEND = ip4r_send,\n       INTERNALLENGTH = 8, ALIGNMENT = int4\n);\n\nCOMMENT ON TYPE ip4r IS 'IPv4 range ''#.#.#.#-#.#.#.#'' or ''#.#.#.#/#'' or ''#.#.#.#''';\n\nCREATE TYPE ip6;\n\nCREATE FUNCTION ip6_in(cstring) RETURNS ip6 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_out(ip6) RETURNS cstring AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_recv(internal) RETURNS ip6 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_send(ip6) RETURNS bytea AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE TYPE ip6 (\n       INPUT = ip6_in, OUTPUT = ip6_out,\n       RECEIVE = ip6_recv, SEND = ip6_send,\n       INTERNALLENGTH = 16, ALIGNMENT = double\n);\n\nCOMMENT ON TYPE ip6 IS 'IPv6 address ''xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx''';\n\nCREATE TYPE ip6r;\n\nCREATE FUNCTION ip6r_in(cstring) RETURNS ip6r AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_out(ip6r) RETURNS cstring AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_recv(internal) RETURNS ip6r AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_send(ip6r) RETURNS bytea AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE TYPE ip6r (\n       INPUT = ip6r_in, OUTPUT = ip6r_out,\n       RECEIVE = ip6r_recv, SEND = ip6r_send,\n       INTERNALLENGTH = 32, ALIGNMENT = double\n);\n\nCOMMENT ON TYPE ip6r IS 'IPv6 range ''#-#'' or ''#/#'' or ''#''';\n\nCREATE TYPE ipaddress;\n\nCREATE FUNCTION ipaddress_in(cstring) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_in' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_out(ipaddress) RETURNS cstring AS 'MODULE_PATHNAME','ipaddr_out' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_recv(internal) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_recv' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_send(ipaddress) RETURNS bytea AS 'MODULE_PATHNAME','ipaddr_send' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE TYPE ipaddress (\n       INPUT = ipaddress_in, OUTPUT = ipaddress_out,\n       RECEIVE = ipaddress_recv, SEND = ipaddress_send,\n       INTERNALLENGTH = VARIABLE, ALIGNMENT = int4, STORAGE = main\n);\n\nCOMMENT ON TYPE ipaddress IS 'IPv4 or IPv6 address';\n\nCREATE TYPE iprange;\n\nCREATE FUNCTION iprange_in(cstring) RETURNS iprange AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_out(iprange) RETURNS cstring AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_recv(internal) RETURNS iprange AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_send(iprange) RETURNS bytea AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE TYPE iprange (\n       INPUT = iprange_in, OUTPUT = iprange_out,\n       RECEIVE = iprange_recv, SEND = iprange_send,\n       INTERNALLENGTH = VARIABLE, ALIGNMENT = int4, STORAGE = main\n);\n\nCOMMENT ON TYPE iprange IS 'IPv4 or IPv6 range';\n\n-- ----------------------------------------------------------------------\n-- Cast functions (inward)\n\nCREATE FUNCTION ip4(bigint) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4(double precision) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_double' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4(numeric) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_numeric' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4(inet) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_inet' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4(text) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4(bit) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4(varbit) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4(bytea) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_bytea' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4(ipaddress) RETURNS ip4 AS 'MODULE_PATHNAME','ipaddr_cast_to_ip4' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION ip6(numeric) RETURNS ip6 AS 'MODULE_PATHNAME','ip6_cast_from_numeric' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6(inet) RETURNS ip6 AS 'MODULE_PATHNAME','ip6_cast_from_inet' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6(text) RETURNS ip6 AS 'MODULE_PATHNAME','ip6_cast_from_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6(bit) RETURNS ip6 AS 'MODULE_PATHNAME','ip6_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6(varbit) RETURNS ip6 AS 'MODULE_PATHNAME','ip6_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6(bytea) RETURNS ip6 AS 'MODULE_PATHNAME','ip6_cast_from_bytea' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6(ipaddress) RETURNS ip6 AS 'MODULE_PATHNAME','ipaddr_cast_to_ip6' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION ipaddress(inet) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_inet' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress(ip4) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress(ip6) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress(text) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress(bit) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress(varbit) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress(bytea) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_bytea' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION ip4r(cidr) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_cast_from_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r(ip4) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_cast_from_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r(text) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_cast_from_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r(varbit) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r(iprange) RETURNS ip4r AS 'MODULE_PATHNAME','iprange_cast_to_ip4r' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION ip6r(cidr) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_cast_from_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r(ip6) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_cast_from_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r(text) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_cast_from_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r(varbit) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_cast_from_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r(iprange) RETURNS ip6r AS 'MODULE_PATHNAME','iprange_cast_to_ip6r' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION iprange(cidr) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange(ip4) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange(ip6) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange(ip4r) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_ip4r' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange(ip6r) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_ip6r' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange(ipaddress) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_ipaddr' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange(text) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_text' LANGUAGE C IMMUTABLE STRICT;\n\n-- ----------------------------------------------------------------------\n-- Cast functions (outward)\n\nCREATE FUNCTION cidr(ip4) RETURNS cidr AS 'MODULE_PATHNAME','ip4_cast_to_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION cidr(ip4r) RETURNS cidr AS 'MODULE_PATHNAME','ip4r_cast_to_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION cidr(ip6) RETURNS cidr AS 'MODULE_PATHNAME','ip6_cast_to_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION cidr(ip6r) RETURNS cidr AS 'MODULE_PATHNAME','ip6r_cast_to_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION cidr(ipaddress) RETURNS cidr AS 'MODULE_PATHNAME','ipaddr_cast_to_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION cidr(iprange) RETURNS cidr AS 'MODULE_PATHNAME','iprange_cast_to_cidr' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION text(ip4) RETURNS text AS 'MODULE_PATHNAME','ip4_cast_to_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION text(ip4r) RETURNS text AS 'MODULE_PATHNAME','ip4r_cast_to_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION text(ip6) RETURNS text AS 'MODULE_PATHNAME','ip6_cast_to_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION text(ip6r) RETURNS text AS 'MODULE_PATHNAME','ip6r_cast_to_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION text(ipaddress) RETURNS text AS 'MODULE_PATHNAME','ipaddr_cast_to_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION text(iprange) RETURNS text AS 'MODULE_PATHNAME','iprange_cast_to_text' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION to_bigint(ip4) RETURNS bigint AS 'MODULE_PATHNAME','ip4_cast_to_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_double(ip4) RETURNS double precision AS 'MODULE_PATHNAME','ip4_cast_to_double' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_numeric(ip4) RETURNS numeric AS 'MODULE_PATHNAME','ip4_cast_to_numeric' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_numeric(ip6) RETURNS numeric AS 'MODULE_PATHNAME','ip6_cast_to_numeric' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_numeric(ipaddress) RETURNS numeric AS 'MODULE_PATHNAME','ipaddr_cast_to_numeric' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bit(ip4) RETURNS varbit AS 'MODULE_PATHNAME','ip4_cast_to_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bit(ip6) RETURNS varbit AS 'MODULE_PATHNAME','ip6_cast_to_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bit(ipaddress) RETURNS varbit AS 'MODULE_PATHNAME','ipaddr_cast_to_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bit(ip4r) RETURNS varbit AS 'MODULE_PATHNAME','ip4r_cast_to_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bit(ip6r) RETURNS varbit AS 'MODULE_PATHNAME','ip6r_cast_to_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bit(iprange) RETURNS varbit AS 'MODULE_PATHNAME','iprange_cast_to_bit' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bytea(ip4) RETURNS bytea AS 'MODULE_PATHNAME','ip4_cast_to_bytea' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bytea(ip6) RETURNS bytea AS 'MODULE_PATHNAME','ip6_cast_to_bytea' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION to_bytea(ipaddress) RETURNS bytea AS 'MODULE_PATHNAME','ipaddr_cast_to_bytea' LANGUAGE C IMMUTABLE STRICT;\n\n-- ----------------------------------------------------------------------\n-- Cast definitions (outward)\n\n-- all these are explicit, with the exception of casts from single-address\n-- types to \"cidr\", which we make assignment casts since they are lossless\n-- and preserve general semantics.\n\nCREATE CAST (ip4 as bigint) WITH FUNCTION to_bigint(ip4);\nCREATE CAST (ip4 as double precision) WITH FUNCTION to_double(ip4);\nCREATE CAST (ip4 as numeric) WITH FUNCTION to_numeric(ip4);\nCREATE CAST (ip4 as varbit) WITH FUNCTION to_bit(ip4);\nCREATE CAST (ip4 as bytea) WITH FUNCTION to_bytea(ip4);\nCREATE CAST (ip4 as text) WITH FUNCTION text(ip4);\n\nCREATE CAST (ip4 as cidr) WITH FUNCTION cidr(ip4) AS ASSIGNMENT;\n\nCREATE CAST (ip4r as cidr) WITH FUNCTION cidr(ip4r);\nCREATE CAST (ip4r as varbit) WITH FUNCTION to_bit(ip4r);\nCREATE CAST (ip4r as text) WITH FUNCTION text(ip4r);\n\nCREATE CAST (ip6 as numeric) WITH FUNCTION to_numeric(ip6);\nCREATE CAST (ip6 as varbit) WITH FUNCTION to_bit(ip6);\nCREATE CAST (ip6 as bytea) WITH FUNCTION to_bytea(ip6);\nCREATE CAST (ip6 as text) WITH FUNCTION text(ip6);\n\nCREATE CAST (ip6 as cidr) WITH FUNCTION cidr(ip6) AS ASSIGNMENT;\n\nCREATE CAST (ip6r as cidr) WITH FUNCTION cidr(ip6r);\nCREATE CAST (ip6r as varbit) WITH FUNCTION to_bit(ip6r);\nCREATE CAST (ip6r as text) WITH FUNCTION text(ip6r);\n\nCREATE CAST (ipaddress as numeric) WITH FUNCTION to_numeric(ipaddress);\nCREATE CAST (ipaddress as varbit) WITH FUNCTION to_bit(ipaddress);\nCREATE CAST (ipaddress as bytea) WITH FUNCTION to_bytea(ipaddress);\nCREATE CAST (ipaddress as text) WITH FUNCTION text(ipaddress);\n\nCREATE CAST (ipaddress as cidr) WITH FUNCTION cidr(ipaddress) AS ASSIGNMENT;\n\nCREATE CAST (iprange as cidr) WITH FUNCTION cidr(iprange);\nCREATE CAST (iprange as varbit) WITH FUNCTION to_bit(iprange);\nCREATE CAST (iprange as text) WITH FUNCTION text(iprange);\n\n-- ----------------------------------------------------------------------\n-- Cast definitions (inward)\n\n-- these are explicit except for casts from inet/cidr types. Even though\n-- such casts are lossy for inet, since the masklen isn't preserved, the\n-- semantics and common usage are enough to justify an assignment cast.\n\nCREATE CAST (text as ip4) WITH FUNCTION ip4(text);\nCREATE CAST (text as ip4r) WITH FUNCTION ip4r(text);\nCREATE CAST (text as ip6) WITH FUNCTION ip6(text);\nCREATE CAST (text as ip6r) WITH FUNCTION ip6r(text);\nCREATE CAST (text as ipaddress) WITH FUNCTION ipaddress(text);\nCREATE CAST (text as iprange) WITH FUNCTION iprange(text);\n\nCREATE CAST (bigint as ip4) WITH FUNCTION ip4(bigint);\nCREATE CAST (double precision as ip4) WITH FUNCTION ip4(double precision);\n\nCREATE CAST (numeric as ip4) WITH FUNCTION ip4(numeric);\nCREATE CAST (numeric as ip6) WITH FUNCTION ip6(numeric);\n\nCREATE CAST (bit as ip4) WITH FUNCTION ip4(bit);\nCREATE CAST (bit as ip6) WITH FUNCTION ip6(bit);\nCREATE CAST (bit as ipaddress) WITH FUNCTION ipaddress(bit);\n\nCREATE CAST (varbit as ip4) WITH FUNCTION ip4(bit);\nCREATE CAST (varbit as ip6) WITH FUNCTION ip6(bit);\nCREATE CAST (varbit as ipaddress) WITH FUNCTION ipaddress(varbit);\nCREATE CAST (varbit as ip4r) WITH FUNCTION ip4r(varbit);\nCREATE CAST (varbit as ip6r) WITH FUNCTION ip6r(varbit);\n\nCREATE CAST (bytea as ip4) WITH FUNCTION ip4(bytea);\nCREATE CAST (bytea as ip6) WITH FUNCTION ip6(bytea);\nCREATE CAST (bytea as ipaddress) WITH FUNCTION ipaddress(bytea);\n\nCREATE CAST (cidr as ip4r) WITH FUNCTION ip4r(cidr) AS ASSIGNMENT;\nCREATE CAST (cidr as ip6r) WITH FUNCTION ip6r(cidr) AS ASSIGNMENT;\nCREATE CAST (cidr as iprange) WITH FUNCTION iprange(cidr) AS ASSIGNMENT;\n\nCREATE CAST (inet as ip4) WITH FUNCTION ip4(inet) AS ASSIGNMENT;\nCREATE CAST (inet as ip6) WITH FUNCTION ip6(inet) AS ASSIGNMENT;\nCREATE CAST (inet as ipaddress) WITH FUNCTION ipaddress(inet) AS ASSIGNMENT;\n\n-- ----------------------------------------------------------------------\n-- Cast definitions (cross-type)\n\n-- the lossless \"upward\" casts are made implict. Downward casts are now\n-- assignment casts.\n\nCREATE CAST (ip4 as ip4r) WITH FUNCTION ip4r(ip4) AS IMPLICIT;\nCREATE CAST (ip4 as ipaddress) WITH FUNCTION ipaddress(ip4) AS IMPLICIT;\nCREATE CAST (ip4 as iprange) WITH FUNCTION iprange(ip4) AS IMPLICIT;\nCREATE CAST (ip4r as iprange) WITH FUNCTION iprange(ip4r) AS IMPLICIT;\n\nCREATE CAST (ip6 as ip6r) WITH FUNCTION ip6r(ip6) AS IMPLICIT;\nCREATE CAST (ip6 as ipaddress) WITH FUNCTION ipaddress(ip6) AS IMPLICIT;\nCREATE CAST (ip6 as iprange) WITH FUNCTION iprange(ip6) AS IMPLICIT;\nCREATE CAST (ip6r as iprange) WITH FUNCTION iprange(ip6r) AS IMPLICIT;\n\nCREATE CAST (ipaddress as iprange) WITH FUNCTION iprange(ipaddress) AS IMPLICIT;\n\nCREATE CAST (ipaddress as ip4) WITH FUNCTION ip4(ipaddress) AS ASSIGNMENT;\nCREATE CAST (ipaddress as ip6) WITH FUNCTION ip6(ipaddress) AS ASSIGNMENT;\n\nCREATE CAST (iprange as ip4r) WITH FUNCTION ip4r(iprange) AS ASSIGNMENT;\nCREATE CAST (iprange as ip6r) WITH FUNCTION ip6r(iprange) AS ASSIGNMENT;\n\n-- ----------------------------------------------------------------------\n-- Constructor functions\n\nCREATE FUNCTION ip4r(ip4,ip4) RETURNS ip4r AS 'MODULE_PATHNAME', 'ip4r_from_ip4s' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r(ip6,ip6) RETURNS ip6r AS 'MODULE_PATHNAME', 'ip6r_from_ip6s' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange(ip4,ip4) RETURNS iprange AS 'MODULE_PATHNAME', 'iprange_from_ip4s' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange(ip6,ip6) RETURNS iprange AS 'MODULE_PATHNAME', 'iprange_from_ip6s' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange(ipaddress,ipaddress) RETURNS iprange AS 'MODULE_PATHNAME', 'iprange_from_ipaddrs' LANGUAGE C IMMUTABLE STRICT;\n\n-- ----------------------------------------------------------------------\n-- Utility functions (no operator equivalent)\n\nCREATE FUNCTION family(ip4) RETURNS integer AS $f$ select 4; $f$ LANGUAGE SQL IMMUTABLE;\nCREATE FUNCTION family(ip4r) RETURNS integer AS $f$ select 4; $f$ LANGUAGE SQL IMMUTABLE;\nCREATE FUNCTION family(ip6) RETURNS integer AS $f$ select 6; $f$ LANGUAGE SQL IMMUTABLE;\nCREATE FUNCTION family(ip6r) RETURNS integer AS $f$ select 6; $f$ LANGUAGE SQL IMMUTABLE;\nCREATE FUNCTION family(ipaddress) RETURNS integer AS 'MODULE_PATHNAME', 'ipaddr_family' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION family(iprange) RETURNS integer AS 'MODULE_PATHNAME', 'iprange_family' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION ip4_netmask(integer) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_netmask' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_netmask(integer) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_netmask' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION is_cidr(ip4r) RETURNS boolean AS 'MODULE_PATHNAME', 'ip4r_is_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION is_cidr(ip6r) RETURNS boolean AS 'MODULE_PATHNAME', 'ip6r_is_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION is_cidr(iprange) RETURNS boolean AS 'MODULE_PATHNAME', 'iprange_is_cidr' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION masklen(ip4r) RETURNS integer AS 'MODULE_PATHNAME','ip4r_prefixlen' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION masklen(ip6r) RETURNS integer AS 'MODULE_PATHNAME','ip6r_prefixlen' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION masklen(iprange) RETURNS integer AS 'MODULE_PATHNAME','iprange_prefixlen' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION lower(ip4r) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4r_lower' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION lower(ip6r) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6r_lower' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION lower(iprange) RETURNS ipaddress AS 'MODULE_PATHNAME', 'iprange_lower' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION upper(ip4r) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4r_upper' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION upper(ip6r) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6r_upper' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION upper(iprange) RETURNS ipaddress AS 'MODULE_PATHNAME', 'iprange_upper' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION ip4_net_lower(ip4,integer) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_net_lower' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_net_lower(ip6,integer) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_net_lower' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_net_lower(ipaddress,integer) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_net_lower' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION ip4_net_upper(ip4,integer) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_net_upper' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_net_upper(ip6,integer) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_net_upper' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_net_upper(ipaddress,integer) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_net_upper' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION ip4r_union(ip4r, ip4r) RETURNS ip4r AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_union(ip6r, ip6r) RETURNS ip6r AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_union(iprange, iprange) RETURNS iprange AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION ip4r_inter(ip4r,ip4r) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_inter' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_inter(ip6r,ip6r) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_inter' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_inter(iprange,iprange) RETURNS iprange AS 'MODULE_PATHNAME','iprange_inter' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION cidr_split(ip4r) RETURNS SETOF ip4r AS 'MODULE_PATHNAME','ip4r_cidr_split' LANGUAGE C IMMUTABLE STRICT ROWS 10;\nCREATE FUNCTION cidr_split(ip6r) RETURNS SETOF ip6r AS 'MODULE_PATHNAME','ip6r_cidr_split' LANGUAGE C IMMUTABLE STRICT ROWS 50;\nCREATE FUNCTION cidr_split(iprange) RETURNS SETOF iprange AS 'MODULE_PATHNAME','iprange_cidr_split' LANGUAGE C IMMUTABLE STRICT ROWS 30;\n\n-- ----------------------------------------------------------------------\n-- Functions with operator equivalents\n\n-- it's intended that either the function form or the operator form be used,\n-- as desired.\n\n-- (ip / len) or (ip / mask)\n\nCREATE FUNCTION ip4r_net_mask(ip4,ip4) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_net_mask' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_net_mask(ip6,ip6) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_net_mask' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_net_mask(ip4,ip4) RETURNS iprange AS 'MODULE_PATHNAME','iprange_net_mask_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_net_mask(ip6,ip6) RETURNS iprange AS 'MODULE_PATHNAME','iprange_net_mask_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_net_mask(ipaddress,ipaddress) RETURNS iprange AS 'MODULE_PATHNAME','iprange_net_mask' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION ip4r_net_prefix(ip4,integer) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_net_prefix' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_net_prefix(ip6,integer) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_net_prefix' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_net_prefix(ip4,integer) RETURNS iprange AS 'MODULE_PATHNAME','iprange_net_prefix_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_net_prefix(ip6,integer) RETURNS iprange AS 'MODULE_PATHNAME','iprange_net_prefix_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_net_prefix(ipaddress,integer) RETURNS iprange AS 'MODULE_PATHNAME','iprange_net_prefix' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR / ( LEFTARG = ip4,       RIGHTARG = ip4,       PROCEDURE = ip4r_net_mask      );\nCREATE OPERATOR / ( LEFTARG = ip6,       RIGHTARG = ip6,       PROCEDURE = ip6r_net_mask      );\nCREATE OPERATOR / ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = iprange_net_mask   );\nCREATE OPERATOR / ( LEFTARG = ip4,       RIGHTARG = integer,   PROCEDURE = ip4r_net_prefix    );\nCREATE OPERATOR / ( LEFTARG = ip6,       RIGHTARG = integer,   PROCEDURE = ip6r_net_prefix    );\nCREATE OPERATOR / ( LEFTARG = ipaddress, RIGHTARG = integer,   PROCEDURE = iprange_net_prefix );\n\n-- @ ipr  (approximate size) or  @@ ipr  (exact size)\n\nCREATE FUNCTION ip4r_size(ip4r) RETURNS double precision AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_size(ip6r) RETURNS double precision AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_size(iprange) RETURNS double precision AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION ip4r_size_exact(ip4r) RETURNS numeric AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_size_exact(ip6r) RETURNS numeric AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_size_exact(iprange) RETURNS numeric AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR @ ( RIGHTARG = ip4r,    PROCEDURE = ip4r_size    );\nCREATE OPERATOR @ ( RIGHTARG = ip6r,    PROCEDURE = ip6r_size    );\nCREATE OPERATOR @ ( RIGHTARG = iprange, PROCEDURE = iprange_size );\n\nCREATE OPERATOR @@ ( RIGHTARG = ip4r,    PROCEDURE = ip4r_size_exact    );\nCREATE OPERATOR @@ ( RIGHTARG = ip6r,    PROCEDURE = ip6r_size_exact    );\nCREATE OPERATOR @@ ( RIGHTARG = iprange, PROCEDURE = iprange_size_exact );\n\n-- ----------------------------------------------------------------------\n-- Operators\n\n-- the function forms of these aren't intended for general use\n\n-- bitwise ops: and (a & b), or (a | b), xor (a # b), not (~a)\n\nCREATE FUNCTION ip4_and(ip4,ip4) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_and' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_and(ip6,ip6) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_and' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_and(ipaddress,ipaddress) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_and' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR & ( LEFTARG = ip4,       RIGHTARG = ip4,        PROCEDURE = ip4_and );\nCREATE OPERATOR & ( LEFTARG = ip6,       RIGHTARG = ip6,        PROCEDURE = ip6_and );\nCREATE OPERATOR & ( LEFTARG = ipaddress, RIGHTARG = ipaddress,  PROCEDURE = ipaddress_and );\n\nCREATE FUNCTION ip4_or(ip4,ip4) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_or' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_or(ip6,ip6) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_or' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_or(ipaddress,ipaddress) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_or' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR | ( LEFTARG = ip4,       RIGHTARG = ip4,        PROCEDURE = ip4_or );\nCREATE OPERATOR | ( LEFTARG = ip6,       RIGHTARG = ip6,        PROCEDURE = ip6_or );\nCREATE OPERATOR | ( LEFTARG = ipaddress, RIGHTARG = ipaddress,  PROCEDURE = ipaddress_or );\n\nCREATE FUNCTION ip4_not(ip4) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_not' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_not(ip6) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_not' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_not(ipaddress) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_not' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR ~ ( RIGHTARG = ip4,       PROCEDURE = ip4_not );\nCREATE OPERATOR ~ ( RIGHTARG = ip6,       PROCEDURE = ip6_not );\nCREATE OPERATOR ~ ( RIGHTARG = ipaddress, PROCEDURE = ipaddress_not );\n\nCREATE FUNCTION ip4_xor(ip4,ip4) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_xor' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_xor(ip6,ip6) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_xor' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_xor(ipaddress,ipaddress) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_xor' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR # ( LEFTARG = ip4,       RIGHTARG = ip4,        PROCEDURE = ip4_xor );\nCREATE OPERATOR # ( LEFTARG = ip6,       RIGHTARG = ip6,        PROCEDURE = ip6_xor );\nCREATE OPERATOR # ( LEFTARG = ipaddress, RIGHTARG = ipaddress,  PROCEDURE = ipaddress_xor );\n\n-- arithmetic ops: (ip + n), (ip - n), (ip - ip) where n is a numeric or integer type\n\nCREATE FUNCTION ip4_plus_bigint(ip4,bigint) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_plus_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4_plus_int(ip4,integer) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_plus_int' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4_plus_numeric(ip4,numeric) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_plus_numeric' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR + ( LEFTARG = ip4, RIGHTARG = bigint,  PROCEDURE = ip4_plus_bigint );\nCREATE OPERATOR + ( LEFTARG = ip4, RIGHTARG = integer, PROCEDURE = ip4_plus_int );\nCREATE OPERATOR + ( LEFTARG = ip4, RIGHTARG = numeric, PROCEDURE = ip4_plus_numeric );\n\nCREATE FUNCTION ip6_plus_bigint(ip6,bigint) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_plus_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_plus_int(ip6,integer) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_plus_int' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_plus_numeric(ip6,numeric) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_plus_numeric' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR + ( LEFTARG = ip6, RIGHTARG = bigint,  PROCEDURE = ip6_plus_bigint );\nCREATE OPERATOR + ( LEFTARG = ip6, RIGHTARG = integer, PROCEDURE = ip6_plus_int );\nCREATE OPERATOR + ( LEFTARG = ip6, RIGHTARG = numeric, PROCEDURE = ip6_plus_numeric );\n\nCREATE FUNCTION ipaddress_plus_bigint(ipaddress,bigint) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_plus_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_plus_int(ipaddress,integer) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_plus_int' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_plus_numeric(ipaddress,numeric) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_plus_numeric' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR + ( LEFTARG = ipaddress, RIGHTARG = bigint,  PROCEDURE = ipaddress_plus_bigint );\nCREATE OPERATOR + ( LEFTARG = ipaddress, RIGHTARG = integer, PROCEDURE = ipaddress_plus_int );\nCREATE OPERATOR + ( LEFTARG = ipaddress, RIGHTARG = numeric, PROCEDURE = ipaddress_plus_numeric );\n\nCREATE FUNCTION ip4_minus_bigint(ip4,bigint) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_minus_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4_minus_int(ip4,integer) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_minus_int' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4_minus_numeric(ip4,numeric) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_minus_numeric' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR - ( LEFTARG = ip4, RIGHTARG = bigint,  PROCEDURE = ip4_minus_bigint );\nCREATE OPERATOR - ( LEFTARG = ip4, RIGHTARG = integer, PROCEDURE = ip4_minus_int );\nCREATE OPERATOR - ( LEFTARG = ip4, RIGHTARG = numeric, PROCEDURE = ip4_minus_numeric );\n\nCREATE FUNCTION ip6_minus_bigint(ip6,bigint) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_minus_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_minus_int(ip6,integer) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_minus_int' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_minus_numeric(ip6,numeric) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_minus_numeric' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR - ( LEFTARG = ip6, RIGHTARG = bigint,  PROCEDURE = ip6_minus_bigint );\nCREATE OPERATOR - ( LEFTARG = ip6, RIGHTARG = integer, PROCEDURE = ip6_minus_int );\nCREATE OPERATOR - ( LEFTARG = ip6, RIGHTARG = numeric, PROCEDURE = ip6_minus_numeric );\n\nCREATE FUNCTION ipaddress_minus_bigint(ipaddress,bigint) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_minus_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_minus_int(ipaddress,integer) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_minus_int' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_minus_numeric(ipaddress,numeric) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_minus_numeric' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR - ( LEFTARG = ipaddress, RIGHTARG = bigint,  PROCEDURE = ipaddress_minus_bigint );\nCREATE OPERATOR - ( LEFTARG = ipaddress, RIGHTARG = integer, PROCEDURE = ipaddress_minus_int );\nCREATE OPERATOR - ( LEFTARG = ipaddress, RIGHTARG = numeric, PROCEDURE = ipaddress_minus_numeric );\n\nCREATE FUNCTION ip4_minus_ip4(ip4,ip4) RETURNS bigint AS 'MODULE_PATHNAME', 'ip4_minus_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_minus_ip6(ip6,ip6) RETURNS numeric AS 'MODULE_PATHNAME', 'ip6_minus_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_minus_ipaddress(ipaddress,ipaddress) RETURNS numeric AS 'MODULE_PATHNAME', 'ipaddr_minus_ipaddr' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR - ( LEFTARG = ip4,       RIGHTARG = ip4,       PROCEDURE = ip4_minus_ip4 );\nCREATE OPERATOR - ( LEFTARG = ip6,       RIGHTARG = ip6,       PROCEDURE = ip6_minus_ip6 );\nCREATE OPERATOR - ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_minus_ipaddress );\n\n-- containment predicates: (a >>= b), (a >> b), (a <<= b), (a << b), (a && b)\n\nCREATE FUNCTION ip4r_contained_by(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_contained_by(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_contained_by(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR <<= ( LEFTARG = ip4r,    RIGHTARG = ip4r,    PROCEDURE = ip4r_contained_by,    COMMUTATOR = '>>=', RESTRICT = contsel, JOIN = contjoinsel );\nCREATE OPERATOR <<= ( LEFTARG = ip6r,    RIGHTARG = ip6r,    PROCEDURE = ip6r_contained_by,    COMMUTATOR = '>>=', RESTRICT = contsel, JOIN = contjoinsel );\nCREATE OPERATOR <<= ( LEFTARG = iprange, RIGHTARG = iprange, PROCEDURE = iprange_contained_by, COMMUTATOR = '>>=', RESTRICT = contsel, JOIN = contjoinsel );\n\nCREATE FUNCTION ip4r_contained_by_strict(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_contained_by_strict(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_contained_by_strict(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR << ( LEFTARG = ip4r,    RIGHTARG = ip4r,    PROCEDURE = ip4r_contained_by_strict,    COMMUTATOR = '>>', RESTRICT = contsel, JOIN = contjoinsel );\nCREATE OPERATOR << ( LEFTARG = ip6r,    RIGHTARG = ip6r,    PROCEDURE = ip6r_contained_by_strict,    COMMUTATOR = '>>', RESTRICT = contsel, JOIN = contjoinsel );\nCREATE OPERATOR << ( LEFTARG = iprange, RIGHTARG = iprange, PROCEDURE = iprange_contained_by_strict, COMMUTATOR = '>>', RESTRICT = contsel, JOIN = contjoinsel );\n\nCREATE FUNCTION ip4r_contains(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_contains(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_contains(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR >>= ( LEFTARG = ip4r,    RIGHTARG = ip4r,    PROCEDURE = ip4r_contains,    COMMUTATOR = '<<=', RESTRICT = contsel, JOIN = contjoinsel );\nCREATE OPERATOR >>= ( LEFTARG = ip6r,    RIGHTARG = ip6r,    PROCEDURE = ip6r_contains,    COMMUTATOR = '<<=', RESTRICT = contsel, JOIN = contjoinsel );\nCREATE OPERATOR >>= ( LEFTARG = iprange, RIGHTARG = iprange, PROCEDURE = iprange_contains, COMMUTATOR = '<<=', RESTRICT = contsel, JOIN = contjoinsel );\n\nCREATE FUNCTION ip4r_contains_strict(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_contains_strict(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_contains_strict(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR >> ( LEFTARG = ip4r,    RIGHTARG = ip4r,    PROCEDURE = ip4r_contains_strict,    COMMUTATOR = '<<', RESTRICT = contsel, JOIN = contjoinsel );\nCREATE OPERATOR >> ( LEFTARG = ip6r,    RIGHTARG = ip6r,    PROCEDURE = ip6r_contains_strict,    COMMUTATOR = '<<', RESTRICT = contsel, JOIN = contjoinsel );\nCREATE OPERATOR >> ( LEFTARG = iprange, RIGHTARG = iprange, PROCEDURE = iprange_contains_strict, COMMUTATOR = '<<', RESTRICT = contsel, JOIN = contjoinsel );\n\nCREATE FUNCTION ip4r_overlaps(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_overlaps(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_overlaps(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR && ( LEFTARG = ip4r,    RIGHTARG = ip4r,    PROCEDURE = ip4r_overlaps,    COMMUTATOR = '&&', RESTRICT = areasel, JOIN = areajoinsel );\nCREATE OPERATOR && ( LEFTARG = ip6r,    RIGHTARG = ip6r,    PROCEDURE = ip6r_overlaps,    COMMUTATOR = '&&', RESTRICT = areasel, JOIN = areajoinsel );\nCREATE OPERATOR && ( LEFTARG = iprange, RIGHTARG = iprange, PROCEDURE = iprange_overlaps, COMMUTATOR = '&&', RESTRICT = areasel, JOIN = areajoinsel );\n\n-- cross-type containment\n-- no operators for these since they seem to do more harm than good. These cases\n-- are handled by implicit casts instead.\n\nCREATE FUNCTION ip4_contained_by(ip4,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4_contained_by(ip4,iprange) RETURNS bool AS 'MODULE_PATHNAME','iprange_ip4_contained_by' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_contained_by(ip6,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_contained_by(ip6,iprange) RETURNS bool AS 'MODULE_PATHNAME','iprange_ip6_contained_by' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_contained_by(ipaddress,iprange) RETURNS bool AS 'MODULE_PATHNAME','iprange_ip_contained_by' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION ip4_contains(ip4r,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_contains(ip6r,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4_contains(iprange,ip4) RETURNS bool AS 'MODULE_PATHNAME','iprange_contains_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_contains(iprange,ip6) RETURNS bool AS 'MODULE_PATHNAME','iprange_contains_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_contains(iprange,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','iprange_contains_ip' LANGUAGE C IMMUTABLE STRICT;\n\n-- btree (strict weak) ordering operators\n-- meaning of < > for ip4 and ip6 is obvious.\n-- for ipaddress, all ip4 addresses are less than all ip6 addresses\n-- for ip4r/ip6r, the order is lexicographic on (lower,upper)\n-- for iprange, the universal range is lowest, then all ip4 ranges, then ip6\n\nCREATE FUNCTION ip4_eq(ip4,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r_eq(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_eq(ip6,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_eq(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_eq(ipaddress,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','ipaddr_eq' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_eq(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR = ( LEFTARG = ip4,  RIGHTARG = ip4,  PROCEDURE = ip4_eq,  COMMUTATOR = '=', NEGATOR = '<>', RESTRICT = eqsel, JOIN = eqjoinsel, SORT1 = '<', SORT2 = '<', HASHES );\nCREATE OPERATOR = ( LEFTARG = ip4r, RIGHTARG = ip4r, PROCEDURE = ip4r_eq, COMMUTATOR = '=', NEGATOR = '<>', RESTRICT = eqsel, JOIN = eqjoinsel, SORT1 = '<', SORT2 = '<', HASHES );\nCREATE OPERATOR = ( LEFTARG = ip6,  RIGHTARG = ip6,  PROCEDURE = ip6_eq,  COMMUTATOR = '=', NEGATOR = '<>', RESTRICT = eqsel, JOIN = eqjoinsel, SORT1 = '<', SORT2 = '<', HASHES );\nCREATE OPERATOR = ( LEFTARG = ip6r, RIGHTARG = ip6r, PROCEDURE = ip6r_eq, COMMUTATOR = '=', NEGATOR = '<>', RESTRICT = eqsel, JOIN = eqjoinsel, SORT1 = '<', SORT2 = '<', HASHES );\nCREATE OPERATOR = ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_eq, COMMUTATOR = '=', NEGATOR = '<>', RESTRICT = eqsel, JOIN = eqjoinsel, SORT1 = '<', SORT2 = '<', HASHES );\nCREATE OPERATOR = ( LEFTARG = iprange,   RIGHTARG = iprange,   PROCEDURE = iprange_eq,   COMMUTATOR = '=', NEGATOR = '<>', RESTRICT = eqsel, JOIN = eqjoinsel, SORT1 = '<', SORT2 = '<', HASHES );\n\nCREATE FUNCTION ip4_ge(ip4,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r_ge(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_ge(ip6,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_ge(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_ge(ipaddress,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','ipaddr_ge' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_ge(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR >= ( LEFTARG = ip4,  RIGHTARG = ip4,  PROCEDURE = ip4_ge,  COMMUTATOR = '<=', NEGATOR = '<', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR >= ( LEFTARG = ip4r, RIGHTARG = ip4r, PROCEDURE = ip4r_ge, COMMUTATOR = '<=', NEGATOR = '<', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR >= ( LEFTARG = ip6,  RIGHTARG = ip6,  PROCEDURE = ip6_ge,  COMMUTATOR = '<=', NEGATOR = '<', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR >= ( LEFTARG = ip6r, RIGHTARG = ip6r, PROCEDURE = ip6r_ge, COMMUTATOR = '<=', NEGATOR = '<', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR >= ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_ge, COMMUTATOR = '<=', NEGATOR = '<', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR >= ( LEFTARG = iprange,   RIGHTARG = iprange,   PROCEDURE = iprange_ge,   COMMUTATOR = '<=', NEGATOR = '<', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\n\nCREATE FUNCTION ip4_gt(ip4,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r_gt(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_gt(ip6,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_gt(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_gt(ipaddress,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','ipaddr_gt' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_gt(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR > ( LEFTARG = ip4,  RIGHTARG = ip4,  PROCEDURE = ip4_gt,  COMMUTATOR = '<', NEGATOR = '<=', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR > ( LEFTARG = ip4r, RIGHTARG = ip4r, PROCEDURE = ip4r_gt, COMMUTATOR = '<', NEGATOR = '<=', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR > ( LEFTARG = ip6,  RIGHTARG = ip6,  PROCEDURE = ip6_gt,  COMMUTATOR = '<', NEGATOR = '<=', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR > ( LEFTARG = ip6r, RIGHTARG = ip6r, PROCEDURE = ip6r_gt, COMMUTATOR = '<', NEGATOR = '<=', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR > ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_gt, COMMUTATOR = '<', NEGATOR = '<=', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR > ( LEFTARG = iprange,   RIGHTARG = iprange,   PROCEDURE = iprange_gt,   COMMUTATOR = '<', NEGATOR = '<=', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\n\nCREATE FUNCTION ip4_le(ip4,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r_le(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_le(ip6,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_le(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_le(ipaddress,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','ipaddr_le' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_le(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR <= ( LEFTARG = ip4,  RIGHTARG = ip4,  PROCEDURE = ip4_le,  COMMUTATOR = '>=', NEGATOR = '>', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR <= ( LEFTARG = ip4r, RIGHTARG = ip4r, PROCEDURE = ip4r_le, COMMUTATOR = '>=', NEGATOR = '>', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR <= ( LEFTARG = ip6,  RIGHTARG = ip6,  PROCEDURE = ip6_le,  COMMUTATOR = '>=', NEGATOR = '>', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR <= ( LEFTARG = ip6r, RIGHTARG = ip6r, PROCEDURE = ip6r_le, COMMUTATOR = '>=', NEGATOR = '>', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR <= ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_le, COMMUTATOR = '>=', NEGATOR = '>', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR <= ( LEFTARG = iprange,   RIGHTARG = iprange,   PROCEDURE = iprange_le,   COMMUTATOR = '>=', NEGATOR = '>', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\n\nCREATE FUNCTION ip4_lt(ip4,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r_lt(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_lt(ip6,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_lt(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_lt(ipaddress,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','ipaddr_lt' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_lt(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR < ( LEFTARG = ip4,  RIGHTARG = ip4,  PROCEDURE = ip4_lt,  COMMUTATOR = '>', NEGATOR = '>=', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR < ( LEFTARG = ip4r, RIGHTARG = ip4r, PROCEDURE = ip4r_lt, COMMUTATOR = '>', NEGATOR = '>=', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR < ( LEFTARG = ip6,  RIGHTARG = ip6,  PROCEDURE = ip6_lt,  COMMUTATOR = '>', NEGATOR = '>=', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR < ( LEFTARG = ip6r, RIGHTARG = ip6r, PROCEDURE = ip6r_lt, COMMUTATOR = '>', NEGATOR = '>=', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR < ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_lt, COMMUTATOR = '>', NEGATOR = '>=', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR < ( LEFTARG = iprange,   RIGHTARG = iprange,   PROCEDURE = iprange_lt,   COMMUTATOR = '>', NEGATOR = '>=', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\n\nCREATE FUNCTION ip4_neq(ip4,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r_neq(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_neq(ip6,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_neq(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_neq(ipaddress,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','ipaddr_neq' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_neq(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR <> ( LEFTARG = ip4,  RIGHTARG = ip4,  PROCEDURE = ip4_neq,  COMMUTATOR = '<>', NEGATOR = '=', RESTRICT = neqsel, JOIN = neqjoinsel );\nCREATE OPERATOR <> ( LEFTARG = ip4r, RIGHTARG = ip4r, PROCEDURE = ip4r_neq, COMMUTATOR = '<>', NEGATOR = '=', RESTRICT = neqsel, JOIN = neqjoinsel );\nCREATE OPERATOR <> ( LEFTARG = ip6,  RIGHTARG = ip6,  PROCEDURE = ip6_neq,  COMMUTATOR = '<>', NEGATOR = '=', RESTRICT = neqsel, JOIN = neqjoinsel );\nCREATE OPERATOR <> ( LEFTARG = ip6r, RIGHTARG = ip6r, PROCEDURE = ip6r_neq, COMMUTATOR = '<>', NEGATOR = '=', RESTRICT = neqsel, JOIN = neqjoinsel );\nCREATE OPERATOR <> ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_neq, COMMUTATOR = '<>', NEGATOR = '=', RESTRICT = neqsel, JOIN = neqjoinsel );\nCREATE OPERATOR <> ( LEFTARG = iprange,   RIGHTARG = iprange,   PROCEDURE = iprange_neq,   COMMUTATOR = '<>', NEGATOR = '=', RESTRICT = neqsel, JOIN = neqjoinsel );\n\n-- ----------------------------------------------------------------------\n-- Btree index\n\nCREATE FUNCTION ip4_cmp(ip4,ip4) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r_cmp(ip4r,ip4r) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_cmp(ip6,ip6) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_cmp(ip6r,ip6r) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_cmp(ipaddress,ipaddress) RETURNS integer AS 'MODULE_PATHNAME','ipaddr_cmp' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_cmp(iprange,iprange) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION in_range(ip4,ip4,bigint,boolean,boolean) RETURNS boolean AS 'MODULE_PATHNAME','ip4_in_range_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION in_range(ip4,ip4,ip4,boolean,boolean) RETURNS boolean AS 'MODULE_PATHNAME','ip4_in_range_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION in_range(ip6,ip6,bigint,boolean,boolean) RETURNS boolean AS 'MODULE_PATHNAME','ip6_in_range_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION in_range(ip6,ip6,ip6,boolean,boolean) RETURNS boolean AS 'MODULE_PATHNAME','ip6_in_range_ip6' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR CLASS btree_ip4_ops DEFAULT FOR TYPE ip4 USING btree AS\n       OPERATOR\t1\t< ,\n       OPERATOR\t2\t<= ,\n       OPERATOR\t3\t= ,\n       OPERATOR\t4\t>= ,\n       OPERATOR\t5\t> ,\n       FUNCTION\t1\tip4_cmp(ip4, ip4);\n\nCREATE OPERATOR CLASS btree_ip4r_ops DEFAULT FOR TYPE ip4r USING btree AS\n       OPERATOR\t1\t< ,\n       OPERATOR\t2\t<= ,\n       OPERATOR\t3\t= ,\n       OPERATOR\t4\t>= ,\n       OPERATOR\t5\t> ,\n       FUNCTION\t1\tip4r_cmp(ip4r, ip4r);\n\nCREATE OPERATOR CLASS btree_ip6_ops DEFAULT FOR TYPE ip6 USING btree AS\n       OPERATOR\t1\t< ,\n       OPERATOR\t2\t<= ,\n       OPERATOR\t3\t= ,\n       OPERATOR\t4\t>= ,\n       OPERATOR\t5\t> ,\n       FUNCTION\t1\tip6_cmp(ip6, ip6);\n\nCREATE OPERATOR CLASS btree_ip6r_ops DEFAULT FOR TYPE ip6r USING btree AS\n       OPERATOR\t1\t< ,\n       OPERATOR\t2\t<= ,\n       OPERATOR\t3\t= ,\n       OPERATOR\t4\t>= ,\n       OPERATOR\t5\t> ,\n       FUNCTION\t1\tip6r_cmp(ip6r, ip6r);\n\nCREATE OPERATOR CLASS btree_ipaddress_ops DEFAULT FOR TYPE ipaddress USING btree AS\n       OPERATOR\t1\t< ,\n       OPERATOR\t2\t<= ,\n       OPERATOR\t3\t= ,\n       OPERATOR\t4\t>= ,\n       OPERATOR\t5\t> ,\n       FUNCTION\t1\tipaddress_cmp(ipaddress, ipaddress);\n\nCREATE OPERATOR CLASS btree_iprange_ops DEFAULT FOR TYPE iprange USING btree AS\n       OPERATOR\t1\t< ,\n       OPERATOR\t2\t<= ,\n       OPERATOR\t3\t= ,\n       OPERATOR\t4\t>= ,\n       OPERATOR\t5\t> ,\n       FUNCTION\t1\tiprange_cmp(iprange, iprange);\n\n-- ----------------------------------------------------------------------\n-- Hash index\n\n-- the hash index definitions are needed for hashagg, hashjoin, hash-distinct, hashsetop\n-- etc. even if no actual hash indexes are used.\n\nCREATE FUNCTION ip4hash(ip4) RETURNS integer AS 'MODULE_PATHNAME', 'ip4hash' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6hash(ip6) RETURNS integer AS 'MODULE_PATHNAME', 'ip6hash' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddresshash(ipaddress) RETURNS integer AS 'MODULE_PATHNAME', 'ipaddr_hash' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4rhash(ip4r) RETURNS integer AS 'MODULE_PATHNAME', 'ip4rhash' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6rhash(ip6r) RETURNS integer AS 'MODULE_PATHNAME', 'ip6rhash' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprangehash(iprange) RETURNS integer AS 'MODULE_PATHNAME', 'iprange_hash' LANGUAGE C IMMUTABLE STRICT;\nCOMMENT ON FUNCTION iprangehash(iprange) IS 'deprecated, obsolete';\nCREATE FUNCTION iprange_hash(iprange) RETURNS integer AS 'MODULE_PATHNAME', 'iprange_hash_new' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE FUNCTION ip4_hash_extended(ip4,bigint) RETURNS bigint AS 'MODULE_PATHNAME', 'ip4_hash_extended' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6_hash_extended(ip6,bigint) RETURNS bigint AS 'MODULE_PATHNAME', 'ip6_hash_extended' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ipaddress_hash_extended(ipaddress,bigint) RETURNS bigint AS 'MODULE_PATHNAME', 'ipaddr_hash_extended' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip4r_hash_extended(ip4r,bigint) RETURNS bigint AS 'MODULE_PATHNAME', 'ip4r_hash_extended' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION ip6r_hash_extended(ip6r,bigint) RETURNS bigint AS 'MODULE_PATHNAME', 'ip6r_hash_extended' LANGUAGE C IMMUTABLE STRICT;\nCREATE FUNCTION iprange_hash_extended(iprange,bigint) RETURNS bigint AS 'MODULE_PATHNAME', 'iprange_hash_extended' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR CLASS hash_ip4_ops DEFAULT FOR TYPE ip4 USING hash AS\n       OPERATOR\t1\t= ,\n       FUNCTION\t1\tip4hash(ip4);\n\nCREATE OPERATOR CLASS hash_ip4r_ops DEFAULT FOR TYPE ip4r USING hash AS\n       OPERATOR\t1\t= ,\n       FUNCTION\t1\tip4rhash(ip4r);\n\nCREATE OPERATOR CLASS hash_ip6_ops DEFAULT FOR TYPE ip6 USING hash AS\n       OPERATOR\t1\t= ,\n       FUNCTION\t1\tip6hash(ip6);\n\nCREATE OPERATOR CLASS hash_ip6r_ops DEFAULT FOR TYPE ip6r USING hash AS\n       OPERATOR\t1\t= ,\n       FUNCTION\t1\tip6rhash(ip6r);\n\nCREATE OPERATOR CLASS hash_ipaddress_ops DEFAULT FOR TYPE ipaddress USING hash AS\n       OPERATOR\t1\t= ,\n       FUNCTION\t1\tipaddresshash(ipaddress);\n\nCREATE OPERATOR CLASS hash_iprange_ops DEFAULT FOR TYPE iprange USING hash AS\n       OPERATOR\t1\t= ,\n       FUNCTION\t1\tiprange_hash(iprange);\n\n-- ----------------------------------------------------------------------\n-- GiST\n\nCREATE FUNCTION gip4r_consistent(internal,ip4r,int2,oid,internal) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gip4r_compress(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gip4r_decompress(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gip4r_penalty(internal,internal,internal) RETURNS internal AS 'MODULE_PATHNAME' LANGUAGE C STRICT;\nCREATE FUNCTION gip4r_picksplit(internal, internal) RETURNS internal AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gip4r_union(internal, internal) RETURNS ip4r AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gip4r_same(ip4r, ip4r, internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gip4r_fetch(internal) RETURNS internal\tAS 'MODULE_PATHNAME' LANGUAGE C;\n\nCREATE FUNCTION gip6r_consistent(internal,ip6r,int2,oid,internal) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gip6r_compress(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gip6r_decompress(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gip6r_penalty(internal,internal,internal) RETURNS internal AS 'MODULE_PATHNAME' LANGUAGE C STRICT;\nCREATE FUNCTION gip6r_picksplit(internal, internal) RETURNS internal AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gip6r_union(internal, internal) RETURNS ip6r AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gip6r_same(ip6r, ip6r, internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gip6r_fetch(internal) RETURNS internal\tAS 'MODULE_PATHNAME' LANGUAGE C;\n\nCREATE FUNCTION gipr_consistent(internal,iprange,int2,oid,internal) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gipr_compress(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gipr_decompress(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gipr_penalty(internal,internal,internal) RETURNS internal AS 'MODULE_PATHNAME' LANGUAGE C STRICT;\nCREATE FUNCTION gipr_picksplit(internal, internal) RETURNS internal AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gipr_union(internal, internal) RETURNS iprange AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gipr_same(iprange, iprange, internal) RETURNS internal\tAS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE FUNCTION gipr_fetch(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\n\nCREATE OPERATOR CLASS gist_ip4r_ops DEFAULT FOR TYPE ip4r USING gist AS\n       OPERATOR\t1\t>>= ,\n       OPERATOR\t2\t<<= ,\n       OPERATOR\t3\t>> ,\n       OPERATOR\t4\t<< ,\n       OPERATOR\t5\t&& ,\n       OPERATOR\t6\t= ,\n       FUNCTION\t1\tgip4r_consistent (internal, ip4r, int2, oid, internal),\n       FUNCTION\t2\tgip4r_union (internal, internal),\n       FUNCTION\t3\tgip4r_compress (internal),\n       FUNCTION\t4\tgip4r_decompress (internal),\n       FUNCTION\t5\tgip4r_penalty (internal, internal, internal),\n       FUNCTION\t6\tgip4r_picksplit (internal, internal),\n       FUNCTION\t7\tgip4r_same (ip4r, ip4r, internal);\n\nCREATE OPERATOR CLASS gist_ip6r_ops DEFAULT FOR TYPE ip6r USING gist AS\n       OPERATOR\t1\t>>= ,\n       OPERATOR\t2\t<<= ,\n       OPERATOR\t3\t>> ,\n       OPERATOR\t4\t<< ,\n       OPERATOR\t5\t&& ,\n       OPERATOR\t6\t= ,\n       FUNCTION\t1\tgip6r_consistent (internal, ip6r, int2, oid, internal),\n       FUNCTION\t2\tgip6r_union (internal, internal),\n       FUNCTION\t3\tgip6r_compress (internal),\n       FUNCTION\t4\tgip6r_decompress (internal),\n       FUNCTION\t5\tgip6r_penalty (internal, internal, internal),\n       FUNCTION\t6\tgip6r_picksplit (internal, internal),\n       FUNCTION\t7\tgip6r_same (ip6r, ip6r, internal);\n\nCREATE OPERATOR CLASS gist_iprange_ops DEFAULT FOR TYPE iprange USING gist AS\n       OPERATOR\t1\t>>= ,\n       OPERATOR\t2\t<<= ,\n       OPERATOR\t3\t>> ,\n       OPERATOR\t4\t<< ,\n       OPERATOR\t5\t&& ,\n       OPERATOR\t6\t= ,\n       FUNCTION\t1\tgipr_consistent (internal, iprange, int2, oid, internal),\n       FUNCTION\t2\tgipr_union (internal, internal),\n       FUNCTION\t3\tgipr_compress (internal),\n       FUNCTION\t4\tgipr_decompress (internal),\n       FUNCTION\t5\tgipr_penalty (internal, internal, internal),\n       FUNCTION\t6\tgipr_picksplit (internal, internal),\n       FUNCTION\t7\tgipr_same (iprange, iprange, internal);\n\nDO $s$\n  DECLARE\n    pg_ver integer := current_setting('server_version_num')::integer;\n    r record;\n  BEGIN\n    IF pg_ver >= 90500 THEN\n      ALTER OPERATOR FAMILY gist_ip4r_ops USING gist ADD\n\t     FUNCTION\t9  (ip4r,ip4r)\tgip4r_fetch (internal);\n      ALTER OPERATOR FAMILY gist_ip6r_ops USING gist ADD\n\t     FUNCTION\t9  (ip6r,ip6r)\tgip6r_fetch (internal);\n      ALTER OPERATOR FAMILY gist_iprange_ops USING gist ADD\n\t     FUNCTION\t9  (iprange,iprange)\tgipr_fetch (internal);\n    END IF;\n    IF pg_ver >= 90600 THEN\n      FOR r IN SELECT oid::regprocedure as fsig\n\t\t FROM pg_catalog.pg_proc\n\t\tWHERE (probin = 'MODULE_PATHNAME'\n\t\t       AND prolang = (SELECT oid FROM pg_catalog.pg_language l WHERE l.lanname='c'))\n\t\t   OR (oid in ('family(ip4)'::regprocedure,\n\t\t\t       'family(ip6)'::regprocedure,\n\t\t\t       'family(ip4r)'::regprocedure,\n\t\t\t       'family(ip6r)'::regprocedure))\n      LOOP\n\tEXECUTE format('ALTER FUNCTION %s PARALLEL SAFE', r.fsig);\n      END LOOP;\n    END IF;\n    IF pg_ver >= 110000 THEN\n      FOR r IN SELECT tname\n\t\t FROM UNNEST(ARRAY['ip4','ip4r',\n\t\t\t\t   'ip6','ip6r',\n\t\t\t\t   'ipaddress','iprange']) u(tname)\n      LOOP\n\tEXECUTE format('ALTER OPERATOR FAMILY %I USING hash'\n\t\t       '  ADD FUNCTION 2 %I(%I,bigint)',\n\t\t       format('hash_%s_ops', r.tname),\n\t\t       format('%s_hash_extended', r.tname),\n\t\t       r.tname);\n      END LOOP;\n      ALTER OPERATOR FAMILY btree_ip4_ops USING btree\n        ADD FUNCTION 3 (ip4,bigint) in_range(ip4,ip4,bigint,boolean,boolean);\n      ALTER OPERATOR FAMILY btree_ip4_ops USING btree\n        ADD FUNCTION 3 (ip4,ip4) in_range(ip4,ip4,ip4,boolean,boolean);\n      ALTER OPERATOR FAMILY btree_ip6_ops USING btree\n        ADD FUNCTION 3 (ip6,bigint) in_range(ip6,ip6,bigint,boolean,boolean);\n      ALTER OPERATOR FAMILY btree_ip6_ops USING btree\n        ADD FUNCTION 3 (ip6,ip6) in_range(ip6,ip6,ip6,boolean,boolean);\n    END IF;\n  END;\n$s$;\n\n-- end\n"
  },
  {
    "path": "scripts/ip4r--unpackaged1--2.0.sql",
    "content": "-- ip4r extension\n\n-- complain if script is sourced in psql, rather than via CREATE EXTENSION\n\\echo Use \"CREATE EXTENSION ip4r\" to load this file. \\quit\n\n-- ---------------------------------------------------------------------- \n-- Type definitions\n\n--CREATE TYPE ip4;\n\nCREATE OR REPLACE FUNCTION ip4_in(cstring) RETURNS ip4 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4_out(ip4) RETURNS cstring AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4_recv(internal) RETURNS ip4 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4_send(ip4) RETURNS bytea AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\n/*\nCREATE TYPE ip4 (\n       INPUT = ip4_in, OUTPUT = ip4_out,\n       RECEIVE = ip4_recv, SEND = ip4_send,\n       INTERNALLENGTH = 4, ALIGNMENT = int4, PASSEDBYVALUE\n);\n*/\n\nALTER EXTENSION ip4r ADD TYPE ip4;\n\nCOMMENT ON TYPE ip4 IS 'IPv4 address ''#.#.#.#''';\n\n--CREATE TYPE ip4r;\n\nCREATE OR REPLACE FUNCTION ip4r_in(cstring) RETURNS ip4r AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4r_out(ip4r) RETURNS cstring AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4r_recv(internal) RETURNS ip4r AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4r_send(ip4r) RETURNS bytea AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\n/*\nCREATE TYPE ip4r (\n       INPUT = ip4r_in, OUTPUT = ip4r_out,\n       RECEIVE = ip4r_recv, SEND = ip4r_send,\n       INTERNALLENGTH = 8, ALIGNMENT = int4\n);\n*/\n\nALTER EXTENSION ip4r ADD TYPE ip4r;\n\nCOMMENT ON TYPE ip4r IS 'IPv4 range ''#.#.#.#-#.#.#.#'' or ''#.#.#.#/#'' or ''#.#.#.#''';\n\nCREATE TYPE ip6;\n\nCREATE OR REPLACE FUNCTION ip6_in(cstring) RETURNS ip6 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_out(ip6) RETURNS cstring AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_recv(internal) RETURNS ip6 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_send(ip6) RETURNS bytea AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE TYPE ip6 (\n       INPUT = ip6_in, OUTPUT = ip6_out,\n       RECEIVE = ip6_recv, SEND = ip6_send,\n       INTERNALLENGTH = 16, ALIGNMENT = double\n);\n\nCOMMENT ON TYPE ip6 IS 'IPv6 address ''xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx''';\n\nCREATE TYPE ip6r;\n\nCREATE OR REPLACE FUNCTION ip6r_in(cstring) RETURNS ip6r AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_out(ip6r) RETURNS cstring AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_recv(internal) RETURNS ip6r AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_send(ip6r) RETURNS bytea AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE TYPE ip6r (\n       INPUT = ip6r_in, OUTPUT = ip6r_out,\n       RECEIVE = ip6r_recv, SEND = ip6r_send,\n       INTERNALLENGTH = 32, ALIGNMENT = double\n);\n\nCOMMENT ON TYPE ip6r IS 'IPv6 range ''#-#'' or ''#/#'' or ''#''';\n\nCREATE TYPE ipaddress;\n\nCREATE OR REPLACE FUNCTION ipaddress_in(cstring) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_in' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_out(ipaddress) RETURNS cstring AS 'MODULE_PATHNAME','ipaddr_out' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_recv(internal) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_recv' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_send(ipaddress) RETURNS bytea AS 'MODULE_PATHNAME','ipaddr_send' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE TYPE ipaddress (\n       INPUT = ipaddress_in, OUTPUT = ipaddress_out,\n       RECEIVE = ipaddress_recv, SEND = ipaddress_send,\n       INTERNALLENGTH = VARIABLE, ALIGNMENT = int4, STORAGE = main\n);\n\nCOMMENT ON TYPE ipaddress IS 'IPv4 or IPv6 address';\n\nCREATE TYPE iprange;\n\nCREATE OR REPLACE FUNCTION iprange_in(cstring) RETURNS iprange AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_out(iprange) RETURNS cstring AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_recv(internal) RETURNS iprange AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_send(iprange) RETURNS bytea AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE TYPE iprange (\n       INPUT = iprange_in, OUTPUT = iprange_out,\n       RECEIVE = iprange_recv, SEND = iprange_send,\n       INTERNALLENGTH = VARIABLE, ALIGNMENT = int4, STORAGE = main\n);\n\nCOMMENT ON TYPE iprange IS 'IPv4 or IPv6 range';\n\n-- ---------------------------------------------------------------------- \n-- Cast functions (inward)\n\nCREATE OR REPLACE FUNCTION ip4(bigint) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4(double precision) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_double' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4(numeric) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_numeric' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4(inet) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_inet' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4(text) RETURNS ip4 AS 'MODULE_PATHNAME','ip4_cast_from_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4(ipaddress) RETURNS ip4 AS 'MODULE_PATHNAME','ipaddr_cast_to_ip4' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION ip6(numeric) RETURNS ip6 AS 'MODULE_PATHNAME','ip6_cast_from_numeric' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6(inet) RETURNS ip6 AS 'MODULE_PATHNAME','ip6_cast_from_inet' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6(text) RETURNS ip6 AS 'MODULE_PATHNAME','ip6_cast_from_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6(ipaddress) RETURNS ip6 AS 'MODULE_PATHNAME','ipaddr_cast_to_ip6' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION ipaddress(inet) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_inet' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress(ip4) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress(ip6) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress(text) RETURNS ipaddress AS 'MODULE_PATHNAME','ipaddr_cast_from_text' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION ip4r(cidr) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_cast_from_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4r(ip4) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_cast_from_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4r(text) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_cast_from_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4r(iprange) RETURNS ip4r AS 'MODULE_PATHNAME','iprange_cast_to_ip4r' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION ip6r(cidr) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_cast_from_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r(ip6) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_cast_from_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r(text) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_cast_from_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r(iprange) RETURNS ip6r AS 'MODULE_PATHNAME','iprange_cast_to_ip6r' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION iprange(cidr) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange(ip4) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange(ip6) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange(ip4r) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_ip4r' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange(ip6r) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_ip6r' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange(ipaddress) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_ipaddr' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange(text) RETURNS iprange AS 'MODULE_PATHNAME','iprange_cast_from_text' LANGUAGE C IMMUTABLE STRICT;\n\n-- ----------------------------------------------------------------------\n-- Cast functions (outward)\n\nCREATE OR REPLACE FUNCTION cidr(ip4) RETURNS cidr AS 'MODULE_PATHNAME','ip4_cast_to_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION cidr(ip4r) RETURNS cidr AS 'MODULE_PATHNAME','ip4r_cast_to_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION cidr(ip6) RETURNS cidr AS 'MODULE_PATHNAME','ip6_cast_to_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION cidr(ip6r) RETURNS cidr AS 'MODULE_PATHNAME','ip6r_cast_to_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION cidr(ipaddress) RETURNS cidr AS 'MODULE_PATHNAME','ipaddr_cast_to_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION cidr(iprange) RETURNS cidr AS 'MODULE_PATHNAME','iprange_cast_to_cidr' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION text(ip4) RETURNS text AS 'MODULE_PATHNAME','ip4_cast_to_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION text(ip4r) RETURNS text AS 'MODULE_PATHNAME','ip4r_cast_to_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION text(ip6) RETURNS text AS 'MODULE_PATHNAME','ip6_cast_to_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION text(ip6r) RETURNS text AS 'MODULE_PATHNAME','ip6r_cast_to_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION text(ipaddress) RETURNS text AS 'MODULE_PATHNAME','ipaddr_cast_to_text' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION text(iprange) RETURNS text AS 'MODULE_PATHNAME','iprange_cast_to_text' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION to_bigint(ip4) RETURNS bigint AS 'MODULE_PATHNAME','ip4_cast_to_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION to_double(ip4) RETURNS double precision AS 'MODULE_PATHNAME','ip4_cast_to_double' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION to_numeric(ip4) RETURNS numeric AS 'MODULE_PATHNAME','ip4_cast_to_numeric' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION to_numeric(ip6) RETURNS numeric AS 'MODULE_PATHNAME','ip6_cast_to_numeric' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION to_numeric(ipaddress) RETURNS numeric AS 'MODULE_PATHNAME','ipaddr_cast_to_numeric' LANGUAGE C IMMUTABLE STRICT;\n\n-- ----------------------------------------------------------------------\n-- Cast definitions (outward)\n\n-- all these are explicit, with the exception of casts from single-address\n-- types to \"cidr\", which we make assignment casts since they are lossless\n-- and preserve general semantics.\n\nALTER EXTENSION ip4r ADD CAST (ip4 as bigint);\nALTER EXTENSION ip4r ADD CAST (ip4 as double precision);\nCREATE CAST (ip4 as numeric) WITH FUNCTION to_numeric(ip4);\nALTER EXTENSION ip4r ADD CAST (ip4 as text);\n\nALTER EXTENSION ip4r ADD CAST (ip4 as cidr);\n\nALTER EXTENSION ip4r ADD CAST (ip4r as cidr);\nALTER EXTENSION ip4r ADD CAST (ip4r as text);\n\nCREATE CAST (ip6 as numeric) WITH FUNCTION to_numeric(ip6);\nCREATE CAST (ip6 as text) WITH FUNCTION text(ip6);\n\nCREATE CAST (ip6 as cidr) WITH FUNCTION cidr(ip6) AS ASSIGNMENT;\n\nCREATE CAST (ip6r as cidr) WITH FUNCTION cidr(ip6r);\nCREATE CAST (ip6r as text) WITH FUNCTION text(ip6r);\n\nCREATE CAST (ipaddress as numeric) WITH FUNCTION to_numeric(ipaddress);\nCREATE CAST (ipaddress as text) WITH FUNCTION text(ipaddress);\n\nCREATE CAST (ipaddress as cidr) WITH FUNCTION cidr(ipaddress) AS ASSIGNMENT;\n\nCREATE CAST (iprange as cidr) WITH FUNCTION cidr(iprange);\nCREATE CAST (iprange as text) WITH FUNCTION text(iprange);\n\n-- ----------------------------------------------------------------------\n-- Cast definitions (inward)\n\n-- these are explicit except for casts from inet/cidr types. Even though\n-- such casts are lossy for inet, since the masklen isn't preserved, the\n-- semantics and common usage are enough to justify an assignment cast.\n\nALTER EXTENSION ip4r ADD CAST (text as ip4);\nALTER EXTENSION ip4r ADD CAST (text as ip4r);\nCREATE CAST (text as ip6) WITH FUNCTION ip6(text);\nCREATE CAST (text as ip6r) WITH FUNCTION ip6r(text);\nCREATE CAST (text as ipaddress) WITH FUNCTION ipaddress(text);\nCREATE CAST (text as iprange) WITH FUNCTION iprange(text);\n\nALTER EXTENSION ip4r ADD CAST (bigint as ip4);\nALTER EXTENSION ip4r ADD CAST (double precision as ip4);\n\nCREATE CAST (numeric as ip4) WITH FUNCTION ip4(numeric);\nCREATE CAST (numeric as ip6) WITH FUNCTION ip6(numeric);\n\nALTER EXTENSION ip4r ADD CAST (cidr as ip4r);\nCREATE CAST (cidr as ip6r) WITH FUNCTION ip6r(cidr) AS ASSIGNMENT;\nCREATE CAST (cidr as iprange) WITH FUNCTION iprange(cidr) AS ASSIGNMENT;\n\nALTER EXTENSION ip4r ADD CAST (inet as ip4);\nCREATE CAST (inet as ip6) WITH FUNCTION ip6(inet) AS ASSIGNMENT;\nCREATE CAST (inet as ipaddress) WITH FUNCTION ipaddress(inet) AS ASSIGNMENT;\n\n-- ----------------------------------------------------------------------\n-- Cast definitions (cross-type)\n\n-- the lossless \"upward\" casts are made implict.\n\nALTER EXTENSION ip4r ADD CAST (ip4 as ip4r);\nCREATE CAST (ip4 as ipaddress) WITH FUNCTION ipaddress(ip4) AS IMPLICIT;\nCREATE CAST (ip4 as iprange) WITH FUNCTION iprange(ip4) AS IMPLICIT;\nCREATE CAST (ip4r as iprange) WITH FUNCTION iprange(ip4r) AS IMPLICIT;\n\nCREATE CAST (ip6 as ip6r) WITH FUNCTION ip6r(ip6) AS IMPLICIT;\nCREATE CAST (ip6 as ipaddress) WITH FUNCTION ipaddress(ip6) AS IMPLICIT;\nCREATE CAST (ip6 as iprange) WITH FUNCTION iprange(ip6) AS IMPLICIT;\nCREATE CAST (ip6r as iprange) WITH FUNCTION iprange(ip6r) AS IMPLICIT;\n\nCREATE CAST (ipaddress as iprange) WITH FUNCTION iprange(ipaddress) AS IMPLICIT;\n\nCREATE CAST (ipaddress as ip4) WITH FUNCTION ip4(ipaddress);\nCREATE CAST (ipaddress as ip6) WITH FUNCTION ip6(ipaddress);\n\nCREATE CAST (iprange as ip4r) WITH FUNCTION ip4r(iprange);\nCREATE CAST (iprange as ip6r) WITH FUNCTION ip6r(iprange);\n\n-- ----------------------------------------------------------------------\n-- Constructor functions\n\nCREATE OR REPLACE FUNCTION ip4r(ip4,ip4) RETURNS ip4r AS 'MODULE_PATHNAME', 'ip4r_from_ip4s' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r(ip6,ip6) RETURNS ip6r AS 'MODULE_PATHNAME', 'ip6r_from_ip6s' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange(ip4,ip4) RETURNS iprange AS 'MODULE_PATHNAME', 'iprange_from_ip4s' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange(ip6,ip6) RETURNS iprange AS 'MODULE_PATHNAME', 'iprange_from_ip6s' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange(ipaddress,ipaddress) RETURNS iprange AS 'MODULE_PATHNAME', 'iprange_from_ipaddrs' LANGUAGE C IMMUTABLE STRICT;\n\n-- ----------------------------------------------------------------------\n-- Utility functions (no operator equivalent)\n\nCREATE OR REPLACE FUNCTION family(ip4) RETURNS integer AS $f$ select 4; $f$ LANGUAGE SQL IMMUTABLE;\nCREATE OR REPLACE FUNCTION family(ip4r) RETURNS integer AS $f$ select 4; $f$ LANGUAGE SQL IMMUTABLE;\nCREATE OR REPLACE FUNCTION family(ip6) RETURNS integer AS $f$ select 6; $f$ LANGUAGE SQL IMMUTABLE;\nCREATE OR REPLACE FUNCTION family(ip6r) RETURNS integer AS $f$ select 6; $f$ LANGUAGE SQL IMMUTABLE;\nCREATE OR REPLACE FUNCTION family(ipaddress) RETURNS integer AS 'MODULE_PATHNAME', 'ipaddr_family' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION family(iprange) RETURNS integer AS 'MODULE_PATHNAME', 'iprange_family' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION ip4_netmask(integer) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_netmask' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_netmask(integer) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_netmask' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION is_cidr(ip4r) RETURNS boolean AS 'MODULE_PATHNAME', 'ip4r_is_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION is_cidr(ip6r) RETURNS boolean AS 'MODULE_PATHNAME', 'ip6r_is_cidr' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION is_cidr(iprange) RETURNS boolean AS 'MODULE_PATHNAME', 'iprange_is_cidr' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION masklen(ip4r) RETURNS integer AS 'MODULE_PATHNAME','ip4r_prefixlen' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION masklen(ip6r) RETURNS integer AS 'MODULE_PATHNAME','ip6r_prefixlen' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION masklen(iprange) RETURNS integer AS 'MODULE_PATHNAME','iprange_prefixlen' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION lower(ip4r) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4r_lower' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION lower(ip6r) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6r_lower' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION lower(iprange) RETURNS ipaddress AS 'MODULE_PATHNAME', 'iprange_lower' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION upper(ip4r) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4r_upper' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION upper(ip6r) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6r_upper' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION upper(iprange) RETURNS ipaddress AS 'MODULE_PATHNAME', 'iprange_upper' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION ip4_net_lower(ip4,integer) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_net_lower' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_net_lower(ip6,integer) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_net_lower' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_net_lower(ipaddress,integer) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_net_lower' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION ip4_net_upper(ip4,integer) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_net_upper' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_net_upper(ip6,integer) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_net_upper' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_net_upper(ipaddress,integer) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_net_upper' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION ip4r_union(ip4r, ip4r) RETURNS ip4r AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_union(ip6r, ip6r) RETURNS ip6r AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_union(iprange, iprange) RETURNS iprange AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION ip4r_inter(ip4r,ip4r) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_inter' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_inter(ip6r,ip6r) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_inter' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_inter(iprange,iprange) RETURNS iprange AS 'MODULE_PATHNAME','iprange_inter' LANGUAGE C IMMUTABLE STRICT;\n\n-- ----------------------------------------------------------------------\n-- Functions with operator equivalents\n\n-- it's intended that either the function form or the operator form be used,\n-- as desired.\n\n-- (ip / len) or (ip / mask)\n\nCREATE OR REPLACE FUNCTION ip4r_net_mask(ip4,ip4) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_net_mask' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_net_mask(ip6,ip6) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_net_mask' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_net_mask(ip4,ip4) RETURNS iprange AS 'MODULE_PATHNAME','iprange_net_mask_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_net_mask(ip6,ip6) RETURNS iprange AS 'MODULE_PATHNAME','iprange_net_mask_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_net_mask(ipaddress,ipaddress) RETURNS iprange AS 'MODULE_PATHNAME','iprange_net_mask' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION ip4r_net_prefix(ip4,integer) RETURNS ip4r AS 'MODULE_PATHNAME','ip4r_net_prefix' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_net_prefix(ip6,integer) RETURNS ip6r AS 'MODULE_PATHNAME','ip6r_net_prefix' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_net_prefix(ip4,integer) RETURNS iprange AS 'MODULE_PATHNAME','iprange_net_prefix_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_net_prefix(ip6,integer) RETURNS iprange AS 'MODULE_PATHNAME','iprange_net_prefix_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_net_prefix(ipaddress,integer) RETURNS iprange AS 'MODULE_PATHNAME','iprange_net_prefix' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR / ( LEFTARG = ip4,       RIGHTARG = ip4,       PROCEDURE = ip4r_net_mask      );\nCREATE OPERATOR / ( LEFTARG = ip6,       RIGHTARG = ip6,       PROCEDURE = ip6r_net_mask      );\nCREATE OPERATOR / ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = iprange_net_mask   );\nCREATE OPERATOR / ( LEFTARG = ip4,       RIGHTARG = integer,   PROCEDURE = ip4r_net_prefix    );\nCREATE OPERATOR / ( LEFTARG = ip6,       RIGHTARG = integer,   PROCEDURE = ip6r_net_prefix    );\nCREATE OPERATOR / ( LEFTARG = ipaddress, RIGHTARG = integer,   PROCEDURE = iprange_net_prefix );\n\n-- @ ipr  (approximate size) or  @@ ipr  (exact size)\n\nCREATE OR REPLACE FUNCTION ip4r_size(ip4r) RETURNS double precision AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_size(ip6r) RETURNS double precision AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_size(iprange) RETURNS double precision AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION ip4r_size_exact(ip4r) RETURNS numeric AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_size_exact(ip6r) RETURNS numeric AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_size_exact(iprange) RETURNS numeric AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR @ ( RIGHTARG = ip4r,    PROCEDURE = ip4r_size    );\nCREATE OPERATOR @ ( RIGHTARG = ip6r,    PROCEDURE = ip6r_size    );\nCREATE OPERATOR @ ( RIGHTARG = iprange, PROCEDURE = iprange_size );\n\nCREATE OPERATOR @@ ( RIGHTARG = ip4r,    PROCEDURE = ip4r_size_exact    );\nCREATE OPERATOR @@ ( RIGHTARG = ip6r,    PROCEDURE = ip6r_size_exact    );\nCREATE OPERATOR @@ ( RIGHTARG = iprange, PROCEDURE = iprange_size_exact );\n\n-- ----------------------------------------------------------------------\n-- Operators\n\n-- the function forms of these aren't intended for general use\n\n-- bitwise ops: and (a & b), or (a | b), xor (a # b), not (~a)\n\nCREATE OR REPLACE FUNCTION ip4_and(ip4,ip4) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_and' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_and(ip6,ip6) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_and' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_and(ipaddress,ipaddress) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_and' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR &(ip4,ip4);\nCREATE OPERATOR & ( LEFTARG = ip6,       RIGHTARG = ip6,        PROCEDURE = ip6_and );\nCREATE OPERATOR & ( LEFTARG = ipaddress, RIGHTARG = ipaddress,  PROCEDURE = ipaddress_and );\n\nCREATE OR REPLACE FUNCTION ip4_or(ip4,ip4) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_or' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_or(ip6,ip6) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_or' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_or(ipaddress,ipaddress) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_or' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR |(ip4,ip4);\nCREATE OPERATOR | ( LEFTARG = ip6,       RIGHTARG = ip6,        PROCEDURE = ip6_or );\nCREATE OPERATOR | ( LEFTARG = ipaddress, RIGHTARG = ipaddress,  PROCEDURE = ipaddress_or );\n\nCREATE OR REPLACE FUNCTION ip4_not(ip4) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_not' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_not(ip6) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_not' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_not(ipaddress) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_not' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR ~(NONE,ip4);\nCREATE OPERATOR ~ ( RIGHTARG = ip6,       PROCEDURE = ip6_not );\nCREATE OPERATOR ~ ( RIGHTARG = ipaddress, PROCEDURE = ipaddress_not );\n\nCREATE OR REPLACE FUNCTION ip4_xor(ip4,ip4) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_xor' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_xor(ip6,ip6) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_xor' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_xor(ipaddress,ipaddress) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_xor' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR #(ip4,ip4);\nCREATE OPERATOR # ( LEFTARG = ip6,       RIGHTARG = ip6,        PROCEDURE = ip6_xor );\nCREATE OPERATOR # ( LEFTARG = ipaddress, RIGHTARG = ipaddress,  PROCEDURE = ipaddress_xor );\n\n-- arithmetic ops: (ip + n), (ip - n), (ip - ip) where n is a numeric or integer type\n\nCREATE OR REPLACE FUNCTION ip4_plus_bigint(ip4,bigint) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_plus_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4_plus_int(ip4,integer) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_plus_int' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4_plus_numeric(ip4,numeric) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_plus_numeric' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR +(ip4,bigint);\nALTER EXTENSION ip4r ADD OPERATOR +(ip4,integer);\nCREATE OPERATOR + ( LEFTARG = ip4, RIGHTARG = numeric, PROCEDURE = ip4_plus_numeric );\n\nCREATE OR REPLACE FUNCTION ip6_plus_bigint(ip6,bigint) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_plus_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_plus_int(ip6,integer) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_plus_int' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_plus_numeric(ip6,numeric) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_plus_numeric' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR + ( LEFTARG = ip6, RIGHTARG = bigint,  PROCEDURE = ip6_plus_bigint );\nCREATE OPERATOR + ( LEFTARG = ip6, RIGHTARG = integer, PROCEDURE = ip6_plus_int );\nCREATE OPERATOR + ( LEFTARG = ip6, RIGHTARG = numeric, PROCEDURE = ip6_plus_numeric );\n\nCREATE OR REPLACE FUNCTION ipaddress_plus_bigint(ipaddress,bigint) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_plus_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_plus_int(ipaddress,integer) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_plus_int' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_plus_numeric(ipaddress,numeric) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_plus_numeric' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR + ( LEFTARG = ipaddress, RIGHTARG = bigint,  PROCEDURE = ipaddress_plus_bigint );\nCREATE OPERATOR + ( LEFTARG = ipaddress, RIGHTARG = integer, PROCEDURE = ipaddress_plus_int );\nCREATE OPERATOR + ( LEFTARG = ipaddress, RIGHTARG = numeric, PROCEDURE = ipaddress_plus_numeric );\n\nCREATE OR REPLACE FUNCTION ip4_minus_bigint(ip4,bigint) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_minus_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4_minus_int(ip4,integer) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_minus_int' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4_minus_numeric(ip4,numeric) RETURNS ip4 AS 'MODULE_PATHNAME', 'ip4_minus_numeric' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR -(ip4,bigint);\nALTER EXTENSION ip4r ADD OPERATOR -(ip4,integer);\nCREATE OPERATOR - ( LEFTARG = ip4, RIGHTARG = numeric, PROCEDURE = ip4_minus_numeric );\n\nCREATE OR REPLACE FUNCTION ip6_minus_bigint(ip6,bigint) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_minus_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_minus_int(ip6,integer) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_minus_int' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_minus_numeric(ip6,numeric) RETURNS ip6 AS 'MODULE_PATHNAME', 'ip6_minus_numeric' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR - ( LEFTARG = ip6, RIGHTARG = bigint,  PROCEDURE = ip6_minus_bigint );\nCREATE OPERATOR - ( LEFTARG = ip6, RIGHTARG = integer, PROCEDURE = ip6_minus_int );\nCREATE OPERATOR - ( LEFTARG = ip6, RIGHTARG = numeric, PROCEDURE = ip6_minus_numeric );\n\nCREATE OR REPLACE FUNCTION ipaddress_minus_bigint(ipaddress,bigint) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_minus_bigint' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_minus_int(ipaddress,integer) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_minus_int' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_minus_numeric(ipaddress,numeric) RETURNS ipaddress AS 'MODULE_PATHNAME', 'ipaddr_minus_numeric' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OPERATOR - ( LEFTARG = ipaddress, RIGHTARG = bigint,  PROCEDURE = ipaddress_minus_bigint );\nCREATE OPERATOR - ( LEFTARG = ipaddress, RIGHTARG = integer, PROCEDURE = ipaddress_minus_int );\nCREATE OPERATOR - ( LEFTARG = ipaddress, RIGHTARG = numeric, PROCEDURE = ipaddress_minus_numeric );\n\nCREATE OR REPLACE FUNCTION ip4_minus_ip4(ip4,ip4) RETURNS bigint AS 'MODULE_PATHNAME', 'ip4_minus_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_minus_ip6(ip6,ip6) RETURNS numeric AS 'MODULE_PATHNAME', 'ip6_minus_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_minus_ipaddress(ipaddress,ipaddress) RETURNS numeric AS 'MODULE_PATHNAME', 'ipaddr_minus_ipaddr' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR -(ip4,ip4);\nCREATE OPERATOR - ( LEFTARG = ip6,       RIGHTARG = ip6,       PROCEDURE = ip6_minus_ip6 );\nCREATE OPERATOR - ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_minus_ipaddress );\n\n-- containment predicates: (a >>= b), (a >> b), (a <<= b), (a << b), (a && b)\n\nCREATE OR REPLACE FUNCTION ip4r_contained_by(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_contained_by(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_contained_by(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR <<=(ip4r,ip4r);\nCREATE OPERATOR <<= ( LEFTARG = ip6r,    RIGHTARG = ip6r,    PROCEDURE = ip6r_contained_by,    COMMUTATOR = '>>=', RESTRICT = contsel, JOIN = contjoinsel );\nCREATE OPERATOR <<= ( LEFTARG = iprange, RIGHTARG = iprange, PROCEDURE = iprange_contained_by, COMMUTATOR = '>>=', RESTRICT = contsel, JOIN = contjoinsel );\n\nCREATE OR REPLACE FUNCTION ip4r_contained_by_strict(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_contained_by_strict(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_contained_by_strict(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR <<(ip4r,ip4r);\nCREATE OPERATOR << ( LEFTARG = ip6r,    RIGHTARG = ip6r,    PROCEDURE = ip6r_contained_by_strict,    COMMUTATOR = '>>', RESTRICT = contsel, JOIN = contjoinsel );\nCREATE OPERATOR << ( LEFTARG = iprange, RIGHTARG = iprange, PROCEDURE = iprange_contained_by_strict, COMMUTATOR = '>>', RESTRICT = contsel, JOIN = contjoinsel );\n\nCREATE OR REPLACE FUNCTION ip4r_contains(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_contains(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_contains(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR >>=(ip4r,ip4r);\nCREATE OPERATOR >>= ( LEFTARG = ip6r,    RIGHTARG = ip6r,    PROCEDURE = ip6r_contains,    COMMUTATOR = '<<=', RESTRICT = contsel, JOIN = contjoinsel );\nCREATE OPERATOR >>= ( LEFTARG = iprange, RIGHTARG = iprange, PROCEDURE = iprange_contains, COMMUTATOR = '<<=', RESTRICT = contsel, JOIN = contjoinsel );\n\nCREATE OR REPLACE FUNCTION ip4r_contains_strict(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_contains_strict(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_contains_strict(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR >>(ip4r,ip4r);\nCREATE OPERATOR >> ( LEFTARG = ip6r,    RIGHTARG = ip6r,    PROCEDURE = ip6r_contains_strict,    COMMUTATOR = '<<', RESTRICT = contsel, JOIN = contjoinsel );\nCREATE OPERATOR >> ( LEFTARG = iprange, RIGHTARG = iprange, PROCEDURE = iprange_contains_strict, COMMUTATOR = '<<', RESTRICT = contsel, JOIN = contjoinsel );\n\nCREATE OR REPLACE FUNCTION ip4r_overlaps(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_overlaps(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_overlaps(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR &&(ip4r,ip4r);\nCREATE OPERATOR && ( LEFTARG = ip6r,    RIGHTARG = ip6r,    PROCEDURE = ip6r_overlaps,    COMMUTATOR = '&&', RESTRICT = areasel, JOIN = areajoinsel );\nCREATE OPERATOR && ( LEFTARG = iprange, RIGHTARG = iprange, PROCEDURE = iprange_overlaps, COMMUTATOR = '&&', RESTRICT = areasel, JOIN = areajoinsel );\n\n-- cross-type containment\n-- no operators for these since they seem to do more harm than good. These cases\n-- are handled by implicit casts instead.\n\nCREATE OR REPLACE FUNCTION ip4_contained_by(ip4,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4_contained_by(ip4,iprange) RETURNS bool AS 'MODULE_PATHNAME','iprange_ip4_contained_by' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_contained_by(ip6,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_contained_by(ip6,iprange) RETURNS bool AS 'MODULE_PATHNAME','iprange_ip6_contained_by' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_contained_by(ipaddress,iprange) RETURNS bool AS 'MODULE_PATHNAME','iprange_ip_contained_by' LANGUAGE C IMMUTABLE STRICT;\n\nCREATE OR REPLACE FUNCTION ip4_contains(ip4r,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_contains(ip6r,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4_contains(iprange,ip4) RETURNS bool AS 'MODULE_PATHNAME','iprange_contains_ip4' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_contains(iprange,ip6) RETURNS bool AS 'MODULE_PATHNAME','iprange_contains_ip6' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_contains(iprange,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','iprange_contains_ip' LANGUAGE C IMMUTABLE STRICT;\n\n-- btree (strict weak) ordering operators\n-- meaning of < > for ip4 and ip6 is obvious.\n-- for ipaddress, all ip4 addresses are less than all ip6 addresses\n-- for ip4r/ip6r, the order is lexicographic on (lower,upper)\n-- for iprange, the universal range is lowest, then all ip4 ranges, then ip6\n\nCREATE OR REPLACE FUNCTION ip4_eq(ip4,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4r_eq(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_eq(ip6,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_eq(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_eq(ipaddress,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','ipaddr_eq' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_eq(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR =(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR =(ip4r,ip4r);\nCREATE OPERATOR = ( LEFTARG = ip6,  RIGHTARG = ip6,  PROCEDURE = ip6_eq,  COMMUTATOR = '=', NEGATOR = '<>', RESTRICT = eqsel, JOIN = eqjoinsel, SORT1 = '<', SORT2 = '<', HASHES );\nCREATE OPERATOR = ( LEFTARG = ip6r, RIGHTARG = ip6r, PROCEDURE = ip6r_eq, COMMUTATOR = '=', NEGATOR = '<>', RESTRICT = eqsel, JOIN = eqjoinsel, SORT1 = '<', SORT2 = '<', HASHES );\nCREATE OPERATOR = ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_eq, COMMUTATOR = '=', NEGATOR = '<>', RESTRICT = eqsel, JOIN = eqjoinsel, SORT1 = '<', SORT2 = '<', HASHES );\nCREATE OPERATOR = ( LEFTARG = iprange,   RIGHTARG = iprange,   PROCEDURE = iprange_eq,   COMMUTATOR = '=', NEGATOR = '<>', RESTRICT = eqsel, JOIN = eqjoinsel, SORT1 = '<', SORT2 = '<', HASHES );\n\nCREATE OR REPLACE FUNCTION ip4_ge(ip4,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4r_ge(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_ge(ip6,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_ge(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_ge(ipaddress,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','ipaddr_ge' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_ge(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR >=(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR >=(ip4r,ip4r);\nCREATE OPERATOR >= ( LEFTARG = ip6,  RIGHTARG = ip6,  PROCEDURE = ip6_ge,  COMMUTATOR = '<=', NEGATOR = '<', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR >= ( LEFTARG = ip6r, RIGHTARG = ip6r, PROCEDURE = ip6r_ge, COMMUTATOR = '<=', NEGATOR = '<', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR >= ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_ge, COMMUTATOR = '<=', NEGATOR = '<', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR >= ( LEFTARG = iprange,   RIGHTARG = iprange,   PROCEDURE = iprange_ge,   COMMUTATOR = '<=', NEGATOR = '<', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\n\nCREATE OR REPLACE FUNCTION ip4_gt(ip4,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4r_gt(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_gt(ip6,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_gt(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_gt(ipaddress,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','ipaddr_gt' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_gt(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR >(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR >(ip4r,ip4r);\nCREATE OPERATOR > ( LEFTARG = ip6,  RIGHTARG = ip6,  PROCEDURE = ip6_gt,  COMMUTATOR = '<', NEGATOR = '<=', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR > ( LEFTARG = ip6r, RIGHTARG = ip6r, PROCEDURE = ip6r_gt, COMMUTATOR = '<', NEGATOR = '<=', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR > ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_gt, COMMUTATOR = '<', NEGATOR = '<=', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\nCREATE OPERATOR > ( LEFTARG = iprange,   RIGHTARG = iprange,   PROCEDURE = iprange_gt,   COMMUTATOR = '<', NEGATOR = '<=', RESTRICT = scalargtsel, JOIN = scalargtjoinsel );\n\nCREATE OR REPLACE FUNCTION ip4_le(ip4,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4r_le(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_le(ip6,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_le(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_le(ipaddress,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','ipaddr_le' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_le(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR <=(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR <=(ip4r,ip4r);\nCREATE OPERATOR <= ( LEFTARG = ip6,  RIGHTARG = ip6,  PROCEDURE = ip6_le,  COMMUTATOR = '>=', NEGATOR = '>', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR <= ( LEFTARG = ip6r, RIGHTARG = ip6r, PROCEDURE = ip6r_le, COMMUTATOR = '>=', NEGATOR = '>', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR <= ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_le, COMMUTATOR = '>=', NEGATOR = '>', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR <= ( LEFTARG = iprange,   RIGHTARG = iprange,   PROCEDURE = iprange_le,   COMMUTATOR = '>=', NEGATOR = '>', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\n\nCREATE OR REPLACE FUNCTION ip4_lt(ip4,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4r_lt(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_lt(ip6,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_lt(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_lt(ipaddress,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','ipaddr_lt' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_lt(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR <(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR <(ip4r,ip4r);\nCREATE OPERATOR < ( LEFTARG = ip6,  RIGHTARG = ip6,  PROCEDURE = ip6_lt,  COMMUTATOR = '>', NEGATOR = '>=', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR < ( LEFTARG = ip6r, RIGHTARG = ip6r, PROCEDURE = ip6r_lt, COMMUTATOR = '>', NEGATOR = '>=', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR < ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_lt, COMMUTATOR = '>', NEGATOR = '>=', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\nCREATE OPERATOR < ( LEFTARG = iprange,   RIGHTARG = iprange,   PROCEDURE = iprange_lt,   COMMUTATOR = '>', NEGATOR = '>=', RESTRICT = scalarltsel, JOIN = scalarltjoinsel );\n\nCREATE OR REPLACE FUNCTION ip4_neq(ip4,ip4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4r_neq(ip4r,ip4r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_neq(ip6,ip6) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_neq(ip6r,ip6r) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_neq(ipaddress,ipaddress) RETURNS bool AS 'MODULE_PATHNAME','ipaddr_neq' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_neq(iprange,iprange) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR <>(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR <>(ip4r,ip4r);\nCREATE OPERATOR <> ( LEFTARG = ip6,  RIGHTARG = ip6,  PROCEDURE = ip6_neq,  COMMUTATOR = '<>', NEGATOR = '=', RESTRICT = neqsel, JOIN = neqjoinsel );\nCREATE OPERATOR <> ( LEFTARG = ip6r, RIGHTARG = ip6r, PROCEDURE = ip6r_neq, COMMUTATOR = '<>', NEGATOR = '=', RESTRICT = neqsel, JOIN = neqjoinsel );\nCREATE OPERATOR <> ( LEFTARG = ipaddress, RIGHTARG = ipaddress, PROCEDURE = ipaddress_neq, COMMUTATOR = '<>', NEGATOR = '=', RESTRICT = neqsel, JOIN = neqjoinsel );\nCREATE OPERATOR <> ( LEFTARG = iprange,   RIGHTARG = iprange,   PROCEDURE = iprange_neq,   COMMUTATOR = '<>', NEGATOR = '=', RESTRICT = neqsel, JOIN = neqjoinsel );\n\n-- ----------------------------------------------------------------------\n-- Btree index\n\nCREATE OR REPLACE FUNCTION ip4_cmp(ip4,ip4) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4r_cmp(ip4r,ip4r) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6_cmp(ip6,ip6) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6r_cmp(ip6r,ip6r) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddress_cmp(ipaddress,ipaddress) RETURNS integer AS 'MODULE_PATHNAME','ipaddr_cmp' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprange_cmp(iprange,iprange) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_ip4_ops USING btree;\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_ip4r_ops USING btree;\n\nCREATE OPERATOR CLASS btree_ip6_ops DEFAULT FOR TYPE ip6 USING btree AS\n       OPERATOR\t1\t< ,\n       OPERATOR\t2\t<= ,\n       OPERATOR\t3\t= ,\n       OPERATOR\t4\t>= ,\n       OPERATOR\t5\t> ,\n       FUNCTION\t1\tip6_cmp(ip6, ip6);\n\nCREATE OPERATOR CLASS btree_ip6r_ops DEFAULT FOR TYPE ip6r USING btree AS\n       OPERATOR\t1\t< ,\n       OPERATOR\t2\t<= ,\n       OPERATOR\t3\t= ,\n       OPERATOR\t4\t>= ,\n       OPERATOR\t5\t> ,\n       FUNCTION\t1\tip6r_cmp(ip6r, ip6r);\n\nCREATE OPERATOR CLASS btree_ipaddress_ops DEFAULT FOR TYPE ipaddress USING btree AS\n       OPERATOR\t1\t< ,\n       OPERATOR\t2\t<= ,\n       OPERATOR\t3\t= ,\n       OPERATOR\t4\t>= ,\n       OPERATOR\t5\t> ,\n       FUNCTION\t1\tipaddress_cmp(ipaddress, ipaddress);\n\nCREATE OPERATOR CLASS btree_iprange_ops DEFAULT FOR TYPE iprange USING btree AS\n       OPERATOR\t1\t< ,\n       OPERATOR\t2\t<= ,\n       OPERATOR\t3\t= ,\n       OPERATOR\t4\t>= ,\n       OPERATOR\t5\t> ,\n       FUNCTION\t1\tiprange_cmp(iprange, iprange);\n\n-- ---------------------------------------------------------------------- \n-- Hash index\n\n-- the hash index definitions are needed for hashagg, hashjoin, hash-distinct, hashsetop\n-- etc. even if no actual hash indexes are used.\n\nCREATE OR REPLACE FUNCTION ip4hash(ip4) RETURNS integer AS 'MODULE_PATHNAME', 'ip4hash' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6hash(ip6) RETURNS integer AS 'MODULE_PATHNAME', 'ip6hash' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ipaddresshash(ipaddress) RETURNS integer AS 'MODULE_PATHNAME', 'ipaddr_hash' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip4rhash(ip4r) RETURNS integer AS 'MODULE_PATHNAME', 'ip4rhash' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION ip6rhash(ip6r) RETURNS integer AS 'MODULE_PATHNAME', 'ip6rhash' LANGUAGE C IMMUTABLE STRICT;\nCREATE OR REPLACE FUNCTION iprangehash(iprange) RETURNS integer AS 'MODULE_PATHNAME', 'iprange_hash' LANGUAGE C IMMUTABLE STRICT;\n\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_ip4_ops USING hash;\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_ip4r_ops USING hash;\n\nCREATE OPERATOR CLASS hash_ip6_ops DEFAULT FOR TYPE ip6 USING hash AS\n       OPERATOR\t1\t= ,\n       FUNCTION\t1\tip6hash(ip6);\n\nCREATE OPERATOR CLASS hash_ip6r_ops DEFAULT FOR TYPE ip6r USING hash AS\n       OPERATOR\t1\t= ,\n       FUNCTION\t1\tip6rhash(ip6r);\n\nCREATE OPERATOR CLASS hash_ipaddress_ops DEFAULT FOR TYPE ipaddress USING hash AS\n       OPERATOR\t1\t= ,\n       FUNCTION\t1\tipaddresshash(ipaddress);\n\nCREATE OPERATOR CLASS hash_iprange_ops DEFAULT FOR TYPE iprange USING hash AS\n       OPERATOR\t1\t= ,\n       FUNCTION\t1\tiprangehash(iprange);\n\n-- ----------------------------------------------------------------------\n-- GiST\n\n-- these type declarations are actually wrong for 8.4+ (which added\n-- more args to consistent) but we ignore that because the access\n-- method code doesn't actually look at the function declaration, and\n-- the differences are handled in the C code. Having the SQL\n-- definition changing is just too much of a pain. \n\nCREATE OR REPLACE FUNCTION gip4r_consistent(internal,ip4r,int4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gip4r_compress(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gip4r_decompress(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gip4r_penalty(internal,internal,internal) RETURNS internal AS 'MODULE_PATHNAME' LANGUAGE C STRICT;\nCREATE OR REPLACE FUNCTION gip4r_picksplit(internal, internal) RETURNS internal AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gip4r_union(internal, internal) RETURNS ip4r AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gip4r_same(ip4r, ip4r, internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\n\nCREATE OR REPLACE FUNCTION gip6r_consistent(internal,ip6r,int4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gip6r_compress(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gip6r_decompress(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gip6r_penalty(internal,internal,internal) RETURNS internal AS 'MODULE_PATHNAME' LANGUAGE C STRICT;\nCREATE OR REPLACE FUNCTION gip6r_picksplit(internal, internal) RETURNS internal AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gip6r_union(internal, internal) RETURNS ip6r AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gip6r_same(ip6r, ip6r, internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\n\nCREATE OR REPLACE FUNCTION gipr_consistent(internal,iprange,int4) RETURNS bool AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gipr_compress(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gipr_decompress(internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gipr_penalty(internal,internal,internal) RETURNS internal AS 'MODULE_PATHNAME' LANGUAGE C STRICT;\nCREATE OR REPLACE FUNCTION gipr_picksplit(internal, internal) RETURNS internal AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gipr_union(internal, internal) RETURNS iprange AS 'MODULE_PATHNAME' LANGUAGE C;\nCREATE OR REPLACE FUNCTION gipr_same(iprange, iprange, internal) RETURNS internal  AS 'MODULE_PATHNAME' LANGUAGE C;\n\nALTER EXTENSION ip4r ADD OPERATOR CLASS gist_ip4r_ops USING gist;\n\nCREATE OPERATOR CLASS gist_ip6r_ops DEFAULT FOR TYPE ip6r USING gist AS\n       OPERATOR\t1\t>>= ,\n       OPERATOR\t2\t<<= ,\n       OPERATOR\t3\t>> ,\n       OPERATOR\t4\t<< ,\n       OPERATOR\t5\t&& ,\n       OPERATOR\t6\t= ,\n       FUNCTION\t1\tgip6r_consistent (internal, ip6r, int4),\n       FUNCTION\t2\tgip6r_union (internal, internal),\n       FUNCTION\t3\tgip6r_compress (internal),\n       FUNCTION\t4\tgip6r_decompress (internal),\n       FUNCTION\t5\tgip6r_penalty (internal, internal, internal),\n       FUNCTION\t6\tgip6r_picksplit (internal, internal),\n       FUNCTION\t7\tgip6r_same (ip6r, ip6r, internal);\n\nCREATE OPERATOR CLASS gist_iprange_ops DEFAULT FOR TYPE iprange USING gist AS\n       OPERATOR\t1\t>>= ,\n       OPERATOR\t2\t<<= ,\n       OPERATOR\t3\t>> ,\n       OPERATOR\t4\t<< ,\n       OPERATOR\t5\t&& ,\n       OPERATOR\t6\t= ,\n       FUNCTION\t1\tgipr_consistent (internal, iprange, int4),\n       FUNCTION\t2\tgipr_union (internal, internal),\n       FUNCTION\t3\tgipr_compress (internal),\n       FUNCTION\t4\tgipr_decompress (internal),\n       FUNCTION\t5\tgipr_penalty (internal, internal, internal),\n       FUNCTION\t6\tgipr_picksplit (internal, internal),\n       FUNCTION\t7\tgipr_same (iprange, iprange, internal);\n\n-- cleanup old cruft\n\nDROP OPERATOR IF EXISTS @(ip4r,ip4r);\nDROP OPERATOR IF EXISTS ~(ip4r,ip4r);\n\nDROP OPERATOR IF EXISTS &<<(ip4r,ip4r);\nDROP OPERATOR IF EXISTS &>>(ip4r,ip4r);\nDROP OPERATOR IF EXISTS <<<(ip4r,ip4r);\nDROP OPERATOR IF EXISTS >>>(ip4r,ip4r);\n\nDROP FUNCTION IF EXISTS ip4r_left_of(ip4r,ip4r);\nDROP FUNCTION IF EXISTS ip4r_left_overlap(ip4r,ip4r);\nDROP FUNCTION IF EXISTS ip4r_right_of(ip4r,ip4r);\nDROP FUNCTION IF EXISTS ip4r_right_overlap(ip4r,ip4r);\n\n-- end \n"
  },
  {
    "path": "scripts/ip4r--unpackaged2.0--2.0.sql",
    "content": "-- ip4r extension\n\n-- complain if script is sourced in psql, rather than via CREATE EXTENSION\n\\echo Use \"CREATE EXTENSION ip4r\" to load this file. \\quit\n\nALTER EXTENSION ip4r ADD FUNCTION ip4_in(cstring);\nALTER EXTENSION ip4r ADD FUNCTION ip4_out(ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4_recv(internal);\nALTER EXTENSION ip4r ADD FUNCTION ip4_send(ip4);\nALTER EXTENSION ip4r ADD TYPE ip4;\nALTER EXTENSION ip4r ADD FUNCTION ip4r_in(cstring);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_out(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_recv(internal);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_send(ip4r);\nALTER EXTENSION ip4r ADD TYPE ip4r;\nALTER EXTENSION ip4r ADD FUNCTION ip6_in(cstring);\nALTER EXTENSION ip4r ADD FUNCTION ip6_out(ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6_recv(internal);\nALTER EXTENSION ip4r ADD FUNCTION ip6_send(ip6);\nALTER EXTENSION ip4r ADD TYPE ip6;\nALTER EXTENSION ip4r ADD FUNCTION ip6r_in(cstring);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_out(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_recv(internal);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_send(ip6r);\nALTER EXTENSION ip4r ADD TYPE ip6r;\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_in(cstring);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_out(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_recv(internal);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_send(ipaddress);\nALTER EXTENSION ip4r ADD TYPE ipaddress;\nALTER EXTENSION ip4r ADD FUNCTION iprange_in(cstring);\nALTER EXTENSION ip4r ADD FUNCTION iprange_out(iprange);\nALTER EXTENSION ip4r ADD FUNCTION iprange_recv(internal);\nALTER EXTENSION ip4r ADD FUNCTION iprange_send(iprange);\nALTER EXTENSION ip4r ADD TYPE iprange;\nALTER EXTENSION ip4r ADD FUNCTION ip4(bigint);\nALTER EXTENSION ip4r ADD FUNCTION ip4(double precision);\nALTER EXTENSION ip4r ADD FUNCTION ip4(numeric);\nALTER EXTENSION ip4r ADD FUNCTION ip4(inet);\nALTER EXTENSION ip4r ADD FUNCTION ip4(text);\nALTER EXTENSION ip4r ADD FUNCTION ip4(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip6(numeric);\nALTER EXTENSION ip4r ADD FUNCTION ip6(inet);\nALTER EXTENSION ip4r ADD FUNCTION ip6(text);\nALTER EXTENSION ip4r ADD FUNCTION ip6(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress(inet);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress(ip4);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress(ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress(text);\nALTER EXTENSION ip4r ADD FUNCTION ip4r(cidr);\nALTER EXTENSION ip4r ADD FUNCTION ip4r(ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r(text);\nALTER EXTENSION ip4r ADD FUNCTION ip4r(iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip6r(cidr);\nALTER EXTENSION ip4r ADD FUNCTION ip6r(ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r(text);\nALTER EXTENSION ip4r ADD FUNCTION ip6r(iprange);\nALTER EXTENSION ip4r ADD FUNCTION iprange(cidr);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ip4);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ip6);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange(text);\nALTER EXTENSION ip4r ADD FUNCTION cidr(ip4);\nALTER EXTENSION ip4r ADD FUNCTION cidr(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION cidr(ip6);\nALTER EXTENSION ip4r ADD FUNCTION cidr(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION cidr(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION cidr(iprange);\nALTER EXTENSION ip4r ADD FUNCTION text(ip4);\nALTER EXTENSION ip4r ADD FUNCTION text(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION text(ip6);\nALTER EXTENSION ip4r ADD FUNCTION text(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION text(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION text(iprange);\nALTER EXTENSION ip4r ADD FUNCTION to_bigint(ip4);\nALTER EXTENSION ip4r ADD FUNCTION to_double(ip4);\nALTER EXTENSION ip4r ADD FUNCTION to_numeric(ip4);\nALTER EXTENSION ip4r ADD FUNCTION to_numeric(ip6);\nALTER EXTENSION ip4r ADD FUNCTION to_numeric(ipaddress);\nALTER EXTENSION ip4r ADD CAST (ip4 as bigint);\nALTER EXTENSION ip4r ADD CAST (ip4 as double precision);\nALTER EXTENSION ip4r ADD CAST (ip4 as numeric);\nALTER EXTENSION ip4r ADD CAST (ip4 as text);\nALTER EXTENSION ip4r ADD CAST (ip4 as cidr);\nALTER EXTENSION ip4r ADD CAST (ip4r as cidr);\nALTER EXTENSION ip4r ADD CAST (ip4r as text);\nALTER EXTENSION ip4r ADD CAST (ip6 as numeric);\nALTER EXTENSION ip4r ADD CAST (ip6 as text);\nALTER EXTENSION ip4r ADD CAST (ip6 as cidr);\nALTER EXTENSION ip4r ADD CAST (ip6r as cidr);\nALTER EXTENSION ip4r ADD CAST (ip6r as text);\nALTER EXTENSION ip4r ADD CAST (ipaddress as numeric);\nALTER EXTENSION ip4r ADD CAST (ipaddress as text);\nALTER EXTENSION ip4r ADD CAST (ipaddress as cidr);\nALTER EXTENSION ip4r ADD CAST (iprange as cidr);\nALTER EXTENSION ip4r ADD CAST (iprange as text);\nALTER EXTENSION ip4r ADD CAST (text as ip4);\nALTER EXTENSION ip4r ADD CAST (text as ip4r);\nALTER EXTENSION ip4r ADD CAST (text as ip6);\nALTER EXTENSION ip4r ADD CAST (text as ip6r);\nALTER EXTENSION ip4r ADD CAST (text as ipaddress);\nALTER EXTENSION ip4r ADD CAST (text as iprange);\nALTER EXTENSION ip4r ADD CAST (bigint as ip4);\nALTER EXTENSION ip4r ADD CAST (double precision as ip4);\nALTER EXTENSION ip4r ADD CAST (numeric as ip4);\nALTER EXTENSION ip4r ADD CAST (numeric as ip6);\nALTER EXTENSION ip4r ADD CAST (cidr as ip4r);\nALTER EXTENSION ip4r ADD CAST (cidr as ip6r);\nALTER EXTENSION ip4r ADD CAST (cidr as iprange);\nALTER EXTENSION ip4r ADD CAST (inet as ip4);\nALTER EXTENSION ip4r ADD CAST (inet as ip6);\nALTER EXTENSION ip4r ADD CAST (inet as ipaddress);\nALTER EXTENSION ip4r ADD CAST (ip4 as ip4r);\nALTER EXTENSION ip4r ADD CAST (ip4 as ipaddress);\nALTER EXTENSION ip4r ADD CAST (ip4 as iprange);\nALTER EXTENSION ip4r ADD CAST (ip4r as iprange);\nALTER EXTENSION ip4r ADD CAST (ip6 as ip6r);\nALTER EXTENSION ip4r ADD CAST (ip6 as ipaddress);\nALTER EXTENSION ip4r ADD CAST (ip6 as iprange);\nALTER EXTENSION ip4r ADD CAST (ip6r as iprange);\nALTER EXTENSION ip4r ADD CAST (ipaddress as iprange);\nALTER EXTENSION ip4r ADD CAST (ipaddress as ip4);\nALTER EXTENSION ip4r ADD CAST (ipaddress as ip6);\nALTER EXTENSION ip4r ADD CAST (iprange as ip4r);\nALTER EXTENSION ip4r ADD CAST (iprange as ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ip4r(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6r(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION family(ip4);\nALTER EXTENSION ip4r ADD FUNCTION family(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION family(ip6);\nALTER EXTENSION ip4r ADD FUNCTION family(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION family(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION family(iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_netmask(integer);\nALTER EXTENSION ip4r ADD FUNCTION ip6_netmask(integer);\nALTER EXTENSION ip4r ADD FUNCTION is_cidr(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION is_cidr(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION is_cidr(iprange);\nALTER EXTENSION ip4r ADD FUNCTION masklen(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION masklen(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION masklen(iprange);\nALTER EXTENSION ip4r ADD FUNCTION lower(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION lower(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION lower(iprange);\nALTER EXTENSION ip4r ADD FUNCTION upper(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION upper(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION upper(iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_net_lower(ip4,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip6_net_lower(ip6,integer);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_net_lower(ipaddress,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip4_net_upper(ip4,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip6_net_upper(ip6,integer);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_net_upper(ipaddress,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_union(ip4r, ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_union(ip6r, ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_union(iprange, iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_inter(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_inter(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_inter(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_net_mask(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_net_mask(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION iprange_net_mask(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION iprange_net_mask(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION iprange_net_mask(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_net_prefix(ip4,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_net_prefix(ip6,integer);\nALTER EXTENSION ip4r ADD FUNCTION iprange_net_prefix(ip4,integer);\nALTER EXTENSION ip4r ADD FUNCTION iprange_net_prefix(ip6,integer);\nALTER EXTENSION ip4r ADD FUNCTION iprange_net_prefix(ipaddress,integer);\nALTER EXTENSION ip4r ADD OPERATOR /(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR /(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR /(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR /(ip4,integer);\nALTER EXTENSION ip4r ADD OPERATOR /(ip6,integer);\nALTER EXTENSION ip4r ADD OPERATOR /(ipaddress,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_size(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_size(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_size(iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_size_exact(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_size_exact(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_size_exact(iprange);\nALTER EXTENSION ip4r ADD OPERATOR @(NONE,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR @(NONE,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR @(NONE,iprange);\nALTER EXTENSION ip4r ADD OPERATOR @@(NONE,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR @@(NONE,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR @@(NONE,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_and(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_and(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_and(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR &(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR &(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR &(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4_or(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_or(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_or(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR |(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR |(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR |(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4_not(ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_not(ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_not(ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR ~(NONE,ip4);\nALTER EXTENSION ip4r ADD OPERATOR ~(NONE,ip6);\nALTER EXTENSION ip4r ADD OPERATOR ~(NONE,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4_xor(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_xor(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_xor(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR #(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR #(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR #(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4_plus_bigint(ip4,bigint);\nALTER EXTENSION ip4r ADD FUNCTION ip4_plus_int(ip4,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip4_plus_numeric(ip4,numeric);\nALTER EXTENSION ip4r ADD OPERATOR +(ip4,bigint);\nALTER EXTENSION ip4r ADD OPERATOR +(ip4,integer);\nALTER EXTENSION ip4r ADD OPERATOR +(ip4,numeric);\nALTER EXTENSION ip4r ADD FUNCTION ip6_plus_bigint(ip6,bigint);\nALTER EXTENSION ip4r ADD FUNCTION ip6_plus_int(ip6,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip6_plus_numeric(ip6,numeric);\nALTER EXTENSION ip4r ADD OPERATOR +(ip6,bigint);\nALTER EXTENSION ip4r ADD OPERATOR +(ip6,integer);\nALTER EXTENSION ip4r ADD OPERATOR +(ip6,numeric);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_plus_bigint(ipaddress,bigint);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_plus_int(ipaddress,integer);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_plus_numeric(ipaddress,numeric);\nALTER EXTENSION ip4r ADD OPERATOR +(ipaddress,bigint);\nALTER EXTENSION ip4r ADD OPERATOR +(ipaddress,integer);\nALTER EXTENSION ip4r ADD OPERATOR +(ipaddress,numeric);\nALTER EXTENSION ip4r ADD FUNCTION ip4_minus_bigint(ip4,bigint);\nALTER EXTENSION ip4r ADD FUNCTION ip4_minus_int(ip4,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip4_minus_numeric(ip4,numeric);\nALTER EXTENSION ip4r ADD OPERATOR -(ip4,bigint);\nALTER EXTENSION ip4r ADD OPERATOR -(ip4,integer);\nALTER EXTENSION ip4r ADD OPERATOR -(ip4,numeric);\nALTER EXTENSION ip4r ADD FUNCTION ip6_minus_bigint(ip6,bigint);\nALTER EXTENSION ip4r ADD FUNCTION ip6_minus_int(ip6,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip6_minus_numeric(ip6,numeric);\nALTER EXTENSION ip4r ADD OPERATOR -(ip6,bigint);\nALTER EXTENSION ip4r ADD OPERATOR -(ip6,integer);\nALTER EXTENSION ip4r ADD OPERATOR -(ip6,numeric);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_minus_bigint(ipaddress,bigint);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_minus_int(ipaddress,integer);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_minus_numeric(ipaddress,numeric);\nALTER EXTENSION ip4r ADD OPERATOR -(ipaddress,bigint);\nALTER EXTENSION ip4r ADD OPERATOR -(ipaddress,integer);\nALTER EXTENSION ip4r ADD OPERATOR -(ipaddress,numeric);\nALTER EXTENSION ip4r ADD FUNCTION ip4_minus_ip4(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_minus_ip6(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_minus_ipaddress(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR -(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR -(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR -(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_contained_by(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_contained_by(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_contained_by(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR <<=(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR <<=(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR <<=(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_contained_by_strict(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_contained_by_strict(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_contained_by_strict(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR <<(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR <<(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR <<(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_contains(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_contains(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_contains(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR >>=(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR >>=(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR >>=(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_contains_strict(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_contains_strict(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_contains_strict(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR >>(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR >>(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR >>(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_overlaps(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_overlaps(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_overlaps(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR &&(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR &&(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR &&(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_contained_by(ip4,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip4_contained_by(ip4,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip6_contained_by(ip6,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_contained_by(ip6,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_contained_by(ipaddress,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_contains(ip4r,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_contains(ip6r,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip4_contains(iprange,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_contains(iprange,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_contains(iprange,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4_eq(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_eq(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_eq(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_eq(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_eq(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_eq(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR =(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR =(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR =(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR =(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR =(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR =(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_ge(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_ge(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_ge(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_ge(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_ge(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_ge(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR >=(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR >=(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR >=(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR >=(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR >=(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR >=(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_gt(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_gt(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_gt(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_gt(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_gt(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_gt(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR >(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR >(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR >(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR >(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR >(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR >(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_le(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_le(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_le(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_le(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_le(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_le(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR <=(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR <=(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR <=(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR <=(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR <=(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR <=(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_lt(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_lt(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_lt(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_lt(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_lt(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_lt(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR <(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR <(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR <(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR <(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR <(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR <(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_neq(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_neq(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_neq(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_neq(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_neq(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_neq(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR <>(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR <>(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR <>(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR <>(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR <>(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR <>(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_cmp(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_cmp(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_cmp(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_cmp(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_cmp(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_cmp(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_ip4_ops USING btree;\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_ip4r_ops USING btree;\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_ip6_ops USING btree;\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_ip6r_ops USING btree;\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_ipaddress_ops USING btree;\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_iprange_ops USING btree;\nALTER EXTENSION ip4r ADD FUNCTION ip4hash(ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6hash(ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddresshash(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4rhash(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6rhash(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprangehash(iprange);\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_ip4_ops USING hash;\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_ip4r_ops USING hash;\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_ip6_ops USING hash;\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_ip6r_ops USING hash;\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_ipaddress_ops USING hash;\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_iprange_ops USING hash;\nALTER EXTENSION ip4r ADD FUNCTION gip4r_consistent(internal,ip4r,int4);\nALTER EXTENSION ip4r ADD FUNCTION gip4r_compress(internal);\nALTER EXTENSION ip4r ADD FUNCTION gip4r_decompress(internal);\nALTER EXTENSION ip4r ADD FUNCTION gip4r_penalty(internal,internal,internal);\nALTER EXTENSION ip4r ADD FUNCTION gip4r_picksplit(internal, internal);\nALTER EXTENSION ip4r ADD FUNCTION gip4r_union(internal, internal);\nALTER EXTENSION ip4r ADD FUNCTION gip4r_same(ip4r, ip4r, internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_consistent(internal,ip6r,int4);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_compress(internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_decompress(internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_penalty(internal,internal,internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_picksplit(internal, internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_union(internal, internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_same(ip6r, ip6r, internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_consistent(internal,iprange,int4);\nALTER EXTENSION ip4r ADD FUNCTION gipr_compress(internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_decompress(internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_penalty(internal,internal,internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_picksplit(internal, internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_union(internal, internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_same(iprange, iprange, internal);\nALTER EXTENSION ip4r ADD OPERATOR CLASS gist_ip4r_ops USING gist;\nALTER EXTENSION ip4r ADD OPERATOR CLASS gist_ip6r_ops USING gist;\nALTER EXTENSION ip4r ADD OPERATOR CLASS gist_iprange_ops USING gist;\n\n-- end\n"
  },
  {
    "path": "scripts/ip4r--unpackaged2.1--2.1.sql",
    "content": "-- ip4r extension\n\n-- complain if script is sourced in psql, rather than via CREATE EXTENSION\n\\echo Use \"CREATE EXTENSION ip4r\" to load this file. \\quit\n\nALTER EXTENSION ip4r ADD FUNCTION ip4_in(cstring);\nALTER EXTENSION ip4r ADD FUNCTION ip4_out(ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4_recv(internal);\nALTER EXTENSION ip4r ADD FUNCTION ip4_send(ip4);\nALTER EXTENSION ip4r ADD TYPE ip4;\nALTER EXTENSION ip4r ADD FUNCTION ip4r_in(cstring);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_out(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_recv(internal);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_send(ip4r);\nALTER EXTENSION ip4r ADD TYPE ip4r;\nALTER EXTENSION ip4r ADD FUNCTION ip6_in(cstring);\nALTER EXTENSION ip4r ADD FUNCTION ip6_out(ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6_recv(internal);\nALTER EXTENSION ip4r ADD FUNCTION ip6_send(ip6);\nALTER EXTENSION ip4r ADD TYPE ip6;\nALTER EXTENSION ip4r ADD FUNCTION ip6r_in(cstring);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_out(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_recv(internal);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_send(ip6r);\nALTER EXTENSION ip4r ADD TYPE ip6r;\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_in(cstring);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_out(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_recv(internal);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_send(ipaddress);\nALTER EXTENSION ip4r ADD TYPE ipaddress;\nALTER EXTENSION ip4r ADD FUNCTION iprange_in(cstring);\nALTER EXTENSION ip4r ADD FUNCTION iprange_out(iprange);\nALTER EXTENSION ip4r ADD FUNCTION iprange_recv(internal);\nALTER EXTENSION ip4r ADD FUNCTION iprange_send(iprange);\nALTER EXTENSION ip4r ADD TYPE iprange;\nALTER EXTENSION ip4r ADD FUNCTION ip4(bigint);\nALTER EXTENSION ip4r ADD FUNCTION ip4(double precision);\nALTER EXTENSION ip4r ADD FUNCTION ip4(numeric);\nALTER EXTENSION ip4r ADD FUNCTION ip4(inet);\nALTER EXTENSION ip4r ADD FUNCTION ip4(text);\nALTER EXTENSION ip4r ADD FUNCTION ip4(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip6(numeric);\nALTER EXTENSION ip4r ADD FUNCTION ip6(inet);\nALTER EXTENSION ip4r ADD FUNCTION ip6(text);\nALTER EXTENSION ip4r ADD FUNCTION ip6(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress(inet);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress(ip4);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress(ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress(text);\nALTER EXTENSION ip4r ADD FUNCTION ip4r(cidr);\nALTER EXTENSION ip4r ADD FUNCTION ip4r(ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r(text);\nALTER EXTENSION ip4r ADD FUNCTION ip4r(iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip6r(cidr);\nALTER EXTENSION ip4r ADD FUNCTION ip6r(ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r(text);\nALTER EXTENSION ip4r ADD FUNCTION ip6r(iprange);\nALTER EXTENSION ip4r ADD FUNCTION iprange(cidr);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ip4);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ip6);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange(text);\nALTER EXTENSION ip4r ADD FUNCTION cidr(ip4);\nALTER EXTENSION ip4r ADD FUNCTION cidr(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION cidr(ip6);\nALTER EXTENSION ip4r ADD FUNCTION cidr(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION cidr(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION cidr(iprange);\nALTER EXTENSION ip4r ADD FUNCTION text(ip4);\nALTER EXTENSION ip4r ADD FUNCTION text(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION text(ip6);\nALTER EXTENSION ip4r ADD FUNCTION text(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION text(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION text(iprange);\nALTER EXTENSION ip4r ADD FUNCTION to_bigint(ip4);\nALTER EXTENSION ip4r ADD FUNCTION to_double(ip4);\nALTER EXTENSION ip4r ADD FUNCTION to_numeric(ip4);\nALTER EXTENSION ip4r ADD FUNCTION to_numeric(ip6);\nALTER EXTENSION ip4r ADD FUNCTION to_numeric(ipaddress);\nALTER EXTENSION ip4r ADD CAST (ip4 as bigint);\nALTER EXTENSION ip4r ADD CAST (ip4 as double precision);\nALTER EXTENSION ip4r ADD CAST (ip4 as numeric);\nALTER EXTENSION ip4r ADD CAST (ip4 as text);\nALTER EXTENSION ip4r ADD CAST (ip4 as cidr);\nALTER EXTENSION ip4r ADD CAST (ip4r as cidr);\nALTER EXTENSION ip4r ADD CAST (ip4r as text);\nALTER EXTENSION ip4r ADD CAST (ip6 as numeric);\nALTER EXTENSION ip4r ADD CAST (ip6 as text);\nALTER EXTENSION ip4r ADD CAST (ip6 as cidr);\nALTER EXTENSION ip4r ADD CAST (ip6r as cidr);\nALTER EXTENSION ip4r ADD CAST (ip6r as text);\nALTER EXTENSION ip4r ADD CAST (ipaddress as numeric);\nALTER EXTENSION ip4r ADD CAST (ipaddress as text);\nALTER EXTENSION ip4r ADD CAST (ipaddress as cidr);\nALTER EXTENSION ip4r ADD CAST (iprange as cidr);\nALTER EXTENSION ip4r ADD CAST (iprange as text);\nALTER EXTENSION ip4r ADD CAST (text as ip4);\nALTER EXTENSION ip4r ADD CAST (text as ip4r);\nALTER EXTENSION ip4r ADD CAST (text as ip6);\nALTER EXTENSION ip4r ADD CAST (text as ip6r);\nALTER EXTENSION ip4r ADD CAST (text as ipaddress);\nALTER EXTENSION ip4r ADD CAST (text as iprange);\nALTER EXTENSION ip4r ADD CAST (bigint as ip4);\nALTER EXTENSION ip4r ADD CAST (double precision as ip4);\nALTER EXTENSION ip4r ADD CAST (numeric as ip4);\nALTER EXTENSION ip4r ADD CAST (numeric as ip6);\nALTER EXTENSION ip4r ADD CAST (cidr as ip4r);\nALTER EXTENSION ip4r ADD CAST (cidr as ip6r);\nALTER EXTENSION ip4r ADD CAST (cidr as iprange);\nALTER EXTENSION ip4r ADD CAST (inet as ip4);\nALTER EXTENSION ip4r ADD CAST (inet as ip6);\nALTER EXTENSION ip4r ADD CAST (inet as ipaddress);\nALTER EXTENSION ip4r ADD CAST (ip4 as ip4r);\nALTER EXTENSION ip4r ADD CAST (ip4 as ipaddress);\nALTER EXTENSION ip4r ADD CAST (ip4 as iprange);\nALTER EXTENSION ip4r ADD CAST (ip4r as iprange);\nALTER EXTENSION ip4r ADD CAST (ip6 as ip6r);\nALTER EXTENSION ip4r ADD CAST (ip6 as ipaddress);\nALTER EXTENSION ip4r ADD CAST (ip6 as iprange);\nALTER EXTENSION ip4r ADD CAST (ip6r as iprange);\nALTER EXTENSION ip4r ADD CAST (ipaddress as iprange);\nALTER EXTENSION ip4r ADD CAST (ipaddress as ip4);\nALTER EXTENSION ip4r ADD CAST (ipaddress as ip6);\nALTER EXTENSION ip4r ADD CAST (iprange as ip4r);\nALTER EXTENSION ip4r ADD CAST (iprange as ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ip4r(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6r(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION iprange(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION family(ip4);\nALTER EXTENSION ip4r ADD FUNCTION family(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION family(ip6);\nALTER EXTENSION ip4r ADD FUNCTION family(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION family(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION family(iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_netmask(integer);\nALTER EXTENSION ip4r ADD FUNCTION ip6_netmask(integer);\nALTER EXTENSION ip4r ADD FUNCTION is_cidr(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION is_cidr(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION is_cidr(iprange);\nALTER EXTENSION ip4r ADD FUNCTION masklen(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION masklen(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION masklen(iprange);\nALTER EXTENSION ip4r ADD FUNCTION lower(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION lower(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION lower(iprange);\nALTER EXTENSION ip4r ADD FUNCTION upper(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION upper(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION upper(iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_net_lower(ip4,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip6_net_lower(ip6,integer);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_net_lower(ipaddress,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip4_net_upper(ip4,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip6_net_upper(ip6,integer);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_net_upper(ipaddress,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_union(ip4r, ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_union(ip6r, ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_union(iprange, iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_inter(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_inter(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_inter(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_net_mask(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_net_mask(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION iprange_net_mask(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION iprange_net_mask(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION iprange_net_mask(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_net_prefix(ip4,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_net_prefix(ip6,integer);\nALTER EXTENSION ip4r ADD FUNCTION iprange_net_prefix(ip4,integer);\nALTER EXTENSION ip4r ADD FUNCTION iprange_net_prefix(ip6,integer);\nALTER EXTENSION ip4r ADD FUNCTION iprange_net_prefix(ipaddress,integer);\nALTER EXTENSION ip4r ADD OPERATOR /(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR /(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR /(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR /(ip4,integer);\nALTER EXTENSION ip4r ADD OPERATOR /(ip6,integer);\nALTER EXTENSION ip4r ADD OPERATOR /(ipaddress,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_size(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_size(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_size(iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_size_exact(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_size_exact(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_size_exact(iprange);\nALTER EXTENSION ip4r ADD OPERATOR @(NONE,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR @(NONE,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR @(NONE,iprange);\nALTER EXTENSION ip4r ADD OPERATOR @@(NONE,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR @@(NONE,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR @@(NONE,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_and(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_and(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_and(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR &(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR &(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR &(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4_or(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_or(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_or(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR |(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR |(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR |(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4_not(ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_not(ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_not(ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR ~(NONE,ip4);\nALTER EXTENSION ip4r ADD OPERATOR ~(NONE,ip6);\nALTER EXTENSION ip4r ADD OPERATOR ~(NONE,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4_xor(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_xor(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_xor(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR #(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR #(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR #(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4_plus_bigint(ip4,bigint);\nALTER EXTENSION ip4r ADD FUNCTION ip4_plus_int(ip4,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip4_plus_numeric(ip4,numeric);\nALTER EXTENSION ip4r ADD OPERATOR +(ip4,bigint);\nALTER EXTENSION ip4r ADD OPERATOR +(ip4,integer);\nALTER EXTENSION ip4r ADD OPERATOR +(ip4,numeric);\nALTER EXTENSION ip4r ADD FUNCTION ip6_plus_bigint(ip6,bigint);\nALTER EXTENSION ip4r ADD FUNCTION ip6_plus_int(ip6,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip6_plus_numeric(ip6,numeric);\nALTER EXTENSION ip4r ADD OPERATOR +(ip6,bigint);\nALTER EXTENSION ip4r ADD OPERATOR +(ip6,integer);\nALTER EXTENSION ip4r ADD OPERATOR +(ip6,numeric);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_plus_bigint(ipaddress,bigint);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_plus_int(ipaddress,integer);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_plus_numeric(ipaddress,numeric);\nALTER EXTENSION ip4r ADD OPERATOR +(ipaddress,bigint);\nALTER EXTENSION ip4r ADD OPERATOR +(ipaddress,integer);\nALTER EXTENSION ip4r ADD OPERATOR +(ipaddress,numeric);\nALTER EXTENSION ip4r ADD FUNCTION ip4_minus_bigint(ip4,bigint);\nALTER EXTENSION ip4r ADD FUNCTION ip4_minus_int(ip4,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip4_minus_numeric(ip4,numeric);\nALTER EXTENSION ip4r ADD OPERATOR -(ip4,bigint);\nALTER EXTENSION ip4r ADD OPERATOR -(ip4,integer);\nALTER EXTENSION ip4r ADD OPERATOR -(ip4,numeric);\nALTER EXTENSION ip4r ADD FUNCTION ip6_minus_bigint(ip6,bigint);\nALTER EXTENSION ip4r ADD FUNCTION ip6_minus_int(ip6,integer);\nALTER EXTENSION ip4r ADD FUNCTION ip6_minus_numeric(ip6,numeric);\nALTER EXTENSION ip4r ADD OPERATOR -(ip6,bigint);\nALTER EXTENSION ip4r ADD OPERATOR -(ip6,integer);\nALTER EXTENSION ip4r ADD OPERATOR -(ip6,numeric);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_minus_bigint(ipaddress,bigint);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_minus_int(ipaddress,integer);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_minus_numeric(ipaddress,numeric);\nALTER EXTENSION ip4r ADD OPERATOR -(ipaddress,bigint);\nALTER EXTENSION ip4r ADD OPERATOR -(ipaddress,integer);\nALTER EXTENSION ip4r ADD OPERATOR -(ipaddress,numeric);\nALTER EXTENSION ip4r ADD FUNCTION ip4_minus_ip4(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_minus_ip6(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_minus_ipaddress(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR -(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR -(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR -(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_contained_by(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_contained_by(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_contained_by(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR <<=(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR <<=(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR <<=(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_contained_by_strict(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_contained_by_strict(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_contained_by_strict(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR <<(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR <<(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR <<(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_contains(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_contains(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_contains(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR >>=(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR >>=(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR >>=(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_contains_strict(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_contains_strict(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_contains_strict(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR >>(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR >>(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR >>(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_overlaps(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_overlaps(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprange_overlaps(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR &&(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR &&(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR &&(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_contained_by(ip4,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip4_contained_by(ip4,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip6_contained_by(ip6,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_contained_by(ip6,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_contained_by(ipaddress,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_contains(ip4r,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_contains(ip6r,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip4_contains(iprange,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6_contains(iprange,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_contains(iprange,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4_eq(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_eq(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_eq(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_eq(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_eq(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_eq(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR =(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR =(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR =(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR =(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR =(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR =(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_ge(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_ge(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_ge(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_ge(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_ge(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_ge(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR >=(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR >=(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR >=(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR >=(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR >=(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR >=(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_gt(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_gt(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_gt(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_gt(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_gt(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_gt(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR >(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR >(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR >(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR >(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR >(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR >(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_le(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_le(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_le(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_le(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_le(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_le(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR <=(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR <=(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR <=(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR <=(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR <=(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR <=(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_lt(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_lt(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_lt(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_lt(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_lt(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_lt(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR <(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR <(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR <(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR <(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR <(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR <(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_neq(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_neq(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_neq(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_neq(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_neq(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_neq(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR <>(ip4,ip4);\nALTER EXTENSION ip4r ADD OPERATOR <>(ip4r,ip4r);\nALTER EXTENSION ip4r ADD OPERATOR <>(ip6,ip6);\nALTER EXTENSION ip4r ADD OPERATOR <>(ip6r,ip6r);\nALTER EXTENSION ip4r ADD OPERATOR <>(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD OPERATOR <>(iprange,iprange);\nALTER EXTENSION ip4r ADD FUNCTION ip4_cmp(ip4,ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip4r_cmp(ip4r,ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6_cmp(ip6,ip6);\nALTER EXTENSION ip4r ADD FUNCTION ip6r_cmp(ip6r,ip6r);\nALTER EXTENSION ip4r ADD FUNCTION ipaddress_cmp(ipaddress,ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION iprange_cmp(iprange,iprange);\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_ip4_ops USING btree;\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_ip4r_ops USING btree;\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_ip6_ops USING btree;\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_ip6r_ops USING btree;\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_ipaddress_ops USING btree;\nALTER EXTENSION ip4r ADD OPERATOR CLASS btree_iprange_ops USING btree;\nALTER EXTENSION ip4r ADD FUNCTION ip4hash(ip4);\nALTER EXTENSION ip4r ADD FUNCTION ip6hash(ip6);\nALTER EXTENSION ip4r ADD FUNCTION ipaddresshash(ipaddress);\nALTER EXTENSION ip4r ADD FUNCTION ip4rhash(ip4r);\nALTER EXTENSION ip4r ADD FUNCTION ip6rhash(ip6r);\nALTER EXTENSION ip4r ADD FUNCTION iprangehash(iprange);\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_ip4_ops USING hash;\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_ip4r_ops USING hash;\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_ip6_ops USING hash;\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_ip6r_ops USING hash;\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_ipaddress_ops USING hash;\nALTER EXTENSION ip4r ADD OPERATOR CLASS hash_iprange_ops USING hash;\nALTER EXTENSION ip4r ADD FUNCTION gip4r_consistent(internal,ip4r,int2,oid,internal);\nALTER EXTENSION ip4r ADD FUNCTION gip4r_compress(internal);\nALTER EXTENSION ip4r ADD FUNCTION gip4r_decompress(internal);\nALTER EXTENSION ip4r ADD FUNCTION gip4r_penalty(internal,internal,internal);\nALTER EXTENSION ip4r ADD FUNCTION gip4r_picksplit(internal, internal);\nALTER EXTENSION ip4r ADD FUNCTION gip4r_union(internal, internal);\nALTER EXTENSION ip4r ADD FUNCTION gip4r_same(ip4r, ip4r, internal);\nALTER EXTENSION ip4r ADD FUNCTION gip4r_fetch(internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_consistent(internal,ip6r,int2,oid,internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_compress(internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_decompress(internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_penalty(internal,internal,internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_picksplit(internal, internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_union(internal, internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_same(ip6r, ip6r, internal);\nALTER EXTENSION ip4r ADD FUNCTION gip6r_fetch(internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_consistent(internal,iprange,int2,oid,internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_compress(internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_decompress(internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_penalty(internal,internal,internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_picksplit(internal, internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_union(internal, internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_same(iprange, iprange, internal);\nALTER EXTENSION ip4r ADD FUNCTION gipr_fetch(internal);\nALTER EXTENSION ip4r ADD OPERATOR CLASS gist_ip4r_ops USING gist;\nALTER EXTENSION ip4r ADD OPERATOR CLASS gist_ip6r_ops USING gist;\nALTER EXTENSION ip4r ADD OPERATOR CLASS gist_iprange_ops USING gist;\n\n-- end\n"
  },
  {
    "path": "sql/ip4r-softerr.sql",
    "content": "-- Tests for pg16+\n\n--valid and invalid ip4\nselect v.i, v.t, pg_input_is_valid(v.t,'ip4') as valid, ierr.*\n  from (values (1, '1.2.3.4'),\n\t       (2, '0.0.0.0'),\n\t       (3, '255.255.255.255'),\n\t       -- invalid\n\t       (4, '1.2.3'),\n\t       (5, '0'),\n\t       (6, ' 1.2.3.4'),\n\t       (7, '1.2.3.4 '),\n\t       (8, '0.0.0.256'),\n\t       (9 , '0.0.256'),\n\t       (10, '0..255.0'),\n\t       (11, '+0.255.0.0'),\n\t       (12, '1.2.3.4-1.2.3.4')) v(i,t)\n  left join lateral (select * from pg_input_error_info(v.t,'ip4')) ierr\n\t\t on true;\n\n--valid and invalid ip4r\nselect v.i, v.t, pg_input_is_valid(v.t,'ip4r') as valid, ierr.*\n  from (values (1, '1.2.3.4'),\n\t       (2, '255.255.255.255/32'),\n\t       (3, '128.0.0.0/1'),\n\t       (4, '0.0.0.0/0'),\n\t       (5, '1.2.3.4-5.6.7.8'),\n\t       (6, '5.6.7.8-1.2.3.4'),\n\t       -- invalid\n\t       (7, '1.2.3'),\n\t       (8, '255.255.255.255.255.255.255.255.255'),\n\t       (9, '255.255.255.255.255-255.255.255.255.255'),\n\t       (10, '255.255.255.255-1.2.3.4.5'),\n\t       (11, '0.0.0.1/31'),\n\t       (12, '128.0.0.0/0'),\n\t       (13, '0.0.0.0/33'),\n\t       (14, '0.0.0.0/3.0'),\n\t       (15, '0.0.0.0/+33')\n\t       ) v(i,t)\n  left join lateral (select * from pg_input_error_info(v.t,'ip4r')) ierr\n\t\t on true;\n\n--valid and invalid ip6\n\nselect v.i, v.t, pg_input_is_valid(v.t,'ip6') as valid, ierr.*\n  from (values (1, '0000:0000:0000:0000:0000:0000:0000:0000'),\n\t       (2, '0000:0000:0000:0000:0000:0000:0000:0001'),\n\t       (3, '0:0:0:0:0:0:0:0'),\n\t       (4, '0:0:0:0:0:0:0:1'),\n\t       (5, '0:0:0:0:0:0:13.1.68.3'),\n\t       (6, '0:0:0:0:0:FFFF:129.144.52.38'),\n\t       (7, '0::0'),\n\t       (8, '1:2:3:4:5:6:1.2.3.4'),\n\t       -- invalid\n\t       (9, ''),\n\t       (10, '02001:0000:1234:0000:0000:C1C0:ABCD:0876'),\n\t       (11, '1.2.3.4:1111:2222:3333:4444::5555'),\n\t       (12, '123'),\n\t       (13, '12345::6:7:8'),\n\t       (14, '::1.2.256.4'),\n\t       (15, 'FF01::101::2'),\n\t       (16, 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'),\n\t       (17, 'ldkfj')\n       ) v(i,t)\n  left join lateral (select * from pg_input_error_info(v.t,'ip6')) ierr\n\t\t on true;\n\n--valid and invalid ip6r\n\nselect v.i, v.t, pg_input_is_valid(v.t,'ip6r') as valid, ierr.*\n  from (values (1, '::'),\n\t       (2, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'),\n\t       (3, '1::2'),\n\t       (4, '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'),\n\t       (5, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'),\n\t       (6, '1::2-3::4'),\n\t       (7, '3::4-3::4'),\n\t       (8, '3::4-1::2'),\n\t       -- invalid\n\t       (9, '::-::-::'),\n\t       (10, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff'),\n\t       (11, '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'),\n\t       (12, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'),\n\t       (13, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'),\n\t       (14, '0000:0000:0000:0000:0000:0000:0000:0001/127'),\n\t       (15, '0800:0000:0000:0000:0000:0000:0000:0000/4'),\n\t       (16, '8000:0000:0000:0000:0000:0000:0000:0000/0'),\n\t       (17, '::/129'),\n\t       (18, '::/255'),\n\t       (19, '::/256'),\n\t       (20, '::/+0'),\n\t       (21, '::/0-0'),\n\t       (22, '::-::/0')\n       ) v(i,t)\n  left join lateral (select * from pg_input_error_info(v.t,'ip6r')) ierr\n\t\t on true;\n\n--valid and invalid ipaddress\n\nselect v.i, v.t, pg_input_is_valid(v.t,'ipaddress') as valid, ierr.*\n  from (values (1, '1.2.3.4'),\n\t       (2, '0.0.0.0'),\n\t       (3, '255.255.255.255'),\n\t       (4, '1::8'),\n\t       (5, '2001:0000:1234:0000:0000:C1C0:ABCD:0876'),\n\t       (6, '2001:0db8:0000:0000:0000:0000:1428:57ab'),\n\t       -- invalid\n\t       (7, '1.2.3'),\n\t       (8, '0'),\n\t       (9, ' 1.2.3.4'),\n\t       (10, '1.2.3.4 '),\n\t       (11, '0.0.0.256'),\n\t       (12, ''),\n\t       (13, '02001:0000:1234:0000:0000:C1C0:ABCD:0876'),\n\t       (14, '1.2.3.4:1111:2222:3333:4444::5555'),\n\t       (15, '::ffff:2.3.4'),\n\t       (16, '::ffff:257.1.2.3'),\n\t       (17, 'FF01::101::2'),\n\t       (18, 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'),\n\t       (19, 'ldkfj')\n       ) v(i,t)\n  left join lateral (select * from pg_input_error_info(v.t,'ipaddress')) ierr\n\t\t on true;\n\n--valid and invalid iprange\n\nselect v.i, v.t, pg_input_is_valid(v.t,'iprange') as valid, ierr.*\n  from (values (1, '-'),\n\t       (2, '1.2.3.4'),\n\t       (3, '255.255.255.255/32'),\n\t       (4, '128.0.0.0/1'),\n\t       (5, '0.0.0.0/0'),\n\t       (6, '1.2.3.4-5.6.7.8'),\n\t       (7, '5.6.7.8-1.2.3.4'),\n\t       (8, '1.2.3.4-1.2.3.4'),\n\t       (9, '::'),\n\t       (10, '1::2'),\n\t       (11, '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'),\n\t       (12, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'),\n\t       (13, '1::2-3::4'),\n\t       (14, '3::4-3::4'),\n\t       (15, '3::4-1::2'),\n\t       (16, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'),\n\t       (17, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127'),\n\t       (18, '8000:0000:0000:0000:0000:0000:0000:0000/1'),\n\t       (19, '0000:0000:0000:0000:0000:0000:0000:0000/0'),\n\t       -- invalid\n\t       (20, '1.2.3'),\n\t       (21, '255.255.255.255.255.255.255.255.255'),\n\t       (22, '255.255.255.255.255-255.255.255.255.255'),\n\t       (23, '255.255.255.255-1.2.3.4.5'),\n\t       (24, '255.255.255.255-1.2.3'),\n\t       (25, '0.0.0.1/31'),\n\t       (26, '64.0.0.0/1'),\n\t       (27, '128.0.0.0/0'),\n\t       (28, '0.0.0.0/33'),\n\t       (29, '0.0.0.0/3.0'),\n\t       (30, '0.0.0.0/+33'),\n\t       (31, '::-::-::'),\n\t       (32, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff'),\n\t       (33, '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'),\n\t       (34, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'),\n\t       (35, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'),\n\t       (36, '0000:0000:0000:0000:0000:0000:0000:0001/127'),\n\t       (37, '0800:0000:0000:0000:0000:0000:0000:0000/4'),\n\t       (38, '8000:0000:0000:0000:0000:0000:0000:0000/0'),\n\t       (39, '::/129'),\n\t       (40, '::/255'),\n\t       (41, '::/256'),\n\t       (42, '::/+0'),\n\t       (43, '::/0-0'),\n\t       (44, '::-::/0'),\n\t       (45, '-::'),\n\t       (46, '-1.2.3.4'),\n\t       (47, '1.2.3.4-')\n       ) v(i,t)\n  left join lateral (select * from pg_input_error_info(v.t,'iprange')) ierr\n\t\t on true;\n\n-- end\n"
  },
  {
    "path": "sql/ip4r-v11.sql",
    "content": "-- Tests for pg11+\n\n-- RANGE support\n\nselect a4,\n       array_agg(a4) over (order by a4 range between 268435456 preceding and 268435456 following)\n  from ipaddrs\n where a4 is not null;\n\nselect a4,\n       array_agg(a4) over (order by a4 range between ip4 '16.0.0.0' preceding and ip4 '16.0.0.0' following)\n  from ipaddrs\n where a4 is not null;\n\nselect a4,\n       array_agg(a4) over (order by a4 range between -3 preceding and -3 following)\n  from ipaddrs\n where a4 is not null;\n\nselect a6,\n       array_agg(a6) over (order by a6 range between -10 preceding and -10 following)\n  from ipaddrs\n where a6 is not null;\n\nselect a6,\n       array_agg(a6) over (order by a6 range between ip6 '0010::' preceding and ip6 '0010::' following)\n  from ipaddrs\n where a6 is not null;\n\n-- errors\nselect a4,\n       array_agg(a4) over (order by a4 range between -33 preceding and -33 following)\n  from ipaddrs\n where a4 is not null;\n\nselect a6,\n       array_agg(a6) over (order by a6 range between -129 preceding and -129 following)\n  from ipaddrs\n where a6 is not null;\n\n-- end\n"
  },
  {
    "path": "sql/ip4r.sql",
    "content": "--\n\n/*CUT-HERE*/\nCREATE EXTENSION ip4r;\n\n-- Check whether any of our opclasses fail amvalidate\n\nDO $d$\n  DECLARE\n    r record;\n  BEGIN\n    IF current_setting('server_version_num')::integer >= 90600 THEN\n      FOR r IN SELECT amname,\n                      CASE amname WHEN 'btree' THEN 6\n\t\t                  WHEN 'hash' THEN 6\n\t\t\t\t  WHEN 'gist' THEN 3\n\t\t\t\t  ELSE 0 END as expected,\n\t\t      count(nullif(amvalidate(opc.oid),false)) as actual\n                 FROM pg_opclass opc\n                      LEFT JOIN pg_am am ON am.oid = opcmethod\n                WHERE opcintype IN ('ip4'::regtype,\n                                    'ip4r'::regtype,\n                                    'ip6'::regtype,\n                                    'ip6r'::regtype,\n                                    'ipaddress'::regtype,\n                                    'iprange'::regtype)\n                GROUP BY amname\n                ORDER BY amname\n      LOOP\n         IF r.expected IS DISTINCT FROM r.actual THEN\n           RAISE INFO '% % operator classes did not validate', r.expected - r.actual, r.amname;\n         END IF;\n      END LOOP;\n    END IF;\n  END;\n$d$;\n/*CUT-END*/\n\n\\set VERBOSITY terse\n\nSET extra_float_digits = 0;\n\n--\n-- Valid and invalid addresses\n--\n\n--valid ip4\nselect '1.2.3.4'::ip4;\nselect '0.0.0.0'::ip4;\nselect '255.255.255.255'::ip4;\nselect '0.0.0.255'::ip4;\nselect '0.0.255.0'::ip4;\nselect '0.255.0.0'::ip4;\nselect '255.0.0.0'::ip4;\nselect '192.168.123.210'::ip4;\nselect '127.0.0.1'::ip4;\n\n--invalid ip4\nselect '1.2.3'::ip4;\nselect '0'::ip4;\nselect ' 1.2.3.4'::ip4;\nselect '1.2.3.4 '::ip4;\nselect '0.0.0.256'::ip4;\nselect '0.0.256'::ip4;\nselect '0..255.0'::ip4;\nselect '+0.255.0.0'::ip4;\nselect '1.2.3.4-1.2.3.4'::ip4;\n\n-- valid ip6\nselect '0000:0000:0000:0000:0000:0000:0000:0000'::ip6;\nselect '0000:0000:0000:0000:0000:0000:0000:0001'::ip6;\nselect '0:0:0:0:0:0:0:0'::ip6;\nselect '0:0:0:0:0:0:0:1'::ip6;\nselect '0:0:0:0:0:0:13.1.68.3'::ip6;\nselect '0:0:0:0:0:FFFF:129.144.52.38'::ip6;\nselect '0::0'::ip6;\nselect '1:2:3:4:5:6:1.2.3.4'::ip6;\nselect '1:2:3:4:5:6:7:8'::ip6;\nselect '1:2:3:4:5:6::'::ip6;\nselect '1:2:3:4:5:6::8'::ip6;\nselect '1:2:3:4:5::'::ip6;\nselect '1:2:3:4:5::1.2.3.4'::ip6;\nselect '1:2:3:4:5::7:8'::ip6;\nselect '1:2:3:4:5::8'::ip6;\nselect '1:2:3:4::'::ip6;\nselect '1:2:3:4::1.2.3.4'::ip6;\nselect '1:2:3:4::5:1.2.3.4'::ip6;\nselect '1:2:3:4::7:8'::ip6;\nselect '1:2:3:4::8'::ip6;\nselect '1:2:3::'::ip6;\nselect '1:2:3::1.2.3.4'::ip6;\nselect '1:2:3::5:1.2.3.4'::ip6;\nselect '1:2:3::7:8'::ip6;\nselect '1:2:3::8'::ip6;\nselect '1:2::'::ip6;\nselect '1:2::1.2.3.4'::ip6;\nselect '1:2::5:1.2.3.4'::ip6;\nselect '1:2::7:8'::ip6;\nselect '1:2::8'::ip6;\nselect '1::'::ip6;\nselect '1::1.2.3.4'::ip6;\nselect '1::2:3'::ip6;\nselect '1::2:3:4'::ip6;\nselect '1::2:3:4:5'::ip6;\nselect '1::2:3:4:5:6'::ip6;\nselect '1::2:3:4:5:6:7'::ip6;\nselect '1::5:1.2.3.4'::ip6;\nselect '1::5:11.22.33.44'::ip6;\nselect '1::7:8'::ip6;\nselect '1::8'::ip6;\nselect '2001:0000:1234:0000:0000:C1C0:ABCD:0876'::ip6;\nselect '2001:0db8:0000:0000:0000:0000:1428:57ab'::ip6;\nselect '2001:0db8:0000:0000:0000::1428:57ab'::ip6;\nselect '2001:0db8:0:0:0:0:1428:57ab'::ip6;\nselect '2001:0db8:0:0::1428:57ab'::ip6;\nselect '2001:0db8:1234:0000:0000:0000:0000:0000'::ip6;\nselect '2001:0db8:1234::'::ip6;\nselect '2001:0db8:1234:ffff:ffff:ffff:ffff:ffff'::ip6;\nselect '2001:0db8:85a3:0000:0000:8a2e:0370:7334'::ip6;\nselect '2001:0db8::1428:57ab'::ip6;\nselect '2001:10::'::ip6;\nselect '2001::'::ip6;\nselect '2001:DB8:0:0:8:800:200C:417A'::ip6;\nselect '2001:DB8::8:800:200C:417A'::ip6;\nselect '2001:db8:85a3:0:0:8a2e:370:7334'::ip6;\nselect '2001:db8:85a3::8a2e:370:7334'::ip6;\nselect '2001:db8::'::ip6;\nselect '2001:db8::'::ip6;\nselect '2001:db8::1428:57ab'::ip6;\nselect '2001:db8:a::123'::ip6;\nselect '2002::'::ip6;\nselect '2::10'::ip6;\nselect '3ffe:0b00:0000:0000:0001:0000:0000:000a'::ip6;\nselect '::'::ip6;\nselect '::1'::ip6;\nselect '::127.0.0.1'::ip6;\nselect '::13.1.68.3'::ip6;\nselect '::2:3'::ip6;\nselect '::2:3:4'::ip6;\nselect '::2:3:4:5'::ip6;\nselect '::2:3:4:5:6'::ip6;\nselect '::2:3:4:5:6:7'::ip6;\nselect '::2:3:4:5:6:7:8'::ip6;\nselect '::8'::ip6;\nselect '::FFFF:129.144.52.38'::ip6;\nselect '::ffff:0:0'::ip6;\nselect '::ffff:0:192.168.1.1'::ip6;\nselect '::ffff:1:1.2.3.4'::ip6;\nselect '::ffff:0c22:384e'::ip6;\nselect '::ffff:12.34.56.78'::ip6;\nselect '::ffff:192.0.2.128'::ip6;\nselect '::ffff:192.168.1.1'::ip6;\nselect '::ffff:192.168.1.26'::ip6;\nselect '::ffff:c000:280'::ip6;\nselect 'FF01:0:0:0:0:0:0:101'::ip6;\nselect 'FF01::101'::ip6;\nselect 'FF02:0000:0000:0000:0000:0000:0000:0001'::ip6;\nselect 'fc00::'::ip6;\nselect 'fe80:0000:0000:0000:0204:61ff:fe9d:f156'::ip6;\nselect 'fe80:0:0:0:204:61ff:254.157.241.86'::ip6;\nselect 'fe80:0:0:0:204:61ff:fe9d:f156'::ip6;\nselect 'fe80::'::ip6;\nselect 'fe80::1'::ip6;\nselect 'fe80::204:61ff:254.157.241.86'::ip6;\nselect 'fe80::204:61ff:fe9d:f156'::ip6;\nselect 'fe80::217:f2ff:254.7.237.98'::ip6;\nselect 'fe80::217:f2ff:fe07:ed62'::ip6;\nselect 'ff02::1'::ip6;\n\n-- invalid ip6\nselect ''::ip6;\nselect '02001:0000:1234:0000:0000:C1C0:ABCD:0876'::ip6;\nselect '1.2.3.4:1111:2222:3333:4444::5555'::ip6;\nselect '1.2.3.4:1111:2222:3333::5555'::ip6;\nselect '1.2.3.4:1111:2222::5555'::ip6;\nselect '1.2.3.4:1111::5555'::ip6;\nselect '1.2.3.4::'::ip6;\nselect '1.2.3.4::5555'::ip6;\nselect '1111:'::ip6;\nselect '1111:2222:3333:4444::5555:'::ip6;\nselect '1111:2222:3333::5555:'::ip6;\nselect '1111:2222::5555:'::ip6;\nselect '1111::5555:'::ip6;\nselect '123'::ip6;\nselect '12345::6:7:8'::ip6;\nselect '127.0.0.1'::ip6;\nselect '1:2:3:4:5:6:7:8:9'::ip6;\nselect '1:2:3::4:5:6:7:8:9'::ip6;\nselect '1:2:3::4:5::7:8'::ip6;\nselect '1::1.2.256.4'::ip6;\nselect '1::1.2.3.256'::ip6;\nselect '1::1.2.3.300'::ip6;\nselect '1::1.2.3.900'::ip6;\nselect '1::1.2.300.4'::ip6;\nselect '1::1.2.900.4'::ip6;\nselect '1::1.256.3.4'::ip6;\nselect '1::1.300.3.4'::ip6;\nselect '1::1.900.3.4'::ip6;\nselect '1::256.2.3.4'::ip6;\nselect '1::260.2.3.4'::ip6;\nselect '1::2::3'::ip6;\nselect '1::300.2.3.4'::ip6;\nselect '1::300.300.300.300'::ip6;\nselect '1::3000.30.30.30'::ip6;\nselect '1::400.2.3.4'::ip6;\nselect '1::5:1.2.256.4'::ip6;\nselect '1::5:1.2.3.256'::ip6;\nselect '1::5:1.2.3.300'::ip6;\nselect '1::5:1.2.3.900'::ip6;\nselect '1::5:1.2.300.4'::ip6;\nselect '1::5:1.2.900.4'::ip6;\nselect '1::5:1.256.3.4'::ip6;\nselect '1::5:1.300.3.4'::ip6;\nselect '1::5:1.900.3.4'::ip6;\nselect '1::5:256.2.3.4'::ip6;\nselect '1::5:260.2.3.4'::ip6;\nselect '1::5:300.2.3.4'::ip6;\nselect '1::5:300.300.300.300'::ip6;\nselect '1::5:3000.30.30.30'::ip6;\nselect '1::5:400.2.3.4'::ip6;\nselect '1::5:900.2.3.4'::ip6;\nselect '1::900.2.3.4'::ip6;\nselect '1:::3:4:5'::ip6;\nselect '2001:0000:1234: 0000:0000:C1C0:ABCD:0876'::ip6;\nselect '2001:0000:1234:0000:00001:C1C0:ABCD:0876'::ip6;\nselect '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'::ip6;\nselect '2001::FFD3::57ab'::ip6;\nselect '2001:DB8:0:0:8:800:200C:417A:221'::ip6;\nselect '2001:db8:85a3::8a2e:37023:7334'::ip6;\nselect '2001:db8:85a3::8a2e:370k:7334'::ip6;\nselect '3ffe:0b00:0000:0001:0000:0000:000a'::ip6;\nselect '3ffe:b00::1::a'::ip6;\nselect ':'::ip6;\nselect ':1111:2222:3333:4444::5555'::ip6;\nselect ':1111:2222:3333::5555'::ip6;\nselect ':1111:2222::5555'::ip6;\nselect ':1111::5555'::ip6;\nselect '::1.2.256.4'::ip6;\nselect '::1.2.3.256'::ip6;\nselect '::1.2.3.300'::ip6;\nselect '::1.2.3.900'::ip6;\nselect '::1.2.300.4'::ip6;\nselect '::1.2.900.4'::ip6;\nselect '::1.256.3.4'::ip6;\nselect '::1.300.3.4'::ip6;\nselect '::1.900.3.4'::ip6;\nselect '::1111:2222:3333:4444:5555:6666::'::ip6;\nselect '::256.2.3.4'::ip6;\nselect '::260.2.3.4'::ip6;\nselect '::300.2.3.4'::ip6;\nselect '::300.300.300.300'::ip6;\nselect '::3000.30.30.30'::ip6;\nselect '::400.2.3.4'::ip6;\nselect '::5555:'::ip6;\nselect '::900.2.3.4'::ip6;\nselect ':::'::ip6;\nselect ':::5555'::ip6;\nselect '::ffff:2.3.4'::ip6;\nselect '::ffff:257.1.2.3'::ip6;\nselect 'FF01::101::2'::ip6;\nselect 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'::ip6;\nselect 'ldkfj'::ip6;\n\n-- valid ip4r\nselect '1.2.3.4'::ip4r;\nselect '255.255.255.255/32'::ip4r;\nselect '255.255.255.254/31'::ip4r;\nselect '255.255.255.252/30'::ip4r;\nselect '255.255.255.248/29'::ip4r;\nselect '255.255.255.240/28'::ip4r;\nselect '255.255.255.224/27'::ip4r;\nselect '255.255.255.192/26'::ip4r;\nselect '255.255.255.128/25'::ip4r;\nselect '255.255.255.0/24'::ip4r;\nselect '255.255.254.0/23'::ip4r;\nselect '255.255.252.0/22'::ip4r;\nselect '255.255.248.0/21'::ip4r;\nselect '255.255.240.0/20'::ip4r;\nselect '255.255.224.0/19'::ip4r;\nselect '255.255.192.0/18'::ip4r;\nselect '255.255.128.0/17'::ip4r;\nselect '255.255.0.0/16'::ip4r;\nselect '255.254.0.0/15'::ip4r;\nselect '255.252.0.0/14'::ip4r;\nselect '255.248.0.0/13'::ip4r;\nselect '255.240.0.0/12'::ip4r;\nselect '255.224.0.0/11'::ip4r;\nselect '255.192.0.0/10'::ip4r;\nselect '255.128.0.0/9'::ip4r;\nselect '255.0.0.0/8'::ip4r;\nselect '254.0.0.0/7'::ip4r;\nselect '252.0.0.0/6'::ip4r;\nselect '248.0.0.0/5'::ip4r;\nselect '240.0.0.0/4'::ip4r;\nselect '224.0.0.0/3'::ip4r;\nselect '192.0.0.0/2'::ip4r;\nselect '128.0.0.0/1'::ip4r;\nselect '0.0.0.0/0'::ip4r;\nselect '1.2.3.4-5.6.7.8'::ip4r;\nselect '5.6.7.8-1.2.3.4'::ip4r;\nselect '1.2.3.4-1.2.3.4'::ip4r;\n\n-- invalid ip4r\nselect '1.2.3'::ip4r;\nselect '255.255.255.255.255.255.255.255.255'::ip4r;\nselect '255.255.255.255.255-255.255.255.255.255'::ip4r;\nselect '255.255.255.255-1.2.3.4.5'::ip4r;\nselect '255.255.255.255-1.2.3'::ip4r;\nselect '0.0.0.1/31'::ip4r;\nselect '0.0.0.1/30'::ip4r;\nselect '0.0.0.1/29'::ip4r;\nselect '0.0.0.1/28'::ip4r;\nselect '0.0.0.1/27'::ip4r;\nselect '0.0.0.1/26'::ip4r;\nselect '0.0.0.1/25'::ip4r;\nselect '0.0.0.1/24'::ip4r;\nselect '0.0.0.1/23'::ip4r;\nselect '0.0.0.1/22'::ip4r;\nselect '0.0.0.1/21'::ip4r;\nselect '0.0.0.1/20'::ip4r;\nselect '0.0.0.1/19'::ip4r;\nselect '0.0.0.1/18'::ip4r;\nselect '0.0.0.1/17'::ip4r;\nselect '0.0.0.1/16'::ip4r;\nselect '0.0.0.1/15'::ip4r;\nselect '0.0.0.1/14'::ip4r;\nselect '0.0.0.1/13'::ip4r;\nselect '0.0.0.1/12'::ip4r;\nselect '0.0.0.1/11'::ip4r;\nselect '0.0.0.1/10'::ip4r;\nselect '0.0.0.1/9'::ip4r;\nselect '0.0.0.1/8'::ip4r;\nselect '0.0.0.1/7'::ip4r;\nselect '0.0.0.1/6'::ip4r;\nselect '0.0.0.1/5'::ip4r;\nselect '0.0.0.1/4'::ip4r;\nselect '0.0.0.1/3'::ip4r;\nselect '0.0.0.1/2'::ip4r;\nselect '0.0.0.1/1'::ip4r;\nselect '0.0.0.1/0'::ip4r;\nselect '0.0.0.2/30'::ip4r;\nselect '0.0.0.4/29'::ip4r;\nselect '0.0.0.8/28'::ip4r;\nselect '0.0.0.16/27'::ip4r;\nselect '0.0.0.32/26'::ip4r;\nselect '0.0.0.64/25'::ip4r;\nselect '0.0.0.128/24'::ip4r;\nselect '0.0.1.0/23'::ip4r;\nselect '0.0.2.0/22'::ip4r;\nselect '0.0.4.0/21'::ip4r;\nselect '0.0.8.0/20'::ip4r;\nselect '0.0.16.0/19'::ip4r;\nselect '0.0.32.0/18'::ip4r;\nselect '0.0.64.0/17'::ip4r;\nselect '0.0.128.0/16'::ip4r;\nselect '0.1.0.0/15'::ip4r;\nselect '0.2.0.0/14'::ip4r;\nselect '0.4.0.0/13'::ip4r;\nselect '0.8.0.0/12'::ip4r;\nselect '0.16.0.0/11'::ip4r;\nselect '0.32.0.0/10'::ip4r;\nselect '0.64.0.0/9'::ip4r;\nselect '0.128.0.0/8'::ip4r;\nselect '1.0.0.0/7'::ip4r;\nselect '2.0.0.0/6'::ip4r;\nselect '4.0.0.0/5'::ip4r;\nselect '8.0.0.0/4'::ip4r;\nselect '16.0.0.0/3'::ip4r;\nselect '32.0.0.0/2'::ip4r;\nselect '64.0.0.0/1'::ip4r;\nselect '128.0.0.0/0'::ip4r;\nselect '0.0.0.0/33'::ip4r;\nselect '0.0.0.0/3.0'::ip4r;\nselect '0.0.0.0/+33'::ip4r;\n\n-- valid ip6r\nselect '::'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6r;\nselect '1::2'::ip6r;\nselect '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::ip6r;\nselect '1::2-3::4'::ip6r;\nselect '3::4-3::4'::ip6r;\nselect '3::4-1::2'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0000/112'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:0000:0000/96'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:0000:0000:0000/80'::ip6r;\nselect 'ffff:ffff:ffff:ffff:fff0:0000:0000:0000/76'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ff00:0000:0000:0000/72'::ip6r;\nselect 'ffff:ffff:ffff:ffff:f000:0000:0000:0000/68'::ip6r;\nselect 'ffff:ffff:ffff:ffff:e000:0000:0000:0000/67'::ip6r;\nselect 'ffff:ffff:ffff:ffff:c000:0000:0000:0000/66'::ip6r;\nselect 'ffff:ffff:ffff:ffff:8000:0000:0000:0000/65'::ip6r;\nselect 'ffff:ffff:ffff:ffff:0000:0000:0000:0000/64'::ip6r;\nselect 'ffff:ffff:ffff:fffe:0000:0000:0000:0000/63'::ip6r;\nselect 'ffff:ffff:ffff:fffc:0000:0000:0000:0000/62'::ip6r;\nselect 'ffff:ffff:ffff:fff8:0000:0000:0000:0000/61'::ip6r;\nselect 'ffff:ffff:ffff:fff0:0000:0000:0000:0000/60'::ip6r;\nselect 'ffff:ffff:ffff:ff00:0000:0000:0000:0000/56'::ip6r;\nselect 'ffff:ffff:ffff:f000:0000:0000:0000:0000/52'::ip6r;\nselect 'ffff:ffff:ffff:0000:0000:0000:0000:0000/48'::ip6r;\nselect 'ffff:ffff:0000:0000:0000:0000:0000:0000/32'::ip6r;\nselect 'ffff:0000:0000:0000:0000:0000:0000:0000/16'::ip6r;\nselect 'fff0:0000:0000:0000:0000:0000:0000:0000/12'::ip6r;\nselect 'ff00:0000:0000:0000:0000:0000:0000:0000/8'::ip6r;\nselect 'f000:0000:0000:0000:0000:0000:0000:0000/4'::ip6r;\nselect 'e000:0000:0000:0000:0000:0000:0000:0000/3'::ip6r;\nselect 'c000:0000:0000:0000:0000:0000:0000:0000/2'::ip6r;\nselect '8000:0000:0000:0000:0000:0000:0000:0000/1'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0000/0'::ip6r;\n\n-- invalid ip6r\nselect '::-::-::'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff'::ip6r;\nselect '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/127'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/120'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/112'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/96'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/80'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/64'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/48'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/32'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/16'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/8'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/4'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/0'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0008/124'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0080/120'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:8000/112'::ip6r;\nselect '0000:0000:0000:0000:0000:0000:8000:0000/96'::ip6r;\nselect '0000:0000:0000:0000:0000:8000:0000:0000/80'::ip6r;\nselect '0000:0000:0000:0000:8000:0000:0000:0000/64'::ip6r;\nselect '0000:0000:0000:8000:0000:0000:0000:0000/48'::ip6r;\nselect '0000:0000:8000:0000:0000:0000:0000:0000/32'::ip6r;\nselect '0000:8000:0000:0000:0000:0000:0000:0000/16'::ip6r;\nselect '0080:0000:0000:0000:0000:0000:0000:0000/8'::ip6r;\nselect '0800:0000:0000:0000:0000:0000:0000:0000/4'::ip6r;\nselect '8000:0000:0000:0000:0000:0000:0000:0000/0'::ip6r;\nselect '::/129'::ip6r;\nselect '::/255'::ip6r;\nselect '::/256'::ip6r;\nselect '::/+0'::ip6r;\nselect '::/0-0'::ip6r;\nselect '::-::/0'::ip6r;\n\n-- valid ipaddress\nselect a, family(a) from (select '1.2.3.4'::ipaddress as a) s1;\nselect a, family(a) from (select '0.0.0.0'::ipaddress as a) s1;\nselect a, family(a) from (select '255.255.255.255'::ipaddress as a) s1;\nselect a, family(a) from (select '0.0.0.255'::ipaddress as a) s1;\nselect a, family(a) from (select '0.0.255.0'::ipaddress as a) s1;\nselect a, family(a) from (select '0.255.0.0'::ipaddress as a) s1;\nselect a, family(a) from (select '255.0.0.0'::ipaddress as a) s1;\nselect a, family(a) from (select '192.168.123.210'::ipaddress as a) s1;\nselect a, family(a) from (select '127.0.0.1'::ipaddress as a) s1;\nselect a, family(a) from (select '0000:0000:0000:0000:0000:0000:0000:0000'::ipaddress as a) s1;\nselect a, family(a) from (select '0000:0000:0000:0000:0000:0000:0000:0001'::ipaddress as a) s1;\nselect a, family(a) from (select '0:0:0:0:0:0:0:0'::ipaddress as a) s1;\nselect a, family(a) from (select '0:0:0:0:0:0:0:1'::ipaddress as a) s1;\nselect a, family(a) from (select '0:0:0:0:0:0:13.1.68.3'::ipaddress as a) s1;\nselect a, family(a) from (select '0:0:0:0:0:FFFF:129.144.52.38'::ipaddress as a) s1;\nselect a, family(a) from (select '0::0'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3:4:5:6:1.2.3.4'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3:4:5:6:7:8'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3:4:5:6::'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3:4:5:6::8'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3:4:5::'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3:4:5::1.2.3.4'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3:4:5::7:8'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3:4:5::8'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3:4::'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3:4::1.2.3.4'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3:4::5:1.2.3.4'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3:4::7:8'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3:4::8'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3::'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3::1.2.3.4'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3::5:1.2.3.4'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3::7:8'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2:3::8'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2::'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2::1.2.3.4'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2::5:1.2.3.4'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2::7:8'::ipaddress as a) s1;\nselect a, family(a) from (select '1:2::8'::ipaddress as a) s1;\nselect a, family(a) from (select '1::'::ipaddress as a) s1;\nselect a, family(a) from (select '1::1.2.3.4'::ipaddress as a) s1;\nselect a, family(a) from (select '1::2:3'::ipaddress as a) s1;\nselect a, family(a) from (select '1::2:3:4'::ipaddress as a) s1;\nselect a, family(a) from (select '1::2:3:4:5'::ipaddress as a) s1;\nselect a, family(a) from (select '1::2:3:4:5:6'::ipaddress as a) s1;\nselect a, family(a) from (select '1::2:3:4:5:6:7'::ipaddress as a) s1;\nselect a, family(a) from (select '1::5:1.2.3.4'::ipaddress as a) s1;\nselect a, family(a) from (select '1::5:11.22.33.44'::ipaddress as a) s1;\nselect a, family(a) from (select '1::7:8'::ipaddress as a) s1;\nselect a, family(a) from (select '1::8'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:0000:1234:0000:0000:C1C0:ABCD:0876'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:0db8:0000:0000:0000:0000:1428:57ab'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:0db8:0000:0000:0000::1428:57ab'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:0db8:0:0:0:0:1428:57ab'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:0db8:0:0::1428:57ab'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:0db8:1234:0000:0000:0000:0000:0000'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:0db8:1234::'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:0db8:1234:ffff:ffff:ffff:ffff:ffff'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:0db8:85a3:0000:0000:8a2e:0370:7334'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:0db8::1428:57ab'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:10::'::ipaddress as a) s1;\nselect a, family(a) from (select '2001::'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:DB8:0:0:8:800:200C:417A'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:DB8::8:800:200C:417A'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:db8:85a3:0:0:8a2e:370:7334'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:db8:85a3::8a2e:370:7334'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:db8::'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:db8::'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:db8::1428:57ab'::ipaddress as a) s1;\nselect a, family(a) from (select '2001:db8:a::123'::ipaddress as a) s1;\nselect a, family(a) from (select '2002::'::ipaddress as a) s1;\nselect a, family(a) from (select '2::10'::ipaddress as a) s1;\nselect a, family(a) from (select '3ffe:0b00:0000:0000:0001:0000:0000:000a'::ipaddress as a) s1;\nselect a, family(a) from (select '::'::ipaddress as a) s1;\nselect a, family(a) from (select '::1'::ipaddress as a) s1;\nselect a, family(a) from (select '::127.0.0.1'::ipaddress as a) s1;\nselect a, family(a) from (select '::13.1.68.3'::ipaddress as a) s1;\nselect a, family(a) from (select '::2:3'::ipaddress as a) s1;\nselect a, family(a) from (select '::2:3:4'::ipaddress as a) s1;\nselect a, family(a) from (select '::2:3:4:5'::ipaddress as a) s1;\nselect a, family(a) from (select '::2:3:4:5:6'::ipaddress as a) s1;\nselect a, family(a) from (select '::2:3:4:5:6:7'::ipaddress as a) s1;\nselect a, family(a) from (select '::2:3:4:5:6:7:8'::ipaddress as a) s1;\nselect a, family(a) from (select '::8'::ipaddress as a) s1;\nselect a, family(a) from (select '::FFFF:129.144.52.38'::ipaddress as a) s1;\nselect a, family(a) from (select '::ffff:0:0'::ipaddress as a) s1;\nselect a, family(a) from (select '::ffff:0:192.168.1.1'::ipaddress as a) s1;\nselect a, family(a) from (select '::ffff:1:1.2.3.4'::ipaddress as a) s1;\nselect a, family(a) from (select '::ffff:0c22:384e'::ipaddress as a) s1;\nselect a, family(a) from (select '::ffff:12.34.56.78'::ipaddress as a) s1;\nselect a, family(a) from (select '::ffff:192.0.2.128'::ipaddress as a) s1;\nselect a, family(a) from (select '::ffff:192.168.1.1'::ipaddress as a) s1;\nselect a, family(a) from (select '::ffff:192.168.1.26'::ipaddress as a) s1;\nselect a, family(a) from (select '::ffff:c000:280'::ipaddress as a) s1;\nselect a, family(a) from (select 'FF01:0:0:0:0:0:0:101'::ipaddress as a) s1;\nselect a, family(a) from (select 'FF01::101'::ipaddress as a) s1;\nselect a, family(a) from (select 'FF02:0000:0000:0000:0000:0000:0000:0001'::ipaddress as a) s1;\nselect a, family(a) from (select 'fc00::'::ipaddress as a) s1;\nselect a, family(a) from (select 'fe80:0000:0000:0000:0204:61ff:fe9d:f156'::ipaddress as a) s1;\nselect a, family(a) from (select 'fe80:0:0:0:204:61ff:254.157.241.86'::ipaddress as a) s1;\nselect a, family(a) from (select 'fe80:0:0:0:204:61ff:fe9d:f156'::ipaddress as a) s1;\nselect a, family(a) from (select 'fe80::'::ipaddress as a) s1;\nselect a, family(a) from (select 'fe80::1'::ipaddress as a) s1;\nselect a, family(a) from (select 'fe80::204:61ff:254.157.241.86'::ipaddress as a) s1;\nselect a, family(a) from (select 'fe80::204:61ff:fe9d:f156'::ipaddress as a) s1;\nselect a, family(a) from (select 'fe80::217:f2ff:254.7.237.98'::ipaddress as a) s1;\nselect a, family(a) from (select 'fe80::217:f2ff:fe07:ed62'::ipaddress as a) s1;\nselect a, family(a) from (select 'ff02::1'::ipaddress as a) s1;\n\n-- invalid ipaddress\nselect '1.2.3'::ipaddress;\nselect '0'::ipaddress;\nselect ' 1.2.3.4'::ipaddress;\nselect '1.2.3.4 '::ipaddress;\nselect '0.0.0.256'::ipaddress;\nselect '0.0.256'::ipaddress;\nselect '0..255.0'::ipaddress;\nselect '+0.255.0.0'::ipaddress;\nselect '1.2.3.4-1.2.3.4'::ipaddress;\nselect ''::ipaddress;\nselect '02001:0000:1234:0000:0000:C1C0:ABCD:0876'::ipaddress;\nselect '1.2.3.4:1111:2222:3333:4444::5555'::ipaddress;\nselect '1.2.3.4:1111:2222:3333::5555'::ipaddress;\nselect '1.2.3.4:1111:2222::5555'::ipaddress;\nselect '1.2.3.4:1111::5555'::ipaddress;\nselect '1.2.3.4::'::ipaddress;\nselect '1.2.3.4::5555'::ipaddress;\nselect '1111:'::ipaddress;\nselect '1111:2222:3333:4444::5555:'::ipaddress;\nselect '1111:2222:3333::5555:'::ipaddress;\nselect '1111:2222::5555:'::ipaddress;\nselect '1111::5555:'::ipaddress;\nselect '123'::ipaddress;\nselect '12345::6:7:8'::ipaddress;\nselect '1:2:3:4:5:6:7:8:9'::ipaddress;\nselect '1:2:3::4:5:6:7:8:9'::ipaddress;\nselect '1:2:3::4:5::7:8'::ipaddress;\nselect '1::1.2.256.4'::ipaddress;\nselect '1::1.2.3.256'::ipaddress;\nselect '1::1.2.3.300'::ipaddress;\nselect '1::1.2.3.900'::ipaddress;\nselect '1::1.2.300.4'::ipaddress;\nselect '1::1.2.900.4'::ipaddress;\nselect '1::1.256.3.4'::ipaddress;\nselect '1::1.300.3.4'::ipaddress;\nselect '1::1.900.3.4'::ipaddress;\nselect '1::256.2.3.4'::ipaddress;\nselect '1::260.2.3.4'::ipaddress;\nselect '1::2::3'::ipaddress;\nselect '1::300.2.3.4'::ipaddress;\nselect '1::300.300.300.300'::ipaddress;\nselect '1::3000.30.30.30'::ipaddress;\nselect '1::400.2.3.4'::ipaddress;\nselect '1::5:1.2.256.4'::ipaddress;\nselect '1::5:1.2.3.256'::ipaddress;\nselect '1::5:1.2.3.300'::ipaddress;\nselect '1::5:1.2.3.900'::ipaddress;\nselect '1::5:1.2.300.4'::ipaddress;\nselect '1::5:1.2.900.4'::ipaddress;\nselect '1::5:1.256.3.4'::ipaddress;\nselect '1::5:1.300.3.4'::ipaddress;\nselect '1::5:1.900.3.4'::ipaddress;\nselect '1::5:256.2.3.4'::ipaddress;\nselect '1::5:260.2.3.4'::ipaddress;\nselect '1::5:300.2.3.4'::ipaddress;\nselect '1::5:300.300.300.300'::ipaddress;\nselect '1::5:3000.30.30.30'::ipaddress;\nselect '1::5:400.2.3.4'::ipaddress;\nselect '1::5:900.2.3.4'::ipaddress;\nselect '1::900.2.3.4'::ipaddress;\nselect '1:::3:4:5'::ipaddress;\nselect '2001:0000:1234: 0000:0000:C1C0:ABCD:0876'::ipaddress;\nselect '2001:0000:1234:0000:00001:C1C0:ABCD:0876'::ipaddress;\nselect '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'::ipaddress;\nselect '2001::FFD3::57ab'::ipaddress;\nselect '2001:DB8:0:0:8:800:200C:417A:221'::ipaddress;\nselect '2001:db8:85a3::8a2e:37023:7334'::ipaddress;\nselect '2001:db8:85a3::8a2e:370k:7334'::ipaddress;\nselect '3ffe:0b00:0000:0001:0000:0000:000a'::ipaddress;\nselect '3ffe:b00::1::a'::ipaddress;\nselect ':'::ipaddress;\nselect ':1111:2222:3333:4444::5555'::ipaddress;\nselect ':1111:2222:3333::5555'::ipaddress;\nselect ':1111:2222::5555'::ipaddress;\nselect ':1111::5555'::ipaddress;\nselect '::1.2.256.4'::ipaddress;\nselect '::1.2.3.256'::ipaddress;\nselect '::1.2.3.300'::ipaddress;\nselect '::1.2.3.900'::ipaddress;\nselect '::1.2.300.4'::ipaddress;\nselect '::1.2.900.4'::ipaddress;\nselect '::1.256.3.4'::ipaddress;\nselect '::1.300.3.4'::ipaddress;\nselect '::1.900.3.4'::ipaddress;\nselect '::1111:2222:3333:4444:5555:6666::'::ipaddress;\nselect '::256.2.3.4'::ipaddress;\nselect '::260.2.3.4'::ipaddress;\nselect '::300.2.3.4'::ipaddress;\nselect '::300.300.300.300'::ipaddress;\nselect '::3000.30.30.30'::ipaddress;\nselect '::400.2.3.4'::ipaddress;\nselect '::5555:'::ipaddress;\nselect '::900.2.3.4'::ipaddress;\nselect ':::'::ipaddress;\nselect ':::5555'::ipaddress;\nselect '::ffff:2.3.4'::ipaddress;\nselect '::ffff:257.1.2.3'::ipaddress;\nselect 'FF01::101::2'::ipaddress;\nselect 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'::ipaddress;\nselect 'ldkfj'::ipaddress;\n\n-- valid iprange\nselect r, family(r), iprange_size(r) from (select '-'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '1.2.3.4'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.255.255/32'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.255.254/31'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.255.252/30'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.255.248/29'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.255.240/28'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.255.224/27'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.255.192/26'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.255.128/25'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.255.0/24'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.254.0/23'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.252.0/22'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.248.0/21'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.240.0/20'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.224.0/19'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.192.0/18'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.128.0/17'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.255.0.0/16'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.254.0.0/15'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.252.0.0/14'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.248.0.0/13'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.240.0.0/12'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.224.0.0/11'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.192.0.0/10'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.128.0.0/9'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '255.0.0.0/8'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '254.0.0.0/7'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '252.0.0.0/6'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '248.0.0.0/5'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '240.0.0.0/4'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '224.0.0.0/3'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '192.0.0.0/2'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '128.0.0.0/1'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '0.0.0.0/0'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '1.2.3.4-5.6.7.8'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '5.6.7.8-1.2.3.4'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '1.2.3.4-1.2.3.4'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '::'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '1::2'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '1::2-3::4'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '3::4-3::4'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '3::4-1::2'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0000/112'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:0000:0000/96'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ffff:0000:0000:0000/80'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:fff0:0000:0000:0000/76'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:ff00:0000:0000:0000/72'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:f000:0000:0000:0000/68'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:e000:0000:0000:0000/67'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:c000:0000:0000:0000/66'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:8000:0000:0000:0000/65'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ffff:0000:0000:0000:0000/64'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:fffe:0000:0000:0000:0000/63'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:fffc:0000:0000:0000:0000/62'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:fff8:0000:0000:0000:0000/61'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:fff0:0000:0000:0000:0000/60'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:ff00:0000:0000:0000:0000/56'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:f000:0000:0000:0000:0000/52'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:ffff:0000:0000:0000:0000:0000/48'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:ffff:0000:0000:0000:0000:0000:0000/32'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ffff:0000:0000:0000:0000:0000:0000:0000/16'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'fff0:0000:0000:0000:0000:0000:0000:0000/12'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'ff00:0000:0000:0000:0000:0000:0000:0000/8'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'f000:0000:0000:0000:0000:0000:0000:0000/4'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'e000:0000:0000:0000:0000:0000:0000:0000/3'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select 'c000:0000:0000:0000:0000:0000:0000:0000/2'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '8000:0000:0000:0000:0000:0000:0000:0000/1'::iprange as r) s;\nselect r, family(r), iprange_size(r) from (select '0000:0000:0000:0000:0000:0000:0000:0000/0'::iprange as r) s;\n\n-- invalid iprange\nselect '1.2.3'::iprange;\nselect '255.255.255.255.255.255.255.255.255'::iprange;\nselect '255.255.255.255.255-255.255.255.255.255'::iprange;\nselect '255.255.255.255-1.2.3.4.5'::iprange;\nselect '255.255.255.255-1.2.3'::iprange;\nselect '0.0.0.1/31'::iprange;\nselect '0.0.0.1/30'::iprange;\nselect '0.0.0.1/29'::iprange;\nselect '0.0.0.1/28'::iprange;\nselect '0.0.0.1/27'::iprange;\nselect '0.0.0.1/26'::iprange;\nselect '0.0.0.1/25'::iprange;\nselect '0.0.0.1/24'::iprange;\nselect '0.0.0.1/23'::iprange;\nselect '0.0.0.1/22'::iprange;\nselect '0.0.0.1/21'::iprange;\nselect '0.0.0.1/20'::iprange;\nselect '0.0.0.1/19'::iprange;\nselect '0.0.0.1/18'::iprange;\nselect '0.0.0.1/17'::iprange;\nselect '0.0.0.1/16'::iprange;\nselect '0.0.0.1/15'::iprange;\nselect '0.0.0.1/14'::iprange;\nselect '0.0.0.1/13'::iprange;\nselect '0.0.0.1/12'::iprange;\nselect '0.0.0.1/11'::iprange;\nselect '0.0.0.1/10'::iprange;\nselect '0.0.0.1/9'::iprange;\nselect '0.0.0.1/8'::iprange;\nselect '0.0.0.1/7'::iprange;\nselect '0.0.0.1/6'::iprange;\nselect '0.0.0.1/5'::iprange;\nselect '0.0.0.1/4'::iprange;\nselect '0.0.0.1/3'::iprange;\nselect '0.0.0.1/2'::iprange;\nselect '0.0.0.1/1'::iprange;\nselect '0.0.0.1/0'::iprange;\nselect '0.0.0.2/30'::iprange;\nselect '0.0.0.4/29'::iprange;\nselect '0.0.0.8/28'::iprange;\nselect '0.0.0.16/27'::iprange;\nselect '0.0.0.32/26'::iprange;\nselect '0.0.0.64/25'::iprange;\nselect '0.0.0.128/24'::iprange;\nselect '0.0.1.0/23'::iprange;\nselect '0.0.2.0/22'::iprange;\nselect '0.0.4.0/21'::iprange;\nselect '0.0.8.0/20'::iprange;\nselect '0.0.16.0/19'::iprange;\nselect '0.0.32.0/18'::iprange;\nselect '0.0.64.0/17'::iprange;\nselect '0.0.128.0/16'::iprange;\nselect '0.1.0.0/15'::iprange;\nselect '0.2.0.0/14'::iprange;\nselect '0.4.0.0/13'::iprange;\nselect '0.8.0.0/12'::iprange;\nselect '0.16.0.0/11'::iprange;\nselect '0.32.0.0/10'::iprange;\nselect '0.64.0.0/9'::iprange;\nselect '0.128.0.0/8'::iprange;\nselect '1.0.0.0/7'::iprange;\nselect '2.0.0.0/6'::iprange;\nselect '4.0.0.0/5'::iprange;\nselect '8.0.0.0/4'::iprange;\nselect '16.0.0.0/3'::iprange;\nselect '32.0.0.0/2'::iprange;\nselect '64.0.0.0/1'::iprange;\nselect '128.0.0.0/0'::iprange;\nselect '0.0.0.0/33'::iprange;\nselect '0.0.0.0/3.0'::iprange;\nselect '0.0.0.0/+33'::iprange;\nselect '::-::-::'::iprange;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff'::ip6r;\nselect '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::iprange;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::iprange;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/127'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/120'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/112'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/96'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/80'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/64'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/48'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/32'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/16'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/8'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/4'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/0'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0008/124'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:0080/120'::iprange;\nselect '0000:0000:0000:0000:0000:0000:0000:8000/112'::iprange;\nselect '0000:0000:0000:0000:0000:0000:8000:0000/96'::iprange;\nselect '0000:0000:0000:0000:0000:8000:0000:0000/80'::iprange;\nselect '0000:0000:0000:0000:8000:0000:0000:0000/64'::iprange;\nselect '0000:0000:0000:8000:0000:0000:0000:0000/48'::iprange;\nselect '0000:0000:8000:0000:0000:0000:0000:0000/32'::iprange;\nselect '0000:8000:0000:0000:0000:0000:0000:0000/16'::iprange;\nselect '0080:0000:0000:0000:0000:0000:0000:0000/8'::iprange;\nselect '0800:0000:0000:0000:0000:0000:0000:0000/4'::iprange;\nselect '8000:0000:0000:0000:0000:0000:0000:0000/0'::iprange;\nselect '::/129'::iprange;\nselect '::/255'::iprange;\nselect '::/256'::iprange;\nselect '::/+0'::iprange;\nselect '::/0-0'::iprange;\nselect '::-::/0'::iprange;\nselect '-::'::iprange;\nselect '-1.2.3.4'::iprange;\nselect '1.2.3.4-'::iprange;\n\n-- canaries for portability issues in binary output\n\nselect r, encode(ip4_send(r),'hex') from (select '128.1.255.0'::ip4 as r) s;\nselect r, encode(ip4_send(r),'hex') from (select '1.128.0.255'::ip4 as r) s;\nselect r, encode(ip4r_send(r),'hex') from (select '128.1.255.0/24'::ip4r as r) s;\nselect r, encode(ip4r_send(r),'hex') from (select '128.1.255.1-128.1.255.2'::ip4r as r) s;\n\nselect r, encode(ip6_send(r),'hex') from (select 'ffff::8000'::ip6 as r) s;\nselect r, encode(ip6_send(r),'hex') from (select '8000::ffff'::ip6 as r) s;\nselect r, encode(ip6r_send(r),'hex') from (select 'ffff::8000/128'::ip6r as r) s;\nselect r, encode(ip6r_send(r),'hex') from (select '8000::ffff/128'::ip6r as r) s;\n\nselect r, encode(ipaddress_send(r),'hex') from (select '128.1.255.0'::ipaddress as r) s;\nselect r, encode(ipaddress_send(r),'hex') from (select '1.128.0.255'::ipaddress as r) s;\nselect r, encode(iprange_send(r),'hex') from (select '128.1.255.0/24'::iprange as r) s;\nselect r, encode(iprange_send(r),'hex') from (select '128.1.255.1-128.1.255.2'::iprange as r) s;\n\nselect r, encode(ipaddress_send(r),'hex') from (select 'ffff::8000'::ipaddress as r) s;\nselect r, encode(ipaddress_send(r),'hex') from (select '8000::ffff'::ipaddress as r) s;\nselect r, encode(iprange_send(r),'hex') from (select 'ffff::8000/128'::iprange as r) s;\nselect r, encode(iprange_send(r),'hex') from (select 'ffff::8000/120'::iprange as r) s;\nselect r, encode(iprange_send(r),'hex') from (select 'ffff::8001-ffff::8002'::iprange as r) s;\n\nselect r, encode(iprange_send(r),'hex') from (select '-'::iprange as r) s;\n\n-- text casts and cross-type casts\n\nselect r::text  from (select '-'::iprange as r) s;\n\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '1.2.3.4'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.255/32'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.254/31'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.252/30'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.248/29'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.240/28'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.224/27'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.192/26'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.128/25'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.255.0/24'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.254.0/23'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.252.0/22'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.248.0/21'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.240.0/20'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.224.0/19'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.192.0/18'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.128.0/17'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.255.0.0/16'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.254.0.0/15'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.252.0.0/14'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.248.0.0/13'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.240.0.0/12'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.224.0.0/11'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.192.0.0/10'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.128.0.0/9'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '255.0.0.0/8'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '254.0.0.0/7'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '252.0.0.0/6'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '248.0.0.0/5'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '240.0.0.0/4'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '224.0.0.0/3'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '192.0.0.0/2'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '128.0.0.0/1'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '0.0.0.0/0'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '1.2.3.4-5.6.7.8'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '5.6.7.8-1.2.3.4'::iprange as r) s;\nselect r::text, r::ip4r::text, lower(r)::ip4::text, upper(r::ip4r)::text from (select '1.2.3.4-1.2.3.4'::iprange as r) s;\n\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '::'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '1::2'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '1::2-3::4'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '3::4-3::4'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '3::4-1::2'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0000/112'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:ffff:0000:0000/96'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ffff:0000:0000:0000/80'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:fff0:0000:0000:0000/76'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:ff00:0000:0000:0000/72'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:f000:0000:0000:0000/68'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:e000:0000:0000:0000/67'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:c000:0000:0000:0000/66'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:8000:0000:0000:0000/65'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ffff:0000:0000:0000:0000/64'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:fffe:0000:0000:0000:0000/63'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:fffc:0000:0000:0000:0000/62'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:fff8:0000:0000:0000:0000/61'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:fff0:0000:0000:0000:0000/60'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:ff00:0000:0000:0000:0000/56'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:f000:0000:0000:0000:0000/52'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:ffff:0000:0000:0000:0000:0000/48'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:ffff:0000:0000:0000:0000:0000:0000/32'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ffff:0000:0000:0000:0000:0000:0000:0000/16'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'fff0:0000:0000:0000:0000:0000:0000:0000/12'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'ff00:0000:0000:0000:0000:0000:0000:0000/8'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'f000:0000:0000:0000:0000:0000:0000:0000/4'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'e000:0000:0000:0000:0000:0000:0000:0000/3'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select 'c000:0000:0000:0000:0000:0000:0000:0000/2'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '8000:0000:0000:0000:0000:0000:0000:0000/1'::iprange as r) s;\nselect r::text, r::ip6r::text, lower(r)::ip6::text, upper(r::ip6r)::text from (select '0000:0000:0000:0000:0000:0000:0000:0000/0'::iprange as r) s;\n\nselect a::ipaddress, a::ip4 from (select '1.2.3.4'::text as a) s1;\nselect a::ipaddress, a::ip4 from (select '0.0.0.0'::text as a) s1;\nselect a::ipaddress, a::ip4 from (select '255.255.255.255'::text as a) s1;\nselect a::ipaddress, a::ip4 from (select '0.0.0.255'::text as a) s1;\nselect a::ipaddress, a::ip4 from (select '0.0.255.0'::text as a) s1;\nselect a::ipaddress, a::ip4 from (select '0.255.0.0'::text as a) s1;\nselect a::ipaddress, a::ip4 from (select '255.0.0.0'::text as a) s1;\nselect a::ipaddress, a::ip4 from (select '192.168.123.210'::text as a) s1;\nselect a::ipaddress, a::ip4 from (select '127.0.0.1'::text as a) s1;\n\nselect a::ipaddress, a::ip6 from (select '0000:0000:0000:0000:0000:0000:0000:0000'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '0000:0000:0000:0000:0000:0000:0000:0001'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '0:0:0:0:0:0:0:0'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '0:0:0:0:0:0:0:1'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '0:0:0:0:0:0:13.1.68.3'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '0:0:0:0:0:FFFF:129.144.52.38'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '0::0'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5:6:1.2.3.4'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5:6:7:8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5:6::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5:6::8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5::1.2.3.4'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5::7:8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3:4:5::8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3:4::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3:4::1.2.3.4'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3:4::5:1.2.3.4'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3:4::7:8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3:4::8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3::1.2.3.4'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3::5:1.2.3.4'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3::7:8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2:3::8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2::1.2.3.4'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2::5:1.2.3.4'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2::7:8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1:2::8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1::1.2.3.4'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1::2:3'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1::2:3:4'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1::2:3:4:5'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1::2:3:4:5:6'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1::2:3:4:5:6:7'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1::5:1.2.3.4'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1::5:11.22.33.44'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1::7:8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '1::8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:0000:1234:0000:0000:C1C0:ABCD:0876'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:0db8:0000:0000:0000:0000:1428:57ab'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:0db8:0000:0000:0000::1428:57ab'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:0db8:0:0:0:0:1428:57ab'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:0db8:0:0::1428:57ab'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:0db8:1234:0000:0000:0000:0000:0000'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:0db8:1234::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:0db8:1234:ffff:ffff:ffff:ffff:ffff'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:0db8:85a3:0000:0000:8a2e:0370:7334'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:0db8::1428:57ab'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:10::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:DB8:0:0:8:800:200C:417A'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:DB8::8:800:200C:417A'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:db8:85a3:0:0:8a2e:370:7334'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:db8:85a3::8a2e:370:7334'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:db8::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:db8::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:db8::1428:57ab'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2001:db8:a::123'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2002::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '2::10'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '3ffe:0b00:0000:0000:0001:0000:0000:000a'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::1'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::127.0.0.1'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::13.1.68.3'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::2:3'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::2:3:4'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::2:3:4:5'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::2:3:4:5:6'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::2:3:4:5:6:7'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::2:3:4:5:6:7:8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::8'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::FFFF:129.144.52.38'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::ffff:0:0'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::ffff:0:192.168.1.1'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::ffff:1:1.2.3.4'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::ffff:0c22:384e'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::ffff:12.34.56.78'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::ffff:192.0.2.128'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::ffff:192.168.1.1'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::ffff:192.168.1.26'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select '::ffff:c000:280'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'FF01:0:0:0:0:0:0:101'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'FF01::101'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'FF02:0000:0000:0000:0000:0000:0000:0001'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'fc00::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'fe80:0000:0000:0000:0204:61ff:fe9d:f156'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'fe80:0:0:0:204:61ff:254.157.241.86'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'fe80:0:0:0:204:61ff:fe9d:f156'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'fe80::'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'fe80::1'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'fe80::204:61ff:254.157.241.86'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'fe80::204:61ff:fe9d:f156'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'fe80::217:f2ff:254.7.237.98'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'fe80::217:f2ff:fe07:ed62'::text as a) s1;\nselect a::ipaddress, a::ip6 from (select 'ff02::1'::text as a) s1;\n\nselect r::iprange from (select '-'::text as r) s;\nselect r::iprange, r::ip4r from (select '1.2.3.4'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.255.255/32'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.255.254/31'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.255.252/30'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.255.248/29'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.255.240/28'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.255.224/27'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.255.192/26'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.255.128/25'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.255.0/24'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.254.0/23'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.252.0/22'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.248.0/21'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.240.0/20'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.224.0/19'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.192.0/18'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.128.0/17'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.255.0.0/16'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.254.0.0/15'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.252.0.0/14'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.248.0.0/13'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.240.0.0/12'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.224.0.0/11'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.192.0.0/10'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.128.0.0/9'::text as r) s;\nselect r::iprange, r::ip4r from (select '255.0.0.0/8'::text as r) s;\nselect r::iprange, r::ip4r from (select '254.0.0.0/7'::text as r) s;\nselect r::iprange, r::ip4r from (select '252.0.0.0/6'::text as r) s;\nselect r::iprange, r::ip4r from (select '248.0.0.0/5'::text as r) s;\nselect r::iprange, r::ip4r from (select '240.0.0.0/4'::text as r) s;\nselect r::iprange, r::ip4r from (select '224.0.0.0/3'::text as r) s;\nselect r::iprange, r::ip4r from (select '192.0.0.0/2'::text as r) s;\nselect r::iprange, r::ip4r from (select '128.0.0.0/1'::text as r) s;\nselect r::iprange, r::ip4r from (select '0.0.0.0/0'::text as r) s;\nselect r::iprange, r::ip4r from (select '1.2.3.4-5.6.7.8'::text as r) s;\nselect r::iprange, r::ip4r from (select '5.6.7.8-1.2.3.4'::text as r) s;\nselect r::iprange, r::ip4r from (select '1.2.3.4-1.2.3.4'::text as r) s;\n\nselect r::iprange, r::ip6r from (select '::'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::text as r) s;\nselect r::iprange, r::ip6r from (select '1::2'::text as r) s;\nselect r::iprange, r::ip6r from (select '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::text as r) s;\nselect r::iprange, r::ip6r from (select '1::2-3::4'::text as r) s;\nselect r::iprange, r::ip6r from (select '3::4-3::4'::text as r) s;\nselect r::iprange, r::ip6r from (select '3::4-1::2'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc/126'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8/125'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0/124'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00/120'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:f000/116'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0000/112'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:ffff:0000:0000/96'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ffff:0000:0000:0000/80'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:fff0:0000:0000:0000/76'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:ff00:0000:0000:0000/72'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:f000:0000:0000:0000/68'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:e000:0000:0000:0000/67'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:c000:0000:0000:0000/66'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:8000:0000:0000:0000/65'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ffff:0000:0000:0000:0000/64'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:fffe:0000:0000:0000:0000/63'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:fffc:0000:0000:0000:0000/62'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:fff8:0000:0000:0000:0000/61'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:fff0:0000:0000:0000:0000/60'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:ff00:0000:0000:0000:0000/56'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:f000:0000:0000:0000:0000/52'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:ffff:0000:0000:0000:0000:0000/48'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:ffff:0000:0000:0000:0000:0000:0000/32'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ffff:0000:0000:0000:0000:0000:0000:0000/16'::text as r) s;\nselect r::iprange, r::ip6r from (select 'fff0:0000:0000:0000:0000:0000:0000:0000/12'::text as r) s;\nselect r::iprange, r::ip6r from (select 'ff00:0000:0000:0000:0000:0000:0000:0000/8'::text as r) s;\nselect r::iprange, r::ip6r from (select 'f000:0000:0000:0000:0000:0000:0000:0000/4'::text as r) s;\nselect r::iprange, r::ip6r from (select 'e000:0000:0000:0000:0000:0000:0000:0000/3'::text as r) s;\nselect r::iprange, r::ip6r from (select 'c000:0000:0000:0000:0000:0000:0000:0000/2'::text as r) s;\nselect r::iprange, r::ip6r from (select '8000:0000:0000:0000:0000:0000:0000:0000/1'::text as r) s;\nselect r::iprange, r::ip6r from (select '0000:0000:0000:0000:0000:0000:0000:0000/0'::text as r) s;\n\n-- invalid text casts\n\nselect '1.2.3'::text::ip4;\nselect '0'::text::ip4;\nselect ' 1.2.3.4'::text::ip4;\nselect '1.2.3.4 '::text::ip4;\nselect '0.0.0.256'::text::ip4;\nselect '0.0.256'::text::ip4;\nselect '0..255.0'::text::ip4;\nselect '+0.255.0.0'::text::ip4;\nselect '1.2.3.4-1.2.3.4'::text::ip4;\n\nselect '1.2.3'::text::ip4r;\nselect '255.255.255.255.255.255.255.255.255'::text::ip4r;\nselect '255.255.255.255.255-255.255.255.255.255'::text::ip4r;\nselect '255.255.255.255-1.2.3.4.5'::text::ip4r;\nselect '255.255.255.255-1.2.3'::text::ip4r;\nselect '0.0.0.1/31'::text::ip4r;\nselect '0.0.0.1/30'::text::ip4r;\nselect '0.0.0.1/29'::text::ip4r;\nselect '0.0.0.1/28'::text::ip4r;\nselect '0.0.0.1/27'::text::ip4r;\nselect '0.0.0.1/26'::text::ip4r;\nselect '0.0.0.1/25'::text::ip4r;\nselect '0.0.0.1/24'::text::ip4r;\nselect '0.0.0.1/23'::text::ip4r;\nselect '0.0.0.1/22'::text::ip4r;\nselect '0.0.0.1/21'::text::ip4r;\nselect '0.0.0.1/20'::text::ip4r;\nselect '0.0.0.1/19'::text::ip4r;\nselect '0.0.0.1/18'::text::ip4r;\nselect '0.0.0.1/17'::text::ip4r;\nselect '0.0.0.1/16'::text::ip4r;\nselect '0.0.0.1/15'::text::ip4r;\nselect '0.0.0.1/14'::text::ip4r;\nselect '0.0.0.1/13'::text::ip4r;\nselect '0.0.0.1/12'::text::ip4r;\nselect '0.0.0.1/11'::text::ip4r;\nselect '0.0.0.1/10'::text::ip4r;\nselect '0.0.0.1/9'::text::ip4r;\nselect '0.0.0.1/8'::text::ip4r;\nselect '0.0.0.1/7'::text::ip4r;\nselect '0.0.0.1/6'::text::ip4r;\nselect '0.0.0.1/5'::text::ip4r;\nselect '0.0.0.1/4'::text::ip4r;\nselect '0.0.0.1/3'::text::ip4r;\nselect '0.0.0.1/2'::text::ip4r;\nselect '0.0.0.1/1'::text::ip4r;\nselect '0.0.0.1/0'::text::ip4r;\nselect '0.0.0.2/30'::text::ip4r;\nselect '0.0.0.4/29'::text::ip4r;\nselect '0.0.0.8/28'::text::ip4r;\nselect '0.0.0.16/27'::text::ip4r;\nselect '0.0.0.32/26'::text::ip4r;\nselect '0.0.0.64/25'::text::ip4r;\nselect '0.0.0.128/24'::text::ip4r;\nselect '0.0.1.0/23'::text::ip4r;\nselect '0.0.2.0/22'::text::ip4r;\nselect '0.0.4.0/21'::text::ip4r;\nselect '0.0.8.0/20'::text::ip4r;\nselect '0.0.16.0/19'::text::ip4r;\nselect '0.0.32.0/18'::text::ip4r;\nselect '0.0.64.0/17'::text::ip4r;\nselect '0.0.128.0/16'::text::ip4r;\nselect '0.1.0.0/15'::text::ip4r;\nselect '0.2.0.0/14'::text::ip4r;\nselect '0.4.0.0/13'::text::ip4r;\nselect '0.8.0.0/12'::text::ip4r;\nselect '0.16.0.0/11'::text::ip4r;\nselect '0.32.0.0/10'::text::ip4r;\nselect '0.64.0.0/9'::text::ip4r;\nselect '0.128.0.0/8'::text::ip4r;\nselect '1.0.0.0/7'::text::ip4r;\nselect '2.0.0.0/6'::text::ip4r;\nselect '4.0.0.0/5'::text::ip4r;\nselect '8.0.0.0/4'::text::ip4r;\nselect '16.0.0.0/3'::text::ip4r;\nselect '32.0.0.0/2'::text::ip4r;\nselect '64.0.0.0/1'::text::ip4r;\nselect '128.0.0.0/0'::text::ip4r;\nselect '0.0.0.0/33'::text::ip4r;\nselect '0.0.0.0/3.0'::text::ip4r;\nselect '0.0.0.0/+33'::text::ip4r;\n\nselect ''::text::ip6;\nselect '02001:0000:1234:0000:0000:C1C0:ABCD:0876'::text::ip6;\nselect '1.2.3.4:1111:2222:3333:4444::5555'::text::ip6;\nselect '1.2.3.4:1111:2222:3333::5555'::text::ip6;\nselect '1.2.3.4:1111:2222::5555'::text::ip6;\nselect '1.2.3.4:1111::5555'::text::ip6;\nselect '1.2.3.4::'::text::ip6;\nselect '1.2.3.4::5555'::text::ip6;\nselect '1111:'::text::ip6;\nselect '1111:2222:3333:4444::5555:'::text::ip6;\nselect '1111:2222:3333::5555:'::text::ip6;\nselect '1111:2222::5555:'::text::ip6;\nselect '1111::5555:'::text::ip6;\nselect '123'::text::ip6;\nselect '12345::6:7:8'::text::ip6;\nselect '127.0.0.1'::text::ip6;\nselect '1:2:3:4:5:6:7:8:9'::text::ip6;\nselect '1:2:3::4:5:6:7:8:9'::text::ip6;\nselect '1:2:3::4:5::7:8'::text::ip6;\nselect '1::1.2.256.4'::text::ip6;\nselect '1::1.2.3.256'::text::ip6;\nselect '1::1.2.3.300'::text::ip6;\nselect '1::1.2.3.900'::text::ip6;\nselect '1::1.2.300.4'::text::ip6;\nselect '1::1.2.900.4'::text::ip6;\nselect '1::1.256.3.4'::text::ip6;\nselect '1::1.300.3.4'::text::ip6;\nselect '1::1.900.3.4'::text::ip6;\nselect '1::256.2.3.4'::text::ip6;\nselect '1::260.2.3.4'::text::ip6;\nselect '1::2::3'::text::ip6;\nselect '1::300.2.3.4'::text::ip6;\nselect '1::300.300.300.300'::text::ip6;\nselect '1::3000.30.30.30'::text::ip6;\nselect '1::400.2.3.4'::text::ip6;\nselect '1::5:1.2.256.4'::text::ip6;\nselect '1::5:1.2.3.256'::text::ip6;\nselect '1::5:1.2.3.300'::text::ip6;\nselect '1::5:1.2.3.900'::text::ip6;\nselect '1::5:1.2.300.4'::text::ip6;\nselect '1::5:1.2.900.4'::text::ip6;\nselect '1::5:1.256.3.4'::text::ip6;\nselect '1::5:1.300.3.4'::text::ip6;\nselect '1::5:1.900.3.4'::text::ip6;\nselect '1::5:256.2.3.4'::text::ip6;\nselect '1::5:260.2.3.4'::text::ip6;\nselect '1::5:300.2.3.4'::text::ip6;\nselect '1::5:300.300.300.300'::text::ip6;\nselect '1::5:3000.30.30.30'::text::ip6;\nselect '1::5:400.2.3.4'::text::ip6;\nselect '1::5:900.2.3.4'::text::ip6;\nselect '1::900.2.3.4'::text::ip6;\nselect '1:::3:4:5'::text::ip6;\nselect '2001:0000:1234: 0000:0000:C1C0:ABCD:0876'::text::ip6;\nselect '2001:0000:1234:0000:00001:C1C0:ABCD:0876'::text::ip6;\nselect '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'::text::ip6;\nselect '2001::FFD3::57ab'::text::ip6;\nselect '2001:DB8:0:0:8:800:200C:417A:221'::text::ip6;\nselect '2001:db8:85a3::8a2e:37023:7334'::text::ip6;\nselect '2001:db8:85a3::8a2e:370k:7334'::text::ip6;\nselect '3ffe:0b00:0000:0001:0000:0000:000a'::text::ip6;\nselect '3ffe:b00::1::a'::text::ip6;\nselect ':'::text::ip6;\nselect ':1111:2222:3333:4444::5555'::text::ip6;\nselect ':1111:2222:3333::5555'::text::ip6;\nselect ':1111:2222::5555'::text::ip6;\nselect ':1111::5555'::text::ip6;\nselect '::1.2.256.4'::text::ip6;\nselect '::1.2.3.256'::text::ip6;\nselect '::1.2.3.300'::text::ip6;\nselect '::1.2.3.900'::text::ip6;\nselect '::1.2.300.4'::text::ip6;\nselect '::1.2.900.4'::text::ip6;\nselect '::1.256.3.4'::text::ip6;\nselect '::1.300.3.4'::text::ip6;\nselect '::1.900.3.4'::text::ip6;\nselect '::1111:2222:3333:4444:5555:6666::'::text::ip6;\nselect '::256.2.3.4'::text::ip6;\nselect '::260.2.3.4'::text::ip6;\nselect '::300.2.3.4'::text::ip6;\nselect '::300.300.300.300'::text::ip6;\nselect '::3000.30.30.30'::text::ip6;\nselect '::400.2.3.4'::text::ip6;\nselect '::5555:'::text::ip6;\nselect '::900.2.3.4'::text::ip6;\nselect ':::'::text::ip6;\nselect ':::5555'::text::ip6;\nselect '::ffff:2.3.4'::text::ip6;\nselect '::ffff:257.1.2.3'::text::ip6;\nselect 'FF01::101::2'::text::ip6;\nselect 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'::text::ip6;\nselect 'ldkfj'::text::ip6;\n\nselect '::-::-::'::text::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff-ffff'::text::ip6r;\nselect '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::text::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff-::'::text::ip6r;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/127'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/120'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/112'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/96'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/80'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/64'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/48'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/32'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/16'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/8'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/4'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0001/0'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0008/124'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:0080/120'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:0000:8000/112'::text::ip6r;\nselect '0000:0000:0000:0000:0000:0000:8000:0000/96'::text::ip6r;\nselect '0000:0000:0000:0000:0000:8000:0000:0000/80'::text::ip6r;\nselect '0000:0000:0000:0000:8000:0000:0000:0000/64'::text::ip6r;\nselect '0000:0000:0000:8000:0000:0000:0000:0000/48'::text::ip6r;\nselect '0000:0000:8000:0000:0000:0000:0000:0000/32'::text::ip6r;\nselect '0000:8000:0000:0000:0000:0000:0000:0000/16'::text::ip6r;\nselect '0080:0000:0000:0000:0000:0000:0000:0000/8'::text::ip6r;\nselect '0800:0000:0000:0000:0000:0000:0000:0000/4'::text::ip6r;\nselect '8000:0000:0000:0000:0000:0000:0000:0000/0'::text::ip6r;\nselect '::/129'::text::ip6r;\nselect '::/255'::text::ip6r;\nselect '::/256'::text::ip6r;\nselect '::/+0'::text::ip6r;\nselect '::/0-0'::text::ip6r;\nselect '::-::/0'::text::ip6r;\n\nselect '1.2.3'::text::ipaddress;\nselect '0'::text::ipaddress;\nselect ' 1.2.3.4'::text::ipaddress;\nselect '1.2.3.4 '::text::ipaddress;\nselect '0.0.0.256'::text::ipaddress;\nselect '0.0.256'::text::ipaddress;\nselect '0..255.0'::text::ipaddress;\nselect '+0.255.0.0'::text::ipaddress;\nselect '1.2.3.4-1.2.3.4'::text::ipaddress;\nselect ''::text::ipaddress;\nselect '02001:0000:1234:0000:0000:C1C0:ABCD:0876'::text::ipaddress;\nselect '1.2.3.4:1111:2222:3333:4444::5555'::text::ipaddress;\nselect '1.2.3.4:1111:2222:3333::5555'::text::ipaddress;\nselect '1.2.3.4:1111:2222::5555'::text::ipaddress;\nselect '1.2.3.4:1111::5555'::text::ipaddress;\nselect '1.2.3.4::'::text::ipaddress;\nselect '1.2.3.4::5555'::text::ipaddress;\nselect '1111:'::text::ipaddress;\nselect '1111:2222:3333:4444::5555:'::text::ipaddress;\nselect '1111:2222:3333::5555:'::text::ipaddress;\nselect '1111:2222::5555:'::text::ipaddress;\nselect '1111::5555:'::text::ipaddress;\nselect '123'::text::ipaddress;\nselect '12345::6:7:8'::text::ipaddress;\nselect '1:2:3:4:5:6:7:8:9'::text::ipaddress;\nselect '1:2:3::4:5:6:7:8:9'::text::ipaddress;\nselect '1:2:3::4:5::7:8'::text::ipaddress;\nselect '1::1.2.256.4'::text::ipaddress;\nselect '1::1.2.3.256'::text::ipaddress;\nselect '1::1.2.3.300'::text::ipaddress;\nselect '1::1.2.3.900'::text::ipaddress;\nselect '1::1.2.300.4'::text::ipaddress;\nselect '1::1.2.900.4'::text::ipaddress;\nselect '1::1.256.3.4'::text::ipaddress;\nselect '1::1.300.3.4'::text::ipaddress;\nselect '1::1.900.3.4'::text::ipaddress;\nselect '1::256.2.3.4'::text::ipaddress;\nselect '1::260.2.3.4'::text::ipaddress;\nselect '1::2::3'::text::ipaddress;\nselect '1::300.2.3.4'::text::ipaddress;\nselect '1::300.300.300.300'::text::ipaddress;\nselect '1::3000.30.30.30'::text::ipaddress;\nselect '1::400.2.3.4'::text::ipaddress;\nselect '1::5:1.2.256.4'::text::ipaddress;\nselect '1::5:1.2.3.256'::text::ipaddress;\nselect '1::5:1.2.3.300'::text::ipaddress;\nselect '1::5:1.2.3.900'::text::ipaddress;\nselect '1::5:1.2.300.4'::text::ipaddress;\nselect '1::5:1.2.900.4'::text::ipaddress;\nselect '1::5:1.256.3.4'::text::ipaddress;\nselect '1::5:1.300.3.4'::text::ipaddress;\nselect '1::5:1.900.3.4'::text::ipaddress;\nselect '1::5:256.2.3.4'::text::ipaddress;\nselect '1::5:260.2.3.4'::text::ipaddress;\nselect '1::5:300.2.3.4'::text::ipaddress;\nselect '1::5:300.300.300.300'::text::ipaddress;\nselect '1::5:3000.30.30.30'::text::ipaddress;\nselect '1::5:400.2.3.4'::text::ipaddress;\nselect '1::5:900.2.3.4'::text::ipaddress;\nselect '1::900.2.3.4'::text::ipaddress;\nselect '1:::3:4:5'::text::ipaddress;\nselect '2001:0000:1234: 0000:0000:C1C0:ABCD:0876'::text::ipaddress;\nselect '2001:0000:1234:0000:00001:C1C0:ABCD:0876'::text::ipaddress;\nselect '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'::text::ipaddress;\nselect '2001::FFD3::57ab'::text::ipaddress;\nselect '2001:DB8:0:0:8:800:200C:417A:221'::text::ipaddress;\nselect '2001:db8:85a3::8a2e:37023:7334'::text::ipaddress;\nselect '2001:db8:85a3::8a2e:370k:7334'::text::ipaddress;\nselect '3ffe:0b00:0000:0001:0000:0000:000a'::text::ipaddress;\nselect '3ffe:b00::1::a'::text::ipaddress;\nselect ':'::text::ipaddress;\nselect ':1111:2222:3333:4444::5555'::text::ipaddress;\nselect ':1111:2222:3333::5555'::text::ipaddress;\nselect ':1111:2222::5555'::text::ipaddress;\nselect ':1111::5555'::text::ipaddress;\nselect '::1.2.256.4'::text::ipaddress;\nselect '::1.2.3.256'::text::ipaddress;\nselect '::1.2.3.300'::text::ipaddress;\nselect '::1.2.3.900'::text::ipaddress;\nselect '::1.2.300.4'::text::ipaddress;\nselect '::1.2.900.4'::text::ipaddress;\nselect '::1.256.3.4'::text::ipaddress;\nselect '::1.300.3.4'::text::ipaddress;\nselect '::1.900.3.4'::text::ipaddress;\nselect '::1111:2222:3333:4444:5555:6666::'::text::ipaddress;\nselect '::256.2.3.4'::text::ipaddress;\nselect '::260.2.3.4'::text::ipaddress;\nselect '::300.2.3.4'::text::ipaddress;\nselect '::300.300.300.300'::text::ipaddress;\nselect '::3000.30.30.30'::text::ipaddress;\nselect '::400.2.3.4'::text::ipaddress;\nselect '::5555:'::text::ipaddress;\nselect '::900.2.3.4'::text::ipaddress;\nselect ':::'::text::ipaddress;\nselect ':::5555'::text::ipaddress;\nselect '::ffff:2.3.4'::text::ipaddress;\nselect '::ffff:257.1.2.3'::text::ipaddress;\nselect 'FF01::101::2'::text::ipaddress;\nselect 'FF02:0000:0000:0000:0000:0000:0000:0000:0001'::text::ipaddress;\nselect 'ldkfj'::text::ipaddress;\n\n-- numeric casts\n\nselect n::ip4 from (select 0::bigint as n) s;\nselect n::ip4 from (select 256::bigint as n) s;\nselect n::ip4 from (select 65536::bigint as n) s;\nselect n::ip4 from (select 16777216::bigint as n) s;\nselect n::ip4 from (select -1::bigint as n) s;\nselect n::ip4 from (select -2147483647::bigint as n) s;\nselect n::ip4 from (select -2147483648::bigint as n) s;\nselect n::ip4 from (select 2147483647::bigint as n) s;\nselect n::ip4 from (select 2147483648::bigint as n) s;\nselect n::ip4 from (select 4294967295::bigint as n) s;\n\nselect n::ip4 from (select 0::float8 as n) s;\nselect n::ip4 from (select 256::float8 as n) s;\nselect n::ip4 from (select 65536::float8 as n) s;\nselect n::ip4 from (select 16777216::float8 as n) s;\nselect n::ip4 from (select -1::float8 as n) s;\nselect n::ip4 from (select -2147483647::float8 as n) s;\nselect n::ip4 from (select -2147483648::float8 as n) s;\nselect n::ip4 from (select 2147483647::float8 as n) s;\nselect n::ip4 from (select 2147483648::float8 as n) s;\nselect n::ip4 from (select 4294967295::float8 as n) s;\n\nselect n::ip4 from (select 0::numeric as n) s;\nselect n::ip4 from (select 256::numeric as n) s;\nselect n::ip4 from (select 65536::numeric as n) s;\nselect n::ip4 from (select 16777216::numeric as n) s;\nselect n::ip4 from (select -1::numeric as n) s;\nselect n::ip4 from (select -2147483647::numeric as n) s;\nselect n::ip4 from (select -2147483648::numeric as n) s;\nselect n::ip4 from (select 2147483647::numeric as n) s;\nselect n::ip4 from (select 2147483648::numeric as n) s;\nselect n::ip4 from (select 4294967295::numeric as n) s;\n\nselect n::ip6 from (select 0::numeric as n) s;\nselect n::ip6 from (select 256::numeric as n) s;\nselect n::ip6 from (select 65536::numeric as n) s;\nselect n::ip6 from (select 16777216::numeric as n) s;\nselect n::ip6 from (select 4294967296::numeric as n) s;\nselect n::ip6 from (select 281474976710656::numeric as n) s;\nselect n::ip6 from (select 18446744073709551616::numeric as n) s;\nselect n::ip6 from (select 1208925819614629174706176::numeric as n) s;\nselect n::ip6 from (select 79228162514264337593543950336::numeric as n) s;\nselect n::ip6 from (select 5192296858534827628530496329220096::numeric as n) s;\nselect n::ip6 from (select 170141183460469231731687303715884105728::numeric as n) s;\nselect n::ip6 from (select 340282366920938463463374607431768211455::numeric as n) s;\n\nselect a::numeric, a::ipaddress::numeric, a::bigint, a::float8 from (select '0.0.0.0'::ip4 as a) s;\nselect a::numeric, a::ipaddress::numeric, a::bigint, a::float8 from (select '255.255.255.255'::ip4 as a) s;\nselect a::numeric, a::ipaddress::numeric, a::bigint, a::float8 from (select '0.0.0.1'::ip4 as a) s;\nselect a::numeric, a::ipaddress::numeric, a::bigint, a::float8 from (select '0.0.1.0'::ip4 as a) s;\nselect a::numeric, a::ipaddress::numeric, a::bigint, a::float8 from (select '0.1.0.0'::ip4 as a) s;\nselect a::numeric, a::ipaddress::numeric, a::bigint, a::float8 from (select '1.0.0.0'::ip4 as a) s;\n\nselect a::numeric, a::ipaddress::numeric from (select '::'::ip6 as a) s;\nselect a::numeric, a::ipaddress::numeric from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6 as a) s;\nselect a::numeric, a::ipaddress::numeric from (select '::1'::ip6 as a) s;\nselect a::numeric, a::ipaddress::numeric from (select '::1:0'::ip6 as a) s;\nselect a::numeric, a::ipaddress::numeric from (select '::1:0:0'::ip6 as a) s;\nselect a::numeric, a::ipaddress::numeric from (select '::1:0:0:0'::ip6 as a) s;\nselect a::numeric, a::ipaddress::numeric from (select '0:0:0:1::'::ip6 as a) s;\nselect a::numeric, a::ipaddress::numeric from (select '0:0:1::'::ip6 as a) s;\nselect a::numeric, a::ipaddress::numeric from (select '0:1::'::ip6 as a) s;\nselect a::numeric, a::ipaddress::numeric from (select '1::'::ip6 as a) s;\n\n-- invalid numeric casts\n\nselect (-4294967295::bigint)::ip4;\nselect (4294967296::bigint)::ip4;\n\nselect 0.1::float8::ip4;\nselect (-0.1)::float8::ip4;\nselect (-4294967295::float8)::ip4;\nselect (4294967296::float8)::ip4;\nselect (-3000000000::float8)::ip4;\nselect 6000000000::float8::ip4;\nselect 6e10::float8::ip4;\nselect 6e30::float8::ip4;\n\nselect (-1::numeric)::ip6;\nselect 340282366920938463463374607431768211456::numeric::ip6;\nselect 0.1::numeric::ip6;\nselect 0.00000000000000000001::numeric::ip6;\nselect (-0.00000000000000000001::numeric)::ip6;\n\n-- inet/cidr casts\n\nselect a::ip4, a::ipaddress from (select '0.0.0.0'::inet as a) s;\nselect a::ip4, a::ipaddress from (select '1.2.3.4'::inet as a) s;\nselect a::ip4, a::ipaddress from (select '255.255.255.255'::inet as a) s;\nselect a::ip4, a::ipaddress from (select '10.20.30.40/24'::inet as a) s;\nselect a::ip4, a::ipaddress from (select '10.20.30.40/16'::inet as a) s;\n\nselect a::ip6, a::ipaddress from (select '::'::inet as a) s;\nselect a::ip6, a::ipaddress from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::inet as a) s;\nselect a::ip6, a::ipaddress from (select '::1'::inet as a) s;\nselect a::ip6, a::ipaddress from (select '1234:2345:3456:4567:5678:6789:789a:89ab'::inet as a) s;\nselect a::ip6, a::ipaddress from (select '1234:2345:3456:4567:5678:6789:789a:89ab/96'::inet as a) s;\nselect a::ip6, a::ipaddress from (select '1234:2345:3456:4567:5678:6789:789a:89ab/64'::inet as a) s;\nselect a::ip6, a::ipaddress from (select '1234:2345:3456:4567:5678:6789:789a:89ab/32'::inet as a) s;\n\nselect a::ip4r, a::iprange from (select '0.0.0.0/16'::cidr as a) s;\nselect a::ip4r, a::iprange from (select '0.1.0.0/16'::cidr as a) s;\nselect a::ip4r, a::iprange from (select '1.2.3.0/24'::cidr as a) s;\nselect a::ip4r, a::iprange from (select '0.0.0.0/0'::cidr as a) s;\n\nselect a::ip6r, a::iprange from (select '::/0'::cidr as a) s;\nselect a::ip6r, a::iprange from (select 'ffff::/64'::cidr as a) s;\nselect a::ip6r, a::iprange from (select '0:0:0:0:ffff::/128'::cidr as a) s;\nselect a::ip6r, a::iprange from (select '1234:2345:3456:4567:5678:6789::/96'::cidr as a) s;\n\nselect '1.2.3.4'::ip4::cidr;\nselect '0.0.0.0'::ip4::cidr;\nselect '255.255.255.255'::ip4::cidr;\n\nselect '1.2.3.0/24'::ip4r::cidr;\nselect '0.0.0.0/0'::ip4r::cidr;\nselect '255.255.255.255/32'::ip4r::cidr;\n\nselect '1234:2345:3456:4567:5678:6789:789a:89ab'::ip6::cidr;\nselect '::'::ip6::cidr;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6::cidr;\n\nselect '1234:2345:3456:4567:5678:6789:789a:0000/112'::ip6r::cidr;\nselect '::/0'::ip6r::cidr;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::ip6r::cidr;\nselect 'ffff:ffff:ffff::/48'::ip6r::cidr;\n\nselect '1.2.3.4'::ipaddress::cidr;\nselect '0.0.0.0'::ipaddress::cidr;\nselect '255.255.255.255'::ipaddress::cidr;\nselect '1234:2345:3456:4567:5678:6789:789a:89ab'::ipaddress::cidr;\nselect '::'::ipaddress::cidr;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ipaddress::cidr;\n\nselect '1.2.3.0/24'::iprange::cidr;\nselect '0.0.0.0/0'::iprange::cidr;\nselect '255.255.255.255/32'::iprange::cidr;\nselect '1234:2345:3456:4567:5678:6789:789a:0000/112'::iprange::cidr;\nselect '::/0'::iprange::cidr;\nselect 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::iprange::cidr;\nselect 'ffff:ffff:ffff::/48'::iprange::cidr;\n\nselect '-'::iprange::cidr;\n\n-- invalid inet/cidr casts\n\nselect '::'::inet::ip4;\nselect '0.0.0.0'::inet::ip6;\nselect '::/128'::cidr::ip4r;\nselect '0.0.0.0/32'::cidr::ip6r;\n\n-- invalid cross-type casts\n\nselect '::/0'::iprange::ip4r;\nselect '0.0.0.0/0'::iprange::ip6r;\n\nselect '::'::ipaddress::ip4;\nselect '0.0.0.0'::ipaddress::ip6;\n\n-- bit casts\n\nselect (x'01020304')::ip4;\nselect (x'fff0fff1fff2fff3000000000000fff4')::ip6;\nselect (x'01020304')::ipaddress;\nselect (x'fff0fff1fff2fff3000000000000fff4')::ipaddress;\n\nselect (b'0001')::varbit::ip4r;\nselect (b'0001')::varbit::ip6r;\nselect (x'fff0fff1fff2fff3000000000000fff')::varbit::ip6r;\n\nselect (ip4 '1.2.3.4')::varbit;\nselect (ip6 'fff0:fff1:fff2:fff3::fff4')::varbit;\nselect (ipaddress '1.2.3.4')::varbit;\nselect (ipaddress 'fff0:fff1:fff2:fff3::fff4')::varbit;\n\nselect (ip4r '1.2.3.0/24')::varbit;\nselect (ip6r 'fff0::/12')::varbit;\nselect (ip6r 'fff0::/127')::varbit;\n\nselect (iprange '-')::varbit;\nselect (iprange '1.2.3.0/24')::varbit;\nselect (iprange '1.2.3.1-1.2.3.2')::varbit;\nselect (iprange 'fff0::/12')::varbit;\nselect (iprange 'fff0::0001-fff0::0002')::varbit;\n\n-- invalid bit casts\n\nselect (x'0102030')::ip4;\nselect (x'0102030405')::ip4;\nselect (x'fff0fff1fff2fff3000000000000fff')::ip6;\nselect (x'fff0fff1fff2fff3000000000000fff4f')::ip6;\nselect (x'0102030')::ipaddress;\nselect (x'0102030405')::ipaddress;\nselect (x'fff0fff1fff2fff3000000000000fff')::ipaddress;\nselect (x'fff0fff1fff2fff3000000000000fff4f')::ipaddress;\n\n-- bytea casts\n\nselect (decode('01020304','hex'))::ip4;\nselect (decode('fff0fff1fff2fff3000000000000fff4','hex'))::ip6;\nselect (decode('01020304','hex'))::ipaddress;\nselect (decode('fff0fff1fff2fff3000000000000fff4','hex'))::ipaddress;\n\nselect encode((ip4 '1.2.3.4')::bytea,'hex');\nselect encode((ip6 'fff0:fff1:fff2:fff3::fff4')::bytea,'hex');\nselect encode((ipaddress '1.2.3.4')::bytea,'hex');\nselect encode((ipaddress 'fff0:fff1:fff2:fff3::fff4')::bytea,'hex');\n\n-- invalid bytea casts\n\nselect (decode('010203','hex'))::ip4;\nselect (decode('0102030405','hex'))::ip4;\nselect (decode('fff0fff1fff2fff3000000000000ff','hex'))::ip6;\nselect (decode('0102030405','hex'))::ipaddress;\nselect (decode('fff0fff1fff2fff3000000000000ff','hex'))::ipaddress;\nselect (decode('fff0fff1fff2fff3000000000000ffffff','hex'))::ipaddress;\n\n-- constructor functions\n\nselect ip4r('0.0.0.0','255.255.255.255');\nselect ip4r('255.255.255.255','0.0.0.0');\nselect ip4r('1.2.3.4','5.6.7.8');\n\nselect ip6r('::','ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff');\nselect ip6r('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff','::');\nselect ip6r('1234:2345:3456:4567:5678:6789:789a:89ab','ffff::ffff');\n\nselect iprange('0.0.0.0'::ip4,'255.255.255.255'::ip4);\nselect iprange('255.255.255.255'::ip4,'0.0.0.0'::ip4);\nselect iprange('1.2.3.4'::ip4,'5.6.7.8'::ip4);\nselect iprange('::'::ip6,'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6);\nselect iprange('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ip6,'::'::ip6);\nselect iprange('1234:2345:3456:4567:5678:6789:789a:89ab'::ip6,'ffff::ffff'::ip6);\n\nselect iprange('0.0.0.0'::ipaddress,'255.255.255.255'::ipaddress);\nselect iprange('255.255.255.255'::ipaddress,'0.0.0.0'::ipaddress);\nselect iprange('1.2.3.4'::ipaddress,'5.6.7.8'::ipaddress);\nselect iprange('::'::ipaddress,'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ipaddress);\nselect iprange('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'::ipaddress,'::'::ipaddress);\nselect iprange('1234:2345:3456:4567:5678:6789:789a:89ab'::ipaddress,'ffff::ffff'::ipaddress);\n\n-- utility functions\n\n-- (family, lower, upper were tested above)\n\nselect ip4_netmask(0), ip4_netmask(1), ip4_netmask(31), ip4_netmask(32);\nselect ip4_netmask(33);\nselect ip4_netmask(-1);\n\nselect ip6_netmask(0), ip6_netmask(1);\nselect ip6_netmask(63), ip6_netmask(64), ip6_netmask(65);\nselect ip6_netmask(127), ip6_netmask(128);\nselect ip6_netmask(129);\nselect ip6_netmask(-1);\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '1.2.3.4-5.6.7.8'::ip4r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '1.2.3.0-1.2.3.255'::ip4r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '0.0.0.0/32'::ip4r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '0.0.0.0/31'::ip4r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '0.0.0.0/1'::ip4r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '0.0.0.0/0'::ip4r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '255.255.255.255/32'::ip4r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '255.255.255.254/31'::ip4r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '128.0.0.0/1'::ip4r as a) s;\n\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '1234::-5678::ffff:0'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '::1234-::5678'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff::-ffff::ffff:0'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff::-ffff::ffff'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff::-ffff:0:0:0:ffff:ffff:ffff:ffff'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff::-ffff:0:0:1:ffff:ffff:ffff:ffff'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '::/128'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '::/127'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '::/1'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select '::/0'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe/127'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff:ffff:ffff:ffff:8000::/65'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff:ffff:ffff:ffff::/64'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff:ffff:ffff:fffe::/63'::ip6r as a) s;\nselect is_cidr(a), is_cidr(a::iprange), masklen(a), masklen(a::iprange) from (select 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128'::ip6r as a) s;\n\nselect ip4_net_lower('255.255.255.255',0);\nselect ip4_net_lower('255.255.255.255',1);\nselect ip4_net_lower('255.255.255.255',24);\nselect ip4_net_lower('255.255.255.255',31);\nselect ip4_net_lower('255.255.255.255',32);\nselect ip4_net_lower('255.255.255.255',33);\nselect ip4_net_lower('255.255.255.255',-1);\nselect ip4_net_upper('0.0.0.0',0);\nselect ip4_net_upper('0.0.0.0',1);\nselect ip4_net_upper('0.0.0.0',24);\nselect ip4_net_upper('0.0.0.0',31);\nselect ip4_net_upper('0.0.0.0',32);\nselect ip4_net_upper('0.0.0.0',33);\nselect ip4_net_upper('0.0.0.0',-1);\n\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',0);\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',1);\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',63);\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',64);\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',65);\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',127);\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',128);\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',129);\nselect ip6_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',-1);\nselect ip6_net_upper('::',0);\nselect ip6_net_upper('::',1);\nselect ip6_net_upper('::',63);\nselect ip6_net_upper('::',64);\nselect ip6_net_upper('::',65);\nselect ip6_net_upper('::',127);\nselect ip6_net_upper('::',128);\nselect ip6_net_upper('::',129);\nselect ip6_net_upper('::',-1);\n\nselect ipaddress_net_lower('255.255.255.255',0);\nselect ipaddress_net_lower('255.255.255.255',1);\nselect ipaddress_net_lower('255.255.255.255',24);\nselect ipaddress_net_lower('255.255.255.255',31);\nselect ipaddress_net_lower('255.255.255.255',32);\nselect ipaddress_net_lower('255.255.255.255',33);\nselect ipaddress_net_lower('255.255.255.255',-1);\nselect ipaddress_net_upper('0.0.0.0',0);\nselect ipaddress_net_upper('0.0.0.0',1);\nselect ipaddress_net_upper('0.0.0.0',24);\nselect ipaddress_net_upper('0.0.0.0',31);\nselect ipaddress_net_upper('0.0.0.0',32);\nselect ipaddress_net_upper('0.0.0.0',33);\nselect ipaddress_net_upper('0.0.0.0',-1);\n\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',0);\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',1);\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',63);\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',64);\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',65);\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',127);\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',128);\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',129);\nselect ipaddress_net_lower('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',-1);\nselect ipaddress_net_upper('::',0);\nselect ipaddress_net_upper('::',1);\nselect ipaddress_net_upper('::',63);\nselect ipaddress_net_upper('::',64);\nselect ipaddress_net_upper('::',65);\nselect ipaddress_net_upper('::',127);\nselect ipaddress_net_upper('::',128);\nselect ipaddress_net_upper('::',129);\nselect ipaddress_net_upper('::',-1);\n\nselect ip4r_union('1.0.0.0/24','2.0.0.0/16');\nselect ip4r_union('0.0.0.0/0','2.0.0.0/16');\nselect ip4r_union('0.0.0.0-3.0.0.0','2.0.0.0-4.0.0.0');\n\nselect ip6r_union('2000::/16','3000::/16');\nselect ip6r_union('2000::-4000::','3000::-5000::');\nselect ip6r_union('::/0','3000::-5000::');\n\nselect iprange_union('0.0.0.0/0','::/0');\nselect iprange_union('128.0.0.0/32','8000::/16');\nselect iprange_union('1.0.0.0/24','2.0.0.0/16');\nselect iprange_union('0.0.0.0/0','2.0.0.0/16');\nselect iprange_union('0.0.0.0-3.0.0.0','2.0.0.0-4.0.0.0');\nselect iprange_union('2000::/16','3000::/16');\nselect iprange_union('2000::-4000::','3000::-5000::');\nselect iprange_union('::/0','3000::-5000::');\n\nselect ip4r_inter('1.0.0.0/24','2.0.0.0/16');\nselect ip4r_inter('0.0.0.0/0','2.0.0.0/16');\nselect ip4r_inter('0.0.0.0-3.0.0.0','2.0.0.0-4.0.0.0');\n\nselect ip6r_inter('2000::/16','3000::/16');\nselect ip6r_inter('2000::-4000::','3000::-5000::');\nselect ip6r_inter('::/0','3000::-5000::');\n\nselect iprange_inter('0.0.0.0/0','::/0');\nselect iprange_inter('128.0.0.0/32','8000::/16');\nselect iprange_inter('1.0.0.0/24','2.0.0.0/16');\nselect iprange_inter('0.0.0.0/0','2.0.0.0/16');\nselect iprange_inter('0.0.0.0-3.0.0.0','2.0.0.0-4.0.0.0');\nselect iprange_inter('2000::/16','3000::/16');\nselect iprange_inter('2000::-4000::','3000::-5000::');\nselect iprange_inter('::/0','3000::-5000::');\n\n-- split\n\nselect * from cidr_split(ip4r '1.2.3.4-5.6.7.8');\nselect * from cidr_split(ip4r '1.2.3.5-5.6.7.7');\nselect * from cidr_split(ip4r '1.0.0.0-1.0.255.255');\nselect * from cidr_split(ip4r '0.0.0.0-255.255.255.255');\nselect * from cidr_split(ip4r '0.0.0.0-0.0.0.9');\nselect * from cidr_split(ip4r '255.255.255.251-255.255.255.255');\n\nselect * from cidr_split(ip6r 'ffff::1234-ffff::1243');\nselect * from cidr_split(ip6r 'ffff:0:0:1234::-ffff:0:0:1243::');\nselect * from cidr_split(ip6r 'aaaa::cdef-aaaa::fedc');\nselect * from cidr_split(ip6r 'ffff:0:0:aaaa::/64');\nselect * from cidr_split(ip6r '::-::0009');\nselect * from cidr_split(ip6r 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff3-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff');\n\nselect * from cidr_split(iprange '1.2.3.4-5.6.7.8');\nselect * from cidr_split(iprange '1.2.3.5-5.6.7.7');\nselect * from cidr_split(iprange 'ffff::1234-ffff::1243');\nselect * from cidr_split(iprange 'aaaa::cdef-aaaa::fedc');\nselect * from cidr_split(iprange '1.0.0.0/16');\nselect * from cidr_split(iprange 'ffff:0:0:aaaa::/64');\nselect * from cidr_split(iprange '-');\n\n-- rescan\n\nwith d(a) as (values (ip4r '1.2.3.4-1.2.4.3'),(ip4r '10.2.3.5-10.2.4.4'))\nselect *, (select * from cidr_split(a) limit 1) as s from d;\n\nwith d(a) as (values (ip6r 'ffff::1234-ffff::1243'),(ip6r 'aaaa::cdef-aaaa::fedc'))\nselect *, (select * from cidr_split(a) limit 1) as s from d;\n\nwith d(a) as (values (iprange '-'),(iprange '1.2.3.4-1.2.4.3'),\n                     (iprange 'aaaa::fedc-aaaa::cdef'),(iprange '-'))\nselect *, (select * from cidr_split(a) limit 1) as s from d;\n\n-- operators\n\nselect ip4 '255.255.255.255' / 32;\nselect ip4 '255.255.255.255' / 31;\nselect ip4 '255.255.255.255' / 16;\nselect ip4 '255.255.255.255' / 0;\nselect ip4 '255.255.255.255' / 1;\nselect ip4 '255.255.255.255' / 33;\nselect ip4 '255.255.255.255' / -1;\n\nselect ip4 '255.255.255.255' / ip4 '255.255.255.0';\nselect ip4 '255.255.255.255' / ip4 '255.0.0.0';\n\nselect ip4 '255.255.255.255' / ip4 '0.255.255.255';\nselect ip4 '255.255.255.255' / ip4 '255.254.255.255';\n\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 128;\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 127;\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 65;\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 64;\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 63;\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 1;\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 0;\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 129;\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / -1;\n\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ip6 'ffff:ffff:ffff:ffff:ffff::';\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ip6 'ffff:ffff:ffff::';\n\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ip6 'ffff:ffff:ffff:ffff:ffff::ffff';\nselect ip6 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ip6 'ffff:ffff:ffff::ffff';\n\nselect ipaddress '255.255.255.255' / 32;\nselect ipaddress '255.255.255.255' / 31;\nselect ipaddress '255.255.255.255' / 16;\nselect ipaddress '255.255.255.255' / 0;\nselect ipaddress '255.255.255.255' / 1;\nselect ipaddress '255.255.255.255' / 33;\nselect ipaddress '255.255.255.255' / -1;\n\nselect ipaddress '255.255.255.255' / ipaddress '255.255.255.0';\nselect ipaddress '255.255.255.255' / ipaddress '255.0.0.0';\n\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 128;\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 127;\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 65;\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 64;\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 63;\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 1;\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 0;\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / 129;\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / -1;\n\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ipaddress 'ffff:ffff:ffff:ffff:ffff::';\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ipaddress 'ffff:ffff:ffff::';\n\nselect ipaddress '255.255.255.255' / ipaddress '0.255.255.255';\nselect ipaddress '255.255.255.255' / ipaddress '255.254.255.255';\n\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ipaddress 'ffff:ffff:ffff:ffff:ffff::ffff';\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ipaddress 'ffff:ffff:ffff::ffff';\n\nselect ipaddress 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' / ipaddress '0.0.0.0';\nselect ipaddress '255.255.255.255' / ipaddress '::';\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '0.0.0.0/32'::ip4r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '0.0.0.0/31'::ip4r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '0.0.0.0/16'::ip4r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '0.0.0.0/1'::ip4r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '0.0.0.0/0'::ip4r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '1.2.3.4-5.6.7.8'::ip4r as a) s;\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/128'::ip6r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/127'::ip6r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/65'::ip6r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/64'::ip6r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/63'::ip6r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/1'::ip6r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select '::/0'::ip6r as a) s;\n\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select 'ffff:ffff:ffff:ffff::-ffff:ffff:ffff:ffff:8000::'::ip6r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select 'ffff:ffff:ffff::-ffff:ffff:ffff:8000::'::ip6r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select 'ffff:ffff::-ffff:ffff:8000::'::ip6r as a) s;\nselect @ a, @@ a, @ (a::iprange), @@ (a::iprange) from (select 'ffff::-ffff:8000::'::ip6r as a) s;\n\nselect @ a, @@ a from (select '-'::iprange as a) s;\n\n-- bitwise ops\n\nselect a & b, a::ipaddress & b::ipaddress from (select ip4 '1.2.3.4' as a, ip4 '255.0.255.0' as b) s;\nselect a | b, a::ipaddress | b::ipaddress from (select ip4 '1.2.3.4' as a, ip4 '255.0.255.0' as b) s;\nselect a # b, a::ipaddress # b::ipaddress from (select ip4 '1.2.3.4' as a, ip4 '255.0.255.0' as b) s;\nselect ~a, ~(a::ipaddress) from (select ip4 '1.2.3.4' as a) s;\n\n\nselect a & b, a::ipaddress & b::ipaddress from (select ip6 '1234::5678' as a, ip6 'ffff:0000:ffff:0000:ffff:0000:ffff:0000' as b) s;\nselect a | b, a::ipaddress | b::ipaddress from (select ip6 '1234::5678' as a, ip6 'ffff:0000:ffff:0000:ffff:0000:ffff:0000' as b) s;\nselect a # b, a::ipaddress # b::ipaddress from (select ip6 '1234::5678' as a, ip6 'ffff:0000:ffff:0000:ffff:0000:ffff:0000' as b) s;\nselect ~a, ~(a::ipaddress) from (select ip6 '1234::5678' as a) s;\n\n-- arithmetic\n\nselect a + 1234, a::ipaddress + 1234 from (select ip4 '0.0.0.0' as a) s;\nselect a + 1, a::ipaddress + 1 from (select ip4 '255.255.255.254' as a) s;\nselect a + 1 from (select ip4 '255.255.255.255' as a) s;\nselect a::ipaddress + 1 from (select ip4 '255.255.255.255' as a) s;\n\nselect a - 1234, a::ipaddress - 1234 from (select ip4 '1.0.0.0' as a) s;\nselect a - 1, a::ipaddress - 1 from (select ip4 '0.0.0.1' as a) s;\nselect a - 1 from (select ip4 '0.0.0.0' as a) s;\nselect a::ipaddress - 1 from (select ip4 '0.0.0.0' as a) s;\n\nselect a + 1234::bigint, a::ipaddress + 1234::bigint from (select ip4 '0.0.0.0' as a) s;\nselect a + 1::bigint, a::ipaddress + 1::bigint from (select ip4 '255.255.255.254' as a) s;\nselect a + 1::bigint from (select ip4 '255.255.255.255' as a) s;\nselect a::ipaddress + 1::bigint from (select ip4 '255.255.255.255' as a) s;\nselect a + 4294967296::bigint from (select ip4 '0.0.0.0' as a) s;\nselect a::ipaddress + 4294967296::bigint from (select ip4 '0.0.0.0' as a) s;\n\nselect a - 1234::bigint, a::ipaddress - 1234::bigint from (select ip4 '1.0.0.0' as a) s;\nselect a - 1::bigint, a::ipaddress - 1::bigint from (select ip4 '0.0.0.1' as a) s;\nselect a - 1::bigint from (select ip4 '0.0.0.0' as a) s;\nselect a::ipaddress - 1::bigint from (select ip4 '0.0.0.0' as a) s;\nselect a - 4294967296::bigint from (select ip4 '255.255.255.255' as a) s;\nselect a::ipaddress - 4294967296::bigint from (select ip4 '255.255.255.255' as a) s;\n\nselect a + 1234::numeric, a::ipaddress + 1234::numeric from (select ip4 '0.0.0.0' as a) s;\nselect a + 1::numeric, a::ipaddress + 1::numeric from (select ip4 '255.255.255.254' as a) s;\nselect a + 1::numeric from (select ip4 '255.255.255.255' as a) s;\nselect a::ipaddress + 1::numeric from (select ip4 '255.255.255.255' as a) s;\nselect a + 4294967296::numeric from (select ip4 '0.0.0.0' as a) s;\nselect a::ipaddress + 4294967296::numeric from (select ip4 '0.0.0.0' as a) s;\n\nselect a - 1234::numeric, a::ipaddress - 1234::numeric from (select ip4 '1.0.0.0' as a) s;\nselect a - 1::numeric, a::ipaddress - 1::numeric from (select ip4 '0.0.0.1' as a) s;\nselect a - 1::numeric from (select ip4 '0.0.0.0' as a) s;\nselect a::ipaddress - 1::numeric from (select ip4 '0.0.0.0' as a) s;\nselect a - 4294967296::bigint from (select ip4 '255.255.255.255' as a) s;\nselect a::ipaddress - 4294967296::bigint from (select ip4 '255.255.255.255' as a) s;\n\n-- predicates and indexing\n\ncreate table ipranges (r iprange, r4 ip4r, r6 ip6r);\n\ninsert into ipranges\nselect r, null, r\n  from (select ip6r(regexp_replace(ls, E'(....(?!$))', E'\\\\1:', 'g')::ip6,\n                    regexp_replace(substring(ls for n+1) || substring(us from n+2),\n                                   E'(....(?!$))', E'\\\\1:', 'g')::ip6) as r\n          from (select md5(i || ' lower 1') as ls,\n                       md5(i || ' upper 1') as us,\n                       (i % 11) + (i/11 % 11) + (i/121 % 11) as n\n                  from generate_series(1,13310) i) s1) s2;\n\ninsert into ipranges\nselect r, r, null\n  from (select ip4r(ip4 '0.0.0.0' + ((la & '::ffff:ffff') - ip6 '::'),\n                    ip4 '0.0.0.0' + ((( (la & ip6_netmask(127-n)) | (ua & ~ip6_netmask(127-n)) ) & '::ffff:ffff') - ip6 '::')) as r\n          from (select regexp_replace(md5(i || ' lower 2'), E'(....(?!$))', E'\\\\1:', 'g')::ip6 as la,\n                       regexp_replace(md5(i || ' upper 2'), E'(....(?!$))', E'\\\\1:', 'g')::ip6 as ua,\n                       (i % 11) + (i/11 % 11) + (i/121 % 11) as n\n                  from generate_series(1,1331) i) s1) s2;\n\ninsert into ipranges\nselect r, null, r\n  from (select n::ip6 / 68 as r\n          from (select ((8192 + i/256)::numeric * (2::numeric ^ 112)\n                       + (131072 + (i % 256))::numeric * (2::numeric ^ 60)) as n\n                  from generate_series(0,4095) i) s1) s2;\n\ninsert into ipranges\nselect r, r, null\n  from (select n / 28 as r\n          from (select ip4 '172.16.0.0' + (i * 256) as n\n                  from generate_series(0,4095) i) s1) s2;\n\ninsert into ipranges\nselect r, null, r\n  from (select n::ip6 / 48 as r\n          from (select ((8192 + i/256)::numeric * (2::numeric ^ 112)\n                       + (i % 256)::numeric * (2::numeric ^ 84)) as n\n                  from generate_series(0,4095) i) s1) s2;\n\ninsert into ipranges\nselect r, r, null\n  from (select n / 16 as r\n          from (select ip4 '128.0.0.0' + (i * 65536) as n\n                  from generate_series(0,4095) i) s1) s2;\n\ninsert into ipranges values ('-',null,null);\n\ncreate table ipaddrs (a ipaddress, a4 ip4, a6 ip6);\n\ninsert into ipaddrs\nselect a, null, a\n  from (select regexp_replace(md5(i || ' address 1'), E'(....(?!$))', E'\\\\1:', 'g')::ip6 as a\n          from generate_series(1,256) i) s1;\n\ninsert into ipaddrs\nselect a, a, null\n  from (select ip4 '0.0.0.0' + ((regexp_replace(md5(i || ' address 1'), E'(....(?!$))', E'\\\\1:', 'g')::ip6 & '::ffff:ffff') - '::') as a\n          from generate_series(1,16) i) s1;\n\nselect * from ipranges where r >>= '5555::' order by r;\nselect * from ipranges where r <<= '5555::/16' order by r;\nselect * from ipranges where r && '5555::/16' order by r;\nselect * from ipranges where r6 >>= '5555::' order by r6;\nselect * from ipranges where r6 <<= '5555::/16' order by r6;\nselect * from ipranges where r6 && '5555::/16' order by r6;\nselect * from ipranges where r >>= '172.16.2.0' order by r;\nselect * from ipranges where r <<= '10.0.0.0/12' order by r;\nselect * from ipranges where r && '10.128.0.0/12' order by r;\nselect * from ipranges where r4 >>= '172.16.2.0' order by r4;\nselect * from ipranges where r4 <<= '10.0.0.0/12' order by r4;\nselect * from ipranges where r4 && '10.128.0.0/12' order by r4;\n\nselect * from ipranges where r >>= '2001:0:0:2000:a123::' order by r;\nselect * from ipranges where r >>= '2001:0:0:2000::' order by r;\nselect * from ipranges where r >>= '2001:0:0:2000::/68' order by r;\nselect * from ipranges where r >> '2001:0:0:2000::/68' order by r;\n\nselect * from ipranges where r6 >>= '2001:0:0:2000:a123::' order by r6;\nselect * from ipranges where r6 >>= '2001:0:0:2000::' order by r6;\nselect * from ipranges where r6 >>= '2001:0:0:2000::/68' order by r6;\nselect * from ipranges where r6 >> '2001:0:0:2000::/68' order by r6;\n\nselect * from ipranges where r4 >>= '172.16.2.0/28' order by r4;\nselect * from ipranges where r4 >> '172.16.2.0/28' order by r4;\n\nselect * from ipaddrs where a between '8.0.0.0' and '15.0.0.0' order by a;\nselect * from ipaddrs where a4 between '8.0.0.0' and '15.0.0.0' order by a4;\n\ncreate index ipranges_r on ipranges using gist (r);\ncreate index ipranges_r4 on ipranges using gist (r4);\ncreate index ipranges_r6 on ipranges using gist (r6);\ncreate index ipaddrs_a on ipaddrs (a);\ncreate index ipaddrs_a4 on ipaddrs (a4);\ncreate index ipaddrs_a6 on ipaddrs (a6);\n\nselect * from ipranges where r >>= '5555::' order by r;\nselect * from ipranges where r <<= '5555::/16' order by r;\nselect * from ipranges where r && '5555::/16' order by r;\nselect * from ipranges where r6 >>= '5555::' order by r6;\nselect * from ipranges where r6 <<= '5555::/16' order by r6;\nselect * from ipranges where r6 && '5555::/16' order by r6;\nselect * from ipranges where r >>= '172.16.2.0' order by r;\nselect * from ipranges where r <<= '10.0.0.0/12' order by r;\nselect * from ipranges where r && '10.128.0.0/12' order by r;\nselect * from ipranges where r4 >>= '172.16.2.0' order by r4;\nselect * from ipranges where r4 <<= '10.0.0.0/12' order by r4;\nselect * from ipranges where r4 && '10.128.0.0/12' order by r4;\n\nselect * from ipranges where r >>= '2001:0:0:2000:a123::' order by r;\nselect * from ipranges where r >>= '2001:0:0:2000::' order by r;\nselect * from ipranges where r >>= '2001:0:0:2000::/68' order by r;\nselect * from ipranges where r >> '2001:0:0:2000::/68' order by r;\n\nselect * from ipranges where r6 >>= '2001:0:0:2000:a123::' order by r6;\nselect * from ipranges where r6 >>= '2001:0:0:2000::' order by r6;\nselect * from ipranges where r6 >>= '2001:0:0:2000::/68' order by r6;\nselect * from ipranges where r6 >> '2001:0:0:2000::/68' order by r6;\n\nselect * from ipranges where r4 >>= '172.16.2.0/28' order by r4;\nselect * from ipranges where r4 >> '172.16.2.0/28' order by r4;\n\nselect * from ipaddrs where a between '8.0.0.0' and '15.0.0.0' order by a;\nselect * from ipaddrs where a4 between '8.0.0.0' and '15.0.0.0' order by a4;\n\nselect * from ipaddrs a join ipranges r on (r.r >>= a.a) order by a,r;\nselect * from ipaddrs a join ipranges r on (r.r4 >>= a.a4) order by a4,r4;\nselect * from ipaddrs a join ipranges r on (r.r6 >>= a.a6) order by a6,r6;\n\n-- index-only, on versions that support it:\n\nvacuum ipranges;\n\nselect r from ipranges where r >>= '5555::' order by r;\nselect r6 from ipranges where r6 >>= '5555::' order by r6;\nselect r4 from ipranges where r4 >>= '172.16.2.0' order by r4;\n\n-- hashing\n\nselect lower(a / 4), count(*) from ipaddrs group by 1 order by 2,1;\nselect a4 & '240.0.0.0', count(*) from ipaddrs group by 1 order by 2,1;\nselect a6 & 'f000::', count(*) from ipaddrs group by 1 order by 2,1;\n\nselect a / 4, count(*) from ipaddrs group by 1 order by 2,1;\nselect a4 / 4, count(*) from ipaddrs group by 1 order by 2,1;\nselect a6 / 4, count(*) from ipaddrs group by 1 order by 2,1;\n\n-- comparison ops\n\nselect\n  sum((r < '2000::/48')::integer) as s_lt,\n  sum((r <= '2000::/48')::integer) as s_le,\n  sum((r = '2000::/48')::integer) as s_eq,\n  sum((r >= '2000::/48')::integer) as s_ge,\n  sum((r > '2000::/48')::integer) as s_gt,\n  sum((r <> '2000::/48')::integer) as s_ne\n  from ipranges;\n\nselect\n  sum((r6 < '2000::/48')::integer) as s_lt,\n  sum((r6 <= '2000::/48')::integer) as s_le,\n  sum((r6 = '2000::/48')::integer) as s_eq,\n  sum((r6 >= '2000::/48')::integer) as s_ge,\n  sum((r6 > '2000::/48')::integer) as s_gt,\n  sum((r6 <> '2000::/48')::integer) as s_ne\n  from ipranges;\n\nselect\n  sum((r4 < '172.16.0.0/28')::integer) as s_lt,\n  sum((r4 <= '172.16.0.0/28')::integer) as s_le,\n  sum((r4 = '172.16.0.0/28')::integer) as s_eq,\n  sum((r4 >= '172.16.0.0/28')::integer) as s_ge,\n  sum((r4 > '172.16.0.0/28')::integer) as s_gt,\n  sum((r4 <> '172.16.0.0/28')::integer) as s_ne\n  from ipranges;\n\nselect\n  sum((a < '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_lt,\n  sum((a <= '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_le,\n  sum((a = '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_eq,\n  sum((a >= '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_ge,\n  sum((a > '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_gt,\n  sum((a <> '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_ne\n  from ipaddrs;\n\nselect\n  sum((a6 < '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_lt,\n  sum((a6 <= '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_le,\n  sum((a6 = '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_eq,\n  sum((a6 >= '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_ge,\n  sum((a6 > '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_gt,\n  sum((a6 <> '8ecc:14db:7aba:bbde:f2a7:c4bc:7a1e:c8c1')::integer) as s_ne\n  from ipaddrs;\n\nselect\n  sum((a4 < '104.175.11.72')::integer) as s_lt,\n  sum((a4 <= '104.175.11.72')::integer) as s_le,\n  sum((a4 = '104.175.11.72')::integer) as s_eq,\n  sum((a4 >= '104.175.11.72')::integer) as s_ge,\n  sum((a4 > '104.175.11.72')::integer) as s_gt,\n  sum((a4 <> '104.175.11.72')::integer) as s_ne\n  from ipaddrs;\n\n-- end\n"
  },
  {
    "path": "src/ip4r.c",
    "content": "/* ip4r.c */\n\n#include \"postgres.h\"\n\n#include <math.h>\n#include <sys/socket.h>\n\n#include \"fmgr.h\"\n#include \"funcapi.h\"\n\n#include \"access/gist.h\"\n#include \"access/hash.h\"\n#include \"access/skey.h\"\n#include \"libpq/pqformat.h\"\n#include \"utils/builtins.h\"\n#include \"utils/elog.h\"\n#include \"utils/numeric.h\"\n#include \"utils/palloc.h\"\n#include \"utils/varbit.h\"\n\n#include \"ipr_internal.h\"\n#include \"ip4r_funcs.h\"\n\n/*\n * extract an IP range from text.\n */\nstatic\nbool ip4r_from_str(char *str, IP4R *ipr)\n{\n\tchar buf[IP4_STRING_MAX];\n\tint pos = strcspn(str, \"-/\");\n\tIP4 ip;\n\n\tswitch (str[pos])\n\t{\n\t\tcase 0:\t\t/* no separator, must be single ip4 addr */\n\t\t{\n\t\t\tif (!ip4_raw_input(str, &ip))\n\t\t\t\treturn false;\n\t\t\tipr->lower = ip;\n\t\t\tipr->upper = ip;\n\t\t\treturn true;\n\t\t}\n\n\t\tcase '-':\t/* lower-upper */\n\t\t{\n\t\t\tchar *rest = str + pos + 1;\n\n\t\t\tif (pos >= sizeof(buf))\n\t\t\t\treturn false;\n\t\t\tmemcpy(buf, str, pos);\n\t\t\tbuf[pos] = 0;\n\t\t\tif (!ip4_raw_input(buf, &ip))\n\t\t\t\treturn false;\n\t\t\tipr->lower = ip;\n\t\t\tif (!ip4_raw_input(rest, &ip))\n\t\t\t\treturn false;\n\t\t\tif (!ip4_lessthan(ip, ipr->lower))\n\t\t\t\tipr->upper = ip;\n\t\t\telse\n\t\t\t{\n\t\t\t\tipr->upper = ipr->lower;\n\t\t\t\tipr->lower = ip;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tcase '/':  /* prefix/len */\n\t\t{\n\t\t\tchar *rest = str + pos + 1;\n\t\t\tunsigned pfxlen;\n\t\t\tchar dummy;\n\n\t\t\tif (pos >= sizeof(buf))\n\t\t\t\treturn false;\n\t\t\tmemcpy(buf, str, pos);\n\t\t\tbuf[pos] = 0;\n\t\t\tif (!ip4_raw_input(buf, &ip))\n\t\t\t\treturn false;\n\t\t\tif (rest[strspn(rest,\"0123456789\")])\n\t\t\t\treturn false;\n\t\t\tif (sscanf(rest, \"%u%c\", &pfxlen, &dummy) != 1)\n\t\t\t\treturn false;\n\t\t\treturn ip4r_from_cidr(ip, pfxlen, ipr);\n\t\t}\n\n\t\tdefault:\n\t\t\treturn false;\t   /* can't happen */\n\t}\n}\n\n\n/* Output an ip range in text form\n */\nstatic inline\nint ip4r_to_str(IP4R *ipr, char *str, int slen)\n{\n\tchar buf1[IP4_STRING_MAX];\n\tchar buf2[IP4_STRING_MAX];\n\tunsigned msk;\n\n\tif (ip4_equal(ipr->lower, ipr->upper))\n\t\treturn ip4_raw_output(ipr->lower, str, slen);\n\n\tif ((msk = masklen(ipr->lower,ipr->upper)) <= 32)\n\t{\n\t\tip4_raw_output(ipr->lower, buf1, sizeof(buf1));\n\t\treturn snprintf(str, slen, \"%s/%u\", buf1, msk);\n\t}\n\n\tip4_raw_output(ipr->lower, buf1, sizeof(buf1));\n\tip4_raw_output(ipr->upper, buf2, sizeof(buf2));\n\n\treturn snprintf(str, slen, \"%s-%s\", buf1, buf2);\n}\n\n\n/**************************************************************************/\n/* This part handles all aspects of postgres interfacing.\n */\n\nstatic\ntext *\nmake_text(int len)\n{\n\ttext *ret = (text *) palloc0(len + VARHDRSZ);\n\tSET_VARSIZE(ret, len + VARHDRSZ);\n\treturn ret;\n}\n\nstatic inline\nvoid\nset_text_len(text *txt, int len)\n{\n\tAssert(len + VARHDRSZ <= VARSIZE(txt));\n\tif (len + VARHDRSZ <= VARSIZE(txt))\n\t\tSET_VARSIZE(txt, len + VARHDRSZ);\n}\n\n/*\n** Input/Output routines\n*/\n\nPG_FUNCTION_INFO_V1(ip4_in);\nDatum\nip4_in(PG_FUNCTION_ARGS)\n{\n\tchar *str = PG_GETARG_CSTRING(0);\n\tIP4 ip;\n\tif (ip4_raw_input(str, &ip))\n\t\tPG_RETURN_IP4(ip);\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP4 value: '%s'\", str)));\n}\n\nPG_FUNCTION_INFO_V1(ip4_out);\nDatum\nip4_out(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tchar *out = palloc(IP4_STRING_MAX);\n\tip4_raw_output(ip, out, IP4_STRING_MAX);\n\tPG_RETURN_CSTRING(out);\n}\n\nPG_FUNCTION_INFO_V1(ip4_recv);\nDatum\nip4_recv(PG_FUNCTION_ARGS)\n{\n\tStringInfo buf = (StringInfo) PG_GETARG_POINTER(0);\n\tPG_RETURN_IP4((IP4) pq_getmsgint(buf, sizeof(IP4)));\n}\n\nPG_FUNCTION_INFO_V1(ip4_send);\nDatum\nip4_send(PG_FUNCTION_ARGS)\n{\n\tIP4 arg1 = PG_GETARG_IP4(0);\n\tStringInfoData buf;\n\n\tpq_begintypsend(&buf);\n\tpq_sendint(&buf, arg1, sizeof(IP4));\n\tPG_RETURN_BYTEA_P(pq_endtypsend(&buf));\n}\n\nPG_FUNCTION_INFO_V1(ip4hash);\nDatum\nip4hash(PG_FUNCTION_ARGS)\n{\n\tIP4 arg1 = PG_GETARG_IP4(0);\n\n\treturn hash_any((unsigned char *)&arg1, sizeof(IP4));\n}\n\nPG_FUNCTION_INFO_V1(ip4_hash_extended);\nDatum\nip4_hash_extended(PG_FUNCTION_ARGS)\n{\n\tIP4 arg1 = PG_GETARG_IP4(0);\n\tuint64 seed = DatumGetUInt64(PG_GETARG_DATUM(1));\n\n\treturn hash_any_extended((unsigned char *)&arg1, sizeof(IP4), seed);\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_to_text);\nDatum\nip4_cast_to_text(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\ttext *out = make_text(IP4_STRING_MAX);\n\tset_text_len(out, ip4_raw_output(ip, VARDATA(out), IP4_STRING_MAX));\n\tPG_RETURN_TEXT_P(out);\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_from_text);\nDatum\nip4_cast_from_text(PG_FUNCTION_ARGS)\n{\n\ttext *txt = PG_GETARG_TEXT_PP(0);\n\tint tlen = VARSIZE_ANY_EXHDR(txt);\n\tchar buf[IP4_STRING_MAX];\n\n\tif (tlen < sizeof(buf))\n\t{\n\t\tIP4 ip;\n\n\t\tmemcpy(buf, VARDATA_ANY(txt), tlen);\n\t\tbuf[tlen] = 0;\n\t\tif (ip4_raw_input(buf, &ip))\n\t\t\tPG_RETURN_IP4(ip);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP4 value in text\")));\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_from_inet);\nDatum\nip4_cast_from_inet(PG_FUNCTION_ARGS)\n{\n\tinet *inetptr = PG_GETARG_INET_P(0);\n\tinet_struct *in = INET_STRUCT_DATA(inetptr);\n\n\tif (in->family == PGSQL_AF_INET)\n\t{\n\t\tunsigned char *p = in->ipaddr;\n\t\tIP4 ip = (p[0] << 24)|(p[1] << 16)|(p[2] << 8)|p[3];\n\t\tPG_RETURN_IP4(ip);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid INET value for conversion to IP4\")));\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_to_cidr);\nDatum\nip4_cast_to_cidr(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tinet *res = palloc0(VARHDRSZ + sizeof(inet_struct));\n\tinet_struct *in;\n\n\tSET_VARSIZE(res, VARHDRSZ + offsetof(inet_struct, ipaddr) + 4);\n\n\tin = ((inet_struct *)VARDATA(res));\n\tin->bits = 32;\n\tin->family = PGSQL_AF_INET;\n\t{\n\t\tunsigned char *p = in->ipaddr;\n\t\tp[0] = (ip >> 24) & 0xff;\n\t\tp[1] = (ip >> 16) & 0xff;\n\t\tp[2] = (ip >>  8) & 0xff;\n\t\tp[3] = (ip\t\t) & 0xff;\n\t}\n\n\tPG_RETURN_INET_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_to_bigint);\nDatum\nip4_cast_to_bigint(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tPG_RETURN_INT64(ip);\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_to_numeric);\nDatum\nip4_cast_to_numeric(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tint64 v = ip;\n\tPG_RETURN_DATUM(DirectFunctionCall1(int8_numeric, Int64GetDatumFast(v)));\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_from_bigint);\nDatum\nip4_cast_from_bigint(PG_FUNCTION_ARGS)\n{\n\tint64 val = PG_GETARG_INT64(0);\n\n\tif (val >= -(int64)0x80000000UL && val <= (int64)0xFFFFFFFFUL)\n\t\tPG_RETURN_IP4(val);\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t errmsg(\"ip address out of range\")));\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_to_double);\nDatum\nip4_cast_to_double(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tPG_RETURN_FLOAT8(ip);\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_from_double);\nDatum\nip4_cast_from_double(PG_FUNCTION_ARGS)\n{\n\tfloat8 val = PG_GETARG_FLOAT8(0);\n\tfloat8 ival = 0;\n\n\tif (modf(val,&ival) != 0.0)\n\t{\n\t\tereport(WARNING,\n\t\t\t\t(errcode(ERRCODE_WARNING),\n\t\t\t\t errmsg(\"double converted to IP4 is not integral\")));\n\t}\n\n\t/*\n\t * casting directly to ulong evokes the nasal demons for negative values,\n\t * casting to long first evokes them for large positive values if long is\n\t * 32bit.\n\t */\n\n\tif (ival >= -(float8)0x80000000UL && ival < 0)\n\t\tPG_RETURN_IP4((unsigned long) (long) ival);\n\telse if (ival >= 0 && ival <= (float8)0xFFFFFFFFUL)\n\t\tPG_RETURN_IP4((unsigned long) ival);\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t errmsg(\"ip address out of range\")));\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_from_numeric);\nDatum\nip4_cast_from_numeric(PG_FUNCTION_ARGS)\n{\n\tDatum val_num = PG_GETARG_DATUM(0);\n\tint64 val = DatumGetInt64(DirectFunctionCall1(numeric_int8,val_num));\n\n\tif (val >= -(int64)0x80000000UL && val <= (int64)0xFFFFFFFFUL)\n\t\tPG_RETURN_IP4((unsigned long) val);\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t errmsg(\"ip address out of range\")));\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_from_bit);\nDatum\nip4_cast_from_bit(PG_FUNCTION_ARGS)\n{\n\tVarBit *val = PG_GETARG_VARBIT_P(0);\n\n\tif (val->bit_len == 32)\n\t{\n\t\tbits8 *p = VARBITS(val);\n\t\tIP4 ip = (p[0] << 24)|(p[1] << 16)|(p[2] << 8)|p[3];\n\t\tPG_RETURN_IP4(ip);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid BIT value for conversion to IP4\")));\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_to_bit);\nDatum\nip4_cast_to_bit(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tint len = VARBITTOTALLEN(32);\n\tVarBit *res = palloc0(len);\n\tunsigned char *p = VARBITS(res);\n\n\tSET_VARSIZE(res, len);\n\tVARBITLEN(res) = 32;\n\n\tp[0] = (ip >> 24) & 0xff;\n\tp[1] = (ip >> 16) & 0xff;\n\tp[2] = (ip >>  8) & 0xff;\n\tp[3] = (ip\t\t) & 0xff;\n\n\tPG_RETURN_VARBIT_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_from_bytea);\nDatum\nip4_cast_from_bytea(PG_FUNCTION_ARGS)\n{\n\tvoid *val = PG_GETARG_BYTEA_PP(0);\n\n\tif (VARSIZE_ANY_EXHDR(val) == 4)\n\t{\n\t\tunsigned char *p = (unsigned char *) VARDATA_ANY(val);\n\t\tIP4 ip = (p[0] << 24)|(p[1] << 16)|(p[2] << 8)|p[3];\n\t\tPG_RETURN_IP4(ip);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid BYTEA value for conversion to IP4\")));\n}\n\nPG_FUNCTION_INFO_V1(ip4_cast_to_bytea);\nDatum\nip4_cast_to_bytea(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tbytea *res = palloc(VARHDRSZ + 4);\n\tunsigned char *p = (unsigned char *) VARDATA(res);\n\n\tSET_VARSIZE(res, VARHDRSZ + 4);\n\n\tp[0] = (ip >> 24) & 0xff;\n\tp[1] = (ip >> 16) & 0xff;\n\tp[2] = (ip >>  8) & 0xff;\n\tp[3] = (ip\t\t) & 0xff;\n\n\tPG_RETURN_BYTEA_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip4_netmask);\nDatum\nip4_netmask(PG_FUNCTION_ARGS)\n{\n\tint pfxlen = PG_GETARG_INT32(0);\n\n\tif (pfxlen < 0 || pfxlen > 32)\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"prefix length out of range\")));\n\t}\n\n\tPG_RETURN_IP4( netmask(pfxlen) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_net_lower);\nDatum\nip4_net_lower(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tint pfxlen = PG_GETARG_INT32(1);\n\n\tif (pfxlen < 0 || pfxlen > 32)\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"prefix length out of range\")));\n\t}\n\n\tPG_RETURN_IP4( ip & netmask(pfxlen) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_net_upper);\nDatum\nip4_net_upper(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tint pfxlen = PG_GETARG_INT32(1);\n\n\tif (pfxlen < 0 || pfxlen > 32)\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"prefix length out of range\")));\n\t}\n\n\tPG_RETURN_IP4( ip | hostmask(pfxlen) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_plus_int);\nDatum\nip4_plus_int(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tint addend = PG_GETARG_INT32(1);\n\tIP4 result = ip + (IP4) addend;\n\n\tif ((addend < 0) != (result < ip))\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t\t errmsg(\"ip address out of range\")));\n\t}\n\n\tPG_RETURN_IP4(result);\n}\n\nPG_FUNCTION_INFO_V1(ip4_plus_bigint);\nDatum\nip4_plus_bigint(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tint64 addend = PG_GETARG_INT64(1);\n\tuint64 result = (uint64) ip + addend;\n\n\tif (((addend < 0) != (result < ip))\n\t\t|| result != (uint64)(IP4)result)\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t\t errmsg(\"ip address out of range\")));\n\t}\n\n\tPG_RETURN_IP4( (IP4)(result) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_plus_numeric);\nDatum\nip4_plus_numeric(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tDatum addend_num = PG_GETARG_DATUM(1);\n\tint64 addend = DatumGetInt64(DirectFunctionCall1(numeric_int8,addend_num));\n\tuint64 result = (uint64) ip + addend;\n\n\tif (((addend < 0) != (result < ip))\n\t\t|| result != (uint64)(IP4)result)\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t\t errmsg(\"ip address out of range\")));\n\t}\n\n\tPG_RETURN_IP4( (IP4)(result) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_minus_int);\nDatum\nip4_minus_int(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tint subtrahend = PG_GETARG_INT32(1);\n\tIP4 result = ip - (IP4) subtrahend;\n\n\tif ((subtrahend > 0) != (result < ip))\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t\t errmsg(\"ip address out of range\")));\n\t}\n\n\tPG_RETURN_IP4(result);\n}\n\nPG_FUNCTION_INFO_V1(ip4_minus_bigint);\nDatum\nip4_minus_bigint(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tint64 subtrahend = PG_GETARG_INT64(1);\n\tuint64 result = (uint64) ip - subtrahend;\n\n\tif (((subtrahend > 0) != (result < ip))\n\t\t|| result != (uint64)(IP4)result)\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t\t errmsg(\"ip address out of range\")));\n\t}\n\n\tPG_RETURN_IP4( (IP4)(result) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_minus_numeric);\nDatum\nip4_minus_numeric(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tDatum subtrahend_num = PG_GETARG_DATUM(1);\n\tint64 subtrahend = DatumGetInt64(DirectFunctionCall1(numeric_int8,subtrahend_num));\n\tuint64 result = (uint64) ip - subtrahend;\n\n\tif (((subtrahend > 0) != (result < ip))\n\t\t|| result != (uint64)(IP4)result)\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t\t errmsg(\"ip address out of range\")));\n\t}\n\n\tPG_RETURN_IP4( (IP4)(result) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_minus_ip4);\nDatum\nip4_minus_ip4(PG_FUNCTION_ARGS)\n{\n\tIP4 minuend = PG_GETARG_IP4(0);\n\tIP4 subtrahend = PG_GETARG_IP4(1);\n\tint64 result = (int64) minuend - (int64) subtrahend;\n\n\tPG_RETURN_INT64(result);\n}\n\nPG_FUNCTION_INFO_V1(ip4_and);\nDatum\nip4_and(PG_FUNCTION_ARGS)\n{\n\tIP4 a = PG_GETARG_IP4(0);\n\tIP4 b = PG_GETARG_IP4(1);\n\n\tPG_RETURN_IP4(a & b);\n}\n\nPG_FUNCTION_INFO_V1(ip4_or);\nDatum\nip4_or(PG_FUNCTION_ARGS)\n{\n\tIP4 a = PG_GETARG_IP4(0);\n\tIP4 b = PG_GETARG_IP4(1);\n\n\tPG_RETURN_IP4(a | b);\n}\n\nPG_FUNCTION_INFO_V1(ip4_xor);\nDatum\nip4_xor(PG_FUNCTION_ARGS)\n{\n\tIP4 a = PG_GETARG_IP4(0);\n\tIP4 b = PG_GETARG_IP4(1);\n\n\tPG_RETURN_IP4(a ^ b);\n}\n\nPG_FUNCTION_INFO_V1(ip4_not);\nDatum\nip4_not(PG_FUNCTION_ARGS)\n{\n\tIP4 a = PG_GETARG_IP4(0);\n\n\tPG_RETURN_IP4(~a);\n}\n\n\n/*---- ip4r ----*/\n\nPG_FUNCTION_INFO_V1(ip4r_in);\nDatum\nip4r_in(PG_FUNCTION_ARGS)\n{\n\tchar *str = PG_GETARG_CSTRING(0);\n\tIP4R ipr;\n\tif (ip4r_from_str(str, &ipr))\n\t{\n\t\tIP4R *res = palloc(sizeof(IP4R));\n\t\t*res = ipr;\n\t\tPG_RETURN_IP4R_P(res);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP4R value: \\\"%s\\\"\", str)));\n}\n\nPG_FUNCTION_INFO_V1(ip4r_out);\nDatum\nip4r_out(PG_FUNCTION_ARGS)\n{\n\tIP4R *ipr = PG_GETARG_IP4R_P(0);\n\tchar *out = palloc(IP4R_STRING_MAX);\n\tip4r_to_str(ipr, out, IP4R_STRING_MAX);\n\tPG_RETURN_CSTRING(out);\n}\n\nPG_FUNCTION_INFO_V1(ip4r_recv);\nDatum\nip4r_recv(PG_FUNCTION_ARGS)\n{\n\tStringInfo buf = (StringInfo) PG_GETARG_POINTER(0);\n\tIP4R *ipr = palloc(sizeof(IP4R));\n\n\tipr->lower = (IP4) pq_getmsgint(buf, sizeof(IP4));\n\tipr->upper = (IP4) pq_getmsgint(buf, sizeof(IP4));\n\n\tif (ipr->lower > ipr->upper)\n\t{\n\t\tIP4 t = ipr->upper;\n\t\tipr->upper = ipr->lower;\n\t\tipr->lower = t;\n\t}\n\n\tPG_RETURN_IP4R_P(ipr);\n}\n\nPG_FUNCTION_INFO_V1(ip4r_send);\nDatum\nip4r_send(PG_FUNCTION_ARGS)\n{\n\tIP4R *ipr = PG_GETARG_IP4R_P(0);\n\tStringInfoData buf;\n\n\tpq_begintypsend(&buf);\n\tpq_sendint(&buf, ipr->lower, sizeof(IP4));\n\tpq_sendint(&buf, ipr->upper, sizeof(IP4));\n\tPG_RETURN_BYTEA_P(pq_endtypsend(&buf));\n}\n\nPG_FUNCTION_INFO_V1(ip4rhash);\nDatum\nip4rhash(PG_FUNCTION_ARGS)\n{\n\tIP4R *arg1 = PG_GETARG_IP4R_P(0);\n\n\treturn hash_any((unsigned char *)arg1, sizeof(IP4R));\n}\n\nPG_FUNCTION_INFO_V1(ip4r_hash_extended);\nDatum\nip4r_hash_extended(PG_FUNCTION_ARGS)\n{\n\tIP4R *arg1 = PG_GETARG_IP4R_P(0);\n\tuint64 seed = DatumGetUInt64(PG_GETARG_DATUM(1));\n\n\treturn hash_any_extended((unsigned char *)arg1, sizeof(IP4R), seed);\n}\n\nPG_FUNCTION_INFO_V1(ip4r_cast_to_text);\nDatum\nip4r_cast_to_text(PG_FUNCTION_ARGS)\n{\n\tIP4R *ipr = PG_GETARG_IP4R_P(0);\n\ttext *out = make_text(IP4R_STRING_MAX);\n\tset_text_len(out, ip4r_to_str(ipr, VARDATA(out), IP4R_STRING_MAX));\n\tPG_RETURN_TEXT_P(out);\n}\n\nPG_FUNCTION_INFO_V1(ip4r_cast_from_text);\nDatum\nip4r_cast_from_text(PG_FUNCTION_ARGS)\n{\n\ttext *txt = PG_GETARG_TEXT_PP(0);\n\tint tlen = VARSIZE_ANY_EXHDR(txt);\n\tchar buf[IP4R_STRING_MAX];\n\n\tif (tlen < sizeof(buf))\n\t{\n\t\tIP4R ipr;\n\n\t\tmemcpy(buf, VARDATA_ANY(txt), tlen);\n\t\tbuf[tlen] = 0;\n\t\tif (ip4r_from_str(buf, &ipr))\n\t\t{\n\t\t\tIP4R *res = palloc(sizeof(IP4R));\n\t\t\t*res = ipr;\n\t\t\tPG_RETURN_IP4R_P(res);\n\t\t}\n\t}\n\n\tereport(ERROR,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP4R value in text\")));\n\tPG_RETURN_NULL();\n}\n\nPG_FUNCTION_INFO_V1(ip4r_cast_from_cidr);\nDatum\nip4r_cast_from_cidr(PG_FUNCTION_ARGS)\n{\n\tinet *inetptr = PG_GETARG_INET_P(0);\n\tinet_struct *in = INET_STRUCT_DATA(inetptr);\n\n\tif (in->family == PGSQL_AF_INET)\n\t{\n\t\tunsigned char *p = in->ipaddr;\n\t\tIP4 ip = (p[0] << 24)|(p[1] << 16)|(p[2] << 8)|p[3];\n\t\tIP4R ipr;\n\t\tif (ip4r_from_cidr(ip, in->bits, &ipr))\n\t\t{\n\t\t\tIP4R *res = palloc(sizeof(IP4R));\n\t\t\t*res = ipr;\n\t\t\tPG_RETURN_IP4R_P(res);\n\t\t}\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid CIDR value for conversion to IP4R\")));\n}\n\nPG_FUNCTION_INFO_V1(ip4r_cast_to_cidr);\nDatum\nip4r_cast_to_cidr(PG_FUNCTION_ARGS)\n{\n\tIP4R *ipr = PG_GETARG_IP4R_P(0);\n\tIP4 ip = ipr->lower;\n\tinet *res;\n\tinet_struct *in;\n\tunsigned bits = masklen(ip, ipr->upper);\n\n\tif (bits > 32)\n\t\tPG_RETURN_NULL();\n\n\tres = palloc0(VARHDRSZ + sizeof(inet_struct));\n\tSET_VARSIZE(res, VARHDRSZ + offsetof(inet_struct, ipaddr) + 4);\n\n\tin = ((inet_struct *)VARDATA(res));\n\tin->bits = bits;\n\tin->family = PGSQL_AF_INET;\n\t{\n\t\tunsigned char *p = in->ipaddr;\n\t\tp[0] = (ip >> 24) & 0xff;\n\t\tp[1] = (ip >> 16) & 0xff;\n\t\tp[2] = (ip >>  8) & 0xff;\n\t\tp[3] = (ip\t\t) & 0xff;\n\t}\n\n\tPG_RETURN_INET_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip4r_cast_from_ip4);\nDatum\nip4r_cast_from_ip4(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tIP4R *res = palloc(sizeof(IP4R));\n\tif (ip4r_from_inet(ip, 32, res))\n\t{\n\t\tPG_RETURN_IP4R_P(res);\n\t}\n\n\tpfree(res);\n\tereport(ERROR,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP4 value for conversion to IP4R (shouldn't be possible)\")));\n\tPG_RETURN_NULL();\n}\n\nPG_FUNCTION_INFO_V1(ip4r_from_ip4s);\nDatum\nip4r_from_ip4s(PG_FUNCTION_ARGS)\n{\n\tIP4 a = PG_GETARG_IP4(0);\n\tIP4 b = PG_GETARG_IP4(1);\n\tIP4R *res = palloc(sizeof(IP4R));\n\tif (a < b)\n\t\tres->lower = a, res->upper = b;\n\telse\n\t\tres->lower = b, res->upper = a;\n\tPG_RETURN_IP4R_P( res );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_cast_from_bit);\nDatum\nip4r_cast_from_bit(PG_FUNCTION_ARGS)\n{\n\tVarBit *val = PG_GETARG_VARBIT_P(0);\n\tint bitlen = VARBITLEN(val);\n\n\tif (bitlen <= 32)\n\t{\n\t\tbits8 buf[4];\n\t\tbits8 *p = VARBITS(val);\n\t\tIP4 ip;\n\t\tIP4R *res = palloc(sizeof(IP4R));\n\n\t\tif (bitlen <= 24)\n\t\t{\n\t\t\tmemset(buf, 0, sizeof(buf));\n\t\t\tmemcpy(buf, p, VARBITBYTES(val));\n\t\t\tp = buf;\n\t\t}\n\n\t\tip = (p[0] << 24)|(p[1] << 16)|(p[2] << 8)|p[3];\n\n\t\tif (ip4r_from_cidr(ip, bitlen, res))\n\t\t\tPG_RETURN_IP4R_P(res);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid BIT value for conversion to IP4R\")));\n}\n\nPG_FUNCTION_INFO_V1(ip4r_cast_to_bit);\nDatum\nip4r_cast_to_bit(PG_FUNCTION_ARGS)\n{\n\tIP4R *ipr = PG_GETARG_IP4R_P(0);\n\tIP4 ip = ipr->lower;\n\tunsigned bits = masklen(ip, ipr->upper);\n\tVarBit *res;\n\tunsigned char buf[4];\n\tint len;\n\n\tif (bits > 32)\n\t\tPG_RETURN_NULL();\n\n\tlen = VARBITTOTALLEN(bits);\n\tres = palloc0(len);\n\tSET_VARSIZE(res, len);\n\tVARBITLEN(res) = bits;\n\n\tbuf[0] = (ip >> 24) & 0xff;\n\tbuf[1] = (ip >> 16) & 0xff;\n\tbuf[2] = (ip >>\t 8) & 0xff;\n\tbuf[3] = (ip\t  ) & 0xff;\n\n\tmemcpy(VARBITS(res), buf, VARBITBYTES(res));\n\tPG_RETURN_VARBIT_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip4r_net_prefix);\nDatum\nip4r_net_prefix(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tint pfxlen = PG_GETARG_INT32(1);\n\n\tif (pfxlen < 0 || pfxlen > 32)\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"prefix length out of range\")));\n\t}\n\n\t{\n\t\tIP4 mask = netmask(pfxlen);\n\t\tIP4R *res = palloc(sizeof(IP4R));\n\n\t\tres->lower = ip & mask;\n\t\tres->upper = ip | ~mask;\n\n\t\tPG_RETURN_IP4R_P(res);\n\t}\n}\n\nPG_FUNCTION_INFO_V1(ip4r_net_mask);\nDatum\nip4r_net_mask(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tIP4 mask = PG_GETARG_IP4(1);\n\n\tif (!ip4_valid_netmask(mask))\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"invalid netmask\")));\n\t}\n\n\t{\n\t\tIP4R *res = palloc(sizeof(IP4R));\n\n\t\tres->lower = ip & mask;\n\t\tres->upper = ip | ~mask;\n\n\t\tPG_RETURN_IP4R_P(res);\n\t}\n}\n\nPG_FUNCTION_INFO_V1(ip4r_lower);\nDatum\nip4r_lower(PG_FUNCTION_ARGS)\n{\n\tIP4R *ipr = PG_GETARG_IP4R_P(0);\n\tPG_RETURN_IP4( ipr->lower );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_upper);\nDatum\nip4r_upper(PG_FUNCTION_ARGS)\n{\n\tIP4R *ipr = PG_GETARG_IP4R_P(0);\n\tPG_RETURN_IP4( ipr->upper );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_is_cidr);\nDatum\nip4r_is_cidr(PG_FUNCTION_ARGS)\n{\n\tIP4R *ipr = PG_GETARG_IP4R_P(0);\n\tPG_RETURN_BOOL( (masklen(ipr->lower,ipr->upper) <= 32U) );\n}\n\n/*\n * Decompose an arbitrary range into CIDRs\n */\n\nPG_FUNCTION_INFO_V1(ip4r_cidr_split);\nDatum\nip4r_cidr_split(PG_FUNCTION_ARGS)\n{\n\tFuncCallContext *funcctx;\n\tIP4R *val;\n\tIP4R *res;\n\n\tif (SRF_IS_FIRSTCALL())\n\t{\n\t\tIP4R *in = PG_GETARG_IP4R_P(0);\n\t\tfuncctx = SRF_FIRSTCALL_INIT();\n\t\tval = MemoryContextAlloc(funcctx->multi_call_memory_ctx,\n\t\t\t\t\t\t\t\t sizeof(IP4R));\n\t\t*val = *in;\n\t\tfuncctx->user_fctx = val;\n\t}\n\n\tfuncctx = SRF_PERCALL_SETUP();\n\tval = funcctx->user_fctx;\n\tif (!val)\n\t\tSRF_RETURN_DONE(funcctx);\n\n\tres = palloc(sizeof(IP4R));\n\tif (ip4r_split_cidr(val, res))\n\t\tfuncctx->user_fctx = NULL;\n\n\tSRF_RETURN_NEXT(funcctx, IP4RPGetDatum(res));\n}\n\n/*\n * comparisons and indexing\n */\n\nPG_FUNCTION_INFO_V1(ip4_lt);\nDatum\nip4_lt(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4_lessthan(PG_GETARG_IP4(0), PG_GETARG_IP4(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_le);\nDatum\nip4_le(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4_less_eq(PG_GETARG_IP4(0), PG_GETARG_IP4(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_gt);\nDatum\nip4_gt(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4_lessthan(PG_GETARG_IP4(1), PG_GETARG_IP4(0)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_ge);\nDatum\nip4_ge(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4_less_eq(PG_GETARG_IP4(1), PG_GETARG_IP4(0)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_eq);\nDatum\nip4_eq(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4_equal(PG_GETARG_IP4(0), PG_GETARG_IP4(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_neq);\nDatum\nip4_neq(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( !ip4_equal(PG_GETARG_IP4(0), PG_GETARG_IP4(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_lt);\nDatum\nip4r_lt(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4r_lessthan(PG_GETARG_IP4R_P(0), PG_GETARG_IP4R_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_le);\nDatum\nip4r_le(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4r_less_eq(PG_GETARG_IP4R_P(0), PG_GETARG_IP4R_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_gt);\nDatum\nip4r_gt(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4r_lessthan(PG_GETARG_IP4R_P(1), PG_GETARG_IP4R_P(0)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_ge);\nDatum\nip4r_ge(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4r_less_eq(PG_GETARG_IP4R_P(1), PG_GETARG_IP4R_P(0)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_eq);\nDatum\nip4r_eq(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4r_equal(PG_GETARG_IP4R_P(0), PG_GETARG_IP4R_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_neq);\nDatum\nip4r_neq(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( !ip4r_equal(PG_GETARG_IP4R_P(0), PG_GETARG_IP4R_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_overlaps);\nDatum\nip4r_overlaps(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4r_overlaps_internal(PG_GETARG_IP4R_P(0),\n\t\t\t\t\t\t\t\t\t\t   PG_GETARG_IP4R_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_contains);\nDatum\nip4r_contains(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4r_contains_internal(PG_GETARG_IP4R_P(0),\n\t\t\t\t\t\t\t\t\t\t   PG_GETARG_IP4R_P(1),\n\t\t\t\t\t\t\t\t\t\t   true) );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_contains_strict);\nDatum\nip4r_contains_strict(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4r_contains_internal(PG_GETARG_IP4R_P(0),\n\t\t\t\t\t\t\t\t\t\t   PG_GETARG_IP4R_P(1),\n\t\t\t\t\t\t\t\t\t\t   false) );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_contained_by);\nDatum\nip4r_contained_by(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4r_contains_internal(PG_GETARG_IP4R_P(1),\n\t\t\t\t\t\t\t\t\t\t   PG_GETARG_IP4R_P(0),\n\t\t\t\t\t\t\t\t\t\t   true) );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_contained_by_strict);\nDatum\nip4r_contained_by_strict(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4r_contains_internal(PG_GETARG_IP4R_P(1),\n\t\t\t\t\t\t\t\t\t\t   PG_GETARG_IP4R_P(0),\n\t\t\t\t\t\t\t\t\t\t   false) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_contains);\nDatum\nip4_contains(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4_contains_internal(PG_GETARG_IP4R_P(0), PG_GETARG_IP4(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4_contained_by);\nDatum\nip4_contained_by(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4_contains_internal(PG_GETARG_IP4R_P(1), PG_GETARG_IP4(0)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_left_of);\nDatum\nip4r_left_of(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4r_left_internal(PG_GETARG_IP4R_P(0), PG_GETARG_IP4R_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip4r_right_of);\nDatum\nip4r_right_of(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip4r_left_internal(PG_GETARG_IP4R_P(1), PG_GETARG_IP4R_P(0)) );\n}\n\n\nPG_FUNCTION_INFO_V1(ip4r_union);\nDatum\nip4r_union(PG_FUNCTION_ARGS)\n{\n\tIP4R *res = (IP4R *) palloc(sizeof(IP4R));\n\tip4r_union_internal(PG_GETARG_IP4R_P(0), PG_GETARG_IP4R_P(1), res);\n\tPG_RETURN_IP4R_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip4r_inter);\nDatum\nip4r_inter(PG_FUNCTION_ARGS)\n{\n\tIP4R *res = (IP4R *) palloc(sizeof(IP4R));\n\tif (ip4r_inter_internal(PG_GETARG_IP4R_P(0), PG_GETARG_IP4R_P(1), res))\n\t{\n\t\tPG_RETURN_IP4R_P(res);\n\t}\n\tpfree(res);\n\tPG_RETURN_NULL();\n}\n\nPG_FUNCTION_INFO_V1(ip4r_size);\nDatum\nip4r_size(PG_FUNCTION_ARGS)\n{\n\tdouble size = ip4r_metric(PG_GETARG_IP4R_P(0));\n\tPG_RETURN_FLOAT8(size);\n}\n\nPG_FUNCTION_INFO_V1(ip4r_size_exact);\nDatum\nip4r_size_exact(PG_FUNCTION_ARGS)\n{\n\tint64 size = (int64) ip4r_metric(PG_GETARG_IP4R_P(0));\n\tPG_RETURN_DATUM(DirectFunctionCall1(int8_numeric, Int64GetDatumFast(size)));\n}\n\nPG_FUNCTION_INFO_V1(ip4r_prefixlen);\nDatum\nip4r_prefixlen(PG_FUNCTION_ARGS)\n{\n\tIP4R *ipr = PG_GETARG_IP4R_P(0);\n\tunsigned len = masklen(ipr->lower, ipr->upper);\n\tif (len <= 32)\n\t\tPG_RETURN_INT32((int32) len);\n\tPG_RETURN_NULL();\n}\n\n\n/*****************************************************************************\n *\t\t\t\t\t\t\t\t\t\t\t\t   Btree functions\n *****************************************************************************/\n\nPG_FUNCTION_INFO_V1(ip4r_cmp);\nDatum\nip4r_cmp(PG_FUNCTION_ARGS)\n{\n\tIP4R *a = PG_GETARG_IP4R_P(0);\n\tIP4R *b = PG_GETARG_IP4R_P(1);\n\tif (ip4r_lessthan(a,b))\n\t\tPG_RETURN_INT32(-1);\n\tif (ip4r_equal(a,b))\n\t\tPG_RETURN_INT32(0);\n\tPG_RETURN_INT32(1);\n}\n\nPG_FUNCTION_INFO_V1(ip4_cmp);\nDatum\nip4_cmp(PG_FUNCTION_ARGS)\n{\n\tIP4 a = PG_GETARG_IP4(0);\n\tIP4 b = PG_GETARG_IP4(1);\n\tif (ip4_lessthan(a,b))\n\t\tPG_RETURN_INT32(-1);\n\tif (ip4_equal(a,b))\n\t\tPG_RETURN_INT32(0);\n\tPG_RETURN_INT32(1);\n}\n\n/*\n * in_range(val ip4,base ip4,offset bigint,sub bool,less bool)\n * returns val CMP (base OP offset)\n * where CMP is <= if less, >= otherwise\n *\t and OP is - if sub, + otherwise\n * We treat negative values of offset as special: they indicate\n * the (negation of) a cidr prefix length\n */\nPG_FUNCTION_INFO_V1(ip4_in_range_bigint);\nDatum\nip4_in_range_bigint(PG_FUNCTION_ARGS)\n{\n\tIP4 val = PG_GETARG_IP4(0);\n\tIP4 base = PG_GETARG_IP4(1);\n\tint64 offset = PG_GETARG_INT64(2);\n\tbool sub = PG_GETARG_BOOL(3);\n\tbool less = PG_GETARG_BOOL(4);\n\n\tif (offset >= INT64CONST(0x100000000) || offset < -32)\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),\n\t\t\t\t errmsg(\"invalid preceding or following size in window function\"),\n\t\t\t\t errdetail(\"Offset value \" INT64_FORMAT \" is outside the range -32 to 4294967295\", offset)));\n\n\tif (offset < 0)\n\t{\n\t\tint bits = -offset;\n\t\tif (sub)\n\t\t\tbase &= netmask(bits);\n\t\telse\n\t\t\tbase |= hostmask(bits);\n\t\tif (less)\n\t\t\tPG_RETURN_BOOL(val <= base);\n\t\telse\n\t\t\tPG_RETURN_BOOL(val >= base);\n\t}\n\telse\n\t{\n\t\t/*\n\t\t * val CMP (base OP offset) is equivalent to\n\t\t * val - base CMP (OP offset), which avoids overflow.\n\t\t */\n\t\tint64 delta = (int64)val - (int64)base;\n\t\tif (sub)\n\t\t\toffset = -offset;\n\t\tif (less)\n\t\t\tPG_RETURN_BOOL(delta <= offset);\n\t\telse\n\t\t\tPG_RETURN_BOOL(delta >= offset);\n\t}\n}\n\nPG_FUNCTION_INFO_V1(ip4_in_range_ip4);\nDatum\nip4_in_range_ip4(PG_FUNCTION_ARGS)\n{\n\tIP4 val = PG_GETARG_IP4(0);\n\tIP4 base = PG_GETARG_IP4(1);\n\tIP4 offset = PG_GETARG_IP4(2);\n\tbool sub = PG_GETARG_BOOL(3);\n\tbool less = PG_GETARG_BOOL(4);\n\n\t/*\n\t * val CMP (base OP offset) is equivalent to\n\t * val - base CMP (OP offset), which avoids overflow.\n\t */\n\tint64 delta = (int64)val - (int64)base;\n\tint64 offs = (int64)offset;\n\tif (sub)\n\t\toffs = -offs;\n\tif (less)\n\t\tPG_RETURN_BOOL(delta <= offs);\n\telse\n\t\tPG_RETURN_BOOL(delta >= offs);\n}\n\n\n/*****************************************************************************\n *\t\t\t\t\t\t\t\t\t\t\t\t   GiST functions\n *****************************************************************************/\n\n/*\n** GiST support methods\n*/\n\nDatum gip4r_consistent(PG_FUNCTION_ARGS);\nDatum gip4r_compress(PG_FUNCTION_ARGS);\nDatum gip4r_decompress(PG_FUNCTION_ARGS);\nDatum gip4r_penalty(PG_FUNCTION_ARGS);\nDatum gip4r_picksplit(PG_FUNCTION_ARGS);\nDatum gip4r_union(PG_FUNCTION_ARGS);\nDatum gip4r_same(PG_FUNCTION_ARGS);\nDatum gip4r_fetch(PG_FUNCTION_ARGS);\n\nstatic bool gip4r_leaf_consistent(IP4R * key, IP4R * query, StrategyNumber strategy);\nstatic bool gip4r_internal_consistent(IP4R * key, IP4R * query, StrategyNumber strategy);\n\n/*\n** The GiST Consistent method for IP ranges\n** Should return false if for all data items x below entry,\n** the predicate x op query == false, where op is the oper\n** corresponding to strategy in the pg_amop table.\n*/\nPG_FUNCTION_INFO_V1(gip4r_consistent);\nDatum\ngip4r_consistent(PG_FUNCTION_ARGS)\n{\n\tGISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);\n\tIP4R *query = (IP4R *) PG_GETARG_POINTER(1);\n\tStrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);\n\tbool *recheck = (bool *) PG_GETARG_POINTER(4);\n\tIP4R *key = (IP4R *) DatumGetPointer(entry->key);\n\tbool retval;\n\n\t/* recheck is never needed with this type */\n\tif (recheck)\n\t\t*recheck = false;\n\n\t/*\n\t * * if entry is not leaf, use gip4r_internal_consistent, * else use\n\t * gip4r_leaf_consistent\n\t */\n\tif (GIST_LEAF(entry))\n\t\tretval = gip4r_leaf_consistent(key, query, strategy);\n\telse\n\t\tretval = gip4r_internal_consistent(key, query, strategy);\n\n\tPG_RETURN_BOOL(retval);\n}\n\n/*\n** The GiST Union method for IP ranges\n** returns the minimal bounding IP4R that encloses all the entries in entryvec\n*/\nPG_FUNCTION_INFO_V1(gip4r_union);\nDatum\ngip4r_union(PG_FUNCTION_ARGS)\n{\n\tGistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);\n\tint *sizep = (int *) PG_GETARG_POINTER(1);\n\tGISTENTRY *ent = GISTENTRYVEC(entryvec);\n\n\tint numranges, i;\n\tIP4R *out = (IP4R *) palloc(sizeof(IP4R));\n\tIP4R *tmp;\n\n#ifdef GIST_DEBUG\n\tfprintf(stderr, \"union\\n\");\n#endif\n\n\tnumranges = GISTENTRYCOUNT(entryvec);\n\ttmp = (IP4R *) DatumGetPointer(ent[0].key);\n\t*sizep = sizeof(IP4R);\n\t*out = *tmp;\n\n\tfor (i = 1; i < numranges; i++)\n\t{\n\t\ttmp = (IP4R *) DatumGetPointer(ent[i].key);\n\t\tif (tmp->lower < out->lower)\n\t\t\tout->lower = tmp->lower;\n\t\tif (tmp->upper > out->upper)\n\t\t\tout->upper = tmp->upper;\n\t}\n\n\tPG_RETURN_IP4R_P(out);\n}\n\n/*\n** GiST Compress and Decompress methods for IP ranges\n** do not do anything.\n*/\nPG_FUNCTION_INFO_V1(gip4r_compress);\nDatum\ngip4r_compress(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_POINTER(PG_GETARG_POINTER(0));\n}\n\nPG_FUNCTION_INFO_V1(gip4r_decompress);\nDatum\ngip4r_decompress(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_POINTER(PG_GETARG_POINTER(0));\n}\n\nPG_FUNCTION_INFO_V1(gip4r_fetch);\nDatum\ngip4r_fetch(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_POINTER(PG_GETARG_POINTER(0));\n}\n\n/*\n** The GiST Penalty method for IP ranges\n** As in the R-tree paper, we use change in area as our penalty metric\n*/\nPG_FUNCTION_INFO_V1(gip4r_penalty);\nDatum\ngip4r_penalty(PG_FUNCTION_ARGS)\n{\n\tGISTENTRY *origentry = (GISTENTRY *) PG_GETARG_POINTER(0);\n\tGISTENTRY *newentry = (GISTENTRY *) PG_GETARG_POINTER(1);\n\tfloat *result = (float *) PG_GETARG_POINTER(2);\n\tIP4R *key;\n\tIP4R ud;\n\tfloat tmp1, tmp2;\n\n\tkey = (IP4R *) DatumGetPointer(origentry->key);\n\tud = *key;\n\ttmp2 = ip4r_metric(&ud);\n\n\tkey = (IP4R *) DatumGetPointer(newentry->key);\n\tif (key->lower < ud.lower)\n\t\tud.lower = key->lower;\n\tif (key->upper > ud.upper)\n\t\tud.upper = key->upper;\n\ttmp1 = ip4r_metric(&ud);\n\n\t*result = tmp1 - tmp2;\n\n#ifdef GIST_DEBUG\n\tfprintf(stderr, \"penalty\\n\");\n\tfprintf(stderr, \"\\t%g\\n\", *result);\n#endif\n\n\tPG_RETURN_POINTER(result);\n}\n\n\n/* Helper functions for picksplit. We might need to sort a list of\n * ranges by size; these are for that.\n */\n\nstruct gip4r_sort\n{\n\tIP4R *key;\n\tOffsetNumber pos;\n};\n\nstatic int\ngip4r_sort_compare(const void *a, const void *b)\n{\n\tdouble sa = ip4r_metric(((struct gip4r_sort *)a)->key);\n\tdouble sb = ip4r_metric(((struct gip4r_sort *)b)->key);\n\treturn (sa > sb) ? 1 : ((sa == sb) ? 0 : -1);\n}\n\n/*\n** The GiST PickSplit method for IP ranges\n** This is a linear-time algorithm based on a left/right split,\n** based on the box functions in rtree_gist simplified to one\n** dimension\n*/\nPG_FUNCTION_INFO_V1(gip4r_picksplit);\nDatum\ngip4r_picksplit(PG_FUNCTION_ARGS)\n{\n\tGistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);\n\tGIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);\n\tGISTENTRY *ent = GISTENTRYVEC(entryvec);\n\tOffsetNumber i;\n\tint nbytes;\n\tOffsetNumber maxoff;\n\tOffsetNumber *listL;\n\tOffsetNumber *listR;\n\tbool allisequal = true;\n\tIP4R pageunion;\n\tIP4R *cur;\n\tIP4R *unionL;\n\tIP4R *unionR;\n\tint posL = 0;\n\tint posR = 0;\n\n\tposL = posR = 0;\n\tmaxoff = GISTENTRYCOUNT(entryvec) - 1;\n\n\tcur = (IP4R *) DatumGetPointer(ent[FirstOffsetNumber].key);\n\tpageunion = *cur;\n\n\t/* find MBR */\n\tfor (i = OffsetNumberNext(FirstOffsetNumber); i <= maxoff; i = OffsetNumberNext(i))\n\t{\n\t\tcur = (IP4R *) DatumGetPointer(ent[i].key);\n\t\tif (allisequal == true\n\t\t\t&& (pageunion.lower != cur->lower || pageunion.upper != cur->upper))\n\t\t\tallisequal = false;\n\n\t\tif (cur->lower < pageunion.lower)\n\t\t\tpageunion.lower = cur->lower;\n\t\tif (cur->upper > pageunion.upper)\n\t\t\tpageunion.upper = cur->upper;\n\t}\n\n\tnbytes = (maxoff + 2) * sizeof(OffsetNumber);\n\tlistL = (OffsetNumber *) palloc(nbytes);\n\tlistR = (OffsetNumber *) palloc(nbytes);\n\tunionL = (IP4R *) palloc(sizeof(IP4R));\n\tunionR = (IP4R *) palloc(sizeof(IP4R));\n\tv->spl_ldatum = PointerGetDatum(unionL);\n\tv->spl_rdatum = PointerGetDatum(unionR);\n\tv->spl_left = listL;\n\tv->spl_right = listR;\n\n\tif (allisequal)\n\t{\n\t\tcur = (IP4R *) DatumGetPointer(ent[OffsetNumberNext(FirstOffsetNumber)].key);\n\t\tif (ip4r_equal(cur, &pageunion))\n\t\t{\n\t\t\tOffsetNumber split_at = FirstOffsetNumber + (maxoff - FirstOffsetNumber + 1)/2;\n\t\t\tv->spl_nleft = v->spl_nright = 0;\n\t\t\t*unionL = pageunion;\n\t\t\t*unionR = pageunion;\n\n\t\t\tfor (i = FirstOffsetNumber; i < split_at; i = OffsetNumberNext(i))\n\t\t\t\tv->spl_left[v->spl_nleft++] = i;\n\t\t\tfor (; i <= maxoff; i = OffsetNumberNext(i))\n\t\t\t\tv->spl_right[v->spl_nright++] = i;\n\n\t\t\tPG_RETURN_POINTER(v);\n\t\t}\n\t}\n\n#define ADDLIST( list_, u_, pos_, num_ ) do { \\\n\t\tif ( pos_ ) { \\\n\t\t\t\tif ( (u_)->upper < (cur)->upper ) (u_)->upper = (cur)->upper; \\\n\t\t\t\tif ( (u_)->lower > (cur)->lower ) (u_)->lower = (cur)->lower; \\\n\t\t} else { \\\n\t\t\t\t*(u_) = *(cur); \\\n\t\t} \\\n\t\t(list_)[(pos_)++] = (num_); \\\n} while(0)\n\n\tfor (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))\n\t{\n\t\tcur = (IP4R *) DatumGetPointer(ent[i].key);\n\t\tif (cur->lower - pageunion.lower < pageunion.upper - cur->upper)\n\t\t\tADDLIST(listL, unionL, posL, i);\n\t\telse\n\t\t\tADDLIST(listR, unionR, posR, i);\n\t}\n\n\t/* bad disposition, sort by ascending size and resplit */\n\tif (posR == 0 || posL == 0)\n\t{\n\t\tstruct gip4r_sort *arr = (struct gip4r_sort *)\n\t\t\tpalloc(sizeof(struct gip4r_sort) * (maxoff + FirstOffsetNumber));\n\n\t\tfor (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))\n\t\t{\n\t\t\tarr[i].key = (IP4R *) DatumGetPointer(ent[i].key);\n\t\t\tarr[i].pos = i;\n\t\t}\n\n\t\tqsort(arr + FirstOffsetNumber,\n\t\t\t  maxoff - FirstOffsetNumber + 1,\n\t\t\t  sizeof(struct gip4r_sort),\n\t\t\t  gip4r_sort_compare);\n\n\t\tposL = posR = 0;\n\t\tfor (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))\n\t\t{\n\t\t\tcur = arr[i].key;\n\t\t\tif (cur->lower - pageunion.lower < pageunion.upper - cur->upper)\n\t\t\t\tADDLIST(listL, unionL, posL, arr[i].pos);\n\t\t\telse if (cur->lower - pageunion.lower == pageunion.upper - cur->upper)\n\t\t\t{\n\t\t\t\tif (posL > posR)\n\t\t\t\t\tADDLIST(listR, unionR, posR, arr[i].pos);\n\t\t\t\telse\n\t\t\t\t\tADDLIST(listL, unionL, posL, arr[i].pos);\n\t\t\t}\n\t\t\telse\n\t\t\t\tADDLIST(listR, unionR, posR, arr[i].pos);\n\t\t}\n\t\tpfree(arr);\n\t}\n\n\tv->spl_nleft = posL;\n\tv->spl_nright = posR;\n\n\tPG_RETURN_POINTER(v);\n}\n\n#undef ADDLIST\n\n/*\n** Equality methods\n*/\nPG_FUNCTION_INFO_V1(gip4r_same);\nDatum\ngip4r_same(PG_FUNCTION_ARGS)\n{\n\tIP4R *v1 = (IP4R *) PG_GETARG_POINTER(0);\n\tIP4R *v2 = (IP4R *) PG_GETARG_POINTER(1);\n\tbool *result = (bool *) PG_GETARG_POINTER(2);\n\n\tif (v1 && v2)\n\t\t*result = ip4r_equal(v1,v2);\n\telse\n\t\t*result = (v1 == NULL && v2 == NULL);\n\n#ifdef GIST_DEBUG\n\tfprintf(stderr, \"same: %s\\n\", (*result ? \"true\" : \"false\"));\n#endif\n\n\tPG_RETURN_POINTER(result);\n}\n\n\n/*\n * Strategy numbers:\n *\t\tOPERATOR\t\t1\t\t>>= ,\n *\t\tOPERATOR\t\t2\t\t<<= ,\n *\t\tOPERATOR\t\t3\t\t>> ,\n *\t\tOPERATOR\t\t4\t\t<< ,\n *\t\tOPERATOR\t\t5\t\t&& ,\n *\t\tOPERATOR\t\t6\t\t= ,\n */\n\n/*\n** SUPPORT ROUTINES\n*/\nstatic bool\ngip4r_leaf_consistent(IP4R * key,\n\t\t\t\t\t  IP4R * query,\n\t\t\t\t\t  StrategyNumber strategy)\n{\n#ifdef GIST_QUERY_DEBUG\n\tfprintf(stderr, \"leaf_consistent, %d\\n\", strategy);\n#endif\n\n\tswitch (strategy)\n\t{\n\t\tcase 1:\t  /* left contains right nonstrict */\n\t\t\treturn ip4r_contains_internal(key, query, true);\n\t\tcase 2:\t  /* left contained in right nonstrict */\n\t\t\treturn ip4r_contains_internal(query, key, true);\n\t\tcase 3:\t  /* left contains right strict */\n\t\t\treturn ip4r_contains_internal(key, query, false);\n\t\tcase 4:\t  /* left contained in right strict */\n\t\t\treturn ip4r_contains_internal(query, key, false);\n\t\tcase 5:\t  /* left overlaps right */\n\t\t\treturn ip4r_overlaps_internal(key, query);\n\t\tcase 6:\t  /* left equal right */\n\t\t\treturn ip4r_equal(key, query);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/* logic notes:\n * If the union value we're looking at overlaps with our query value\n * at all, then any of the values underneath it might overlap with us\n * or be contained by us, so all the \"contained by\" and \"overlaps\"\n * cases degenerate to \"overlap\".\n * If the union value is equal to the query value, then none of the\n * values under it can strictly contain the query value, so for\n * \"contained\" queries the strictness is preserved.\n * If we're looking for an \"equal\" value, then we have to enter any\n * subtree whose union contains (not strictly) our query value.\n */\n\nbool\ngip4r_internal_consistent(IP4R * key,\n\t\t\t\t\t\t  IP4R * query,\n\t\t\t\t\t\t  StrategyNumber strategy)\n{\n#ifdef GIST_QUERY_DEBUG\n\tfprintf(stderr, \"internal_consistent, %d\\n\", strategy);\n#endif\n\n\tswitch (strategy)\n\t{\n\t\tcase 2:\t  /* left contained in right nonstrict */\n\t\tcase 4:\t  /* left contained in right strict */\n\t\tcase 5:\t  /* left overlaps right */\n\t\t\treturn ip4r_overlaps_internal(key, query);\n\t\tcase 3:\t  /* left contains right strict */\n\t\t\treturn ip4r_contains_internal(key, query, false);\n\t\tcase 1:\t  /* left contains right nonstrict */\n\t\tcase 6:\t  /* left equal right */\n\t\t\treturn ip4r_contains_internal(key, query, true);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/* end */\n"
  },
  {
    "path": "src/ip4r_funcs.h",
    "content": "/* ip4r_funcs.h */\n\nstatic inline\nuint32 hostmask(unsigned masklen)\n{\n\treturn (masklen) ? ( (((uint32)(1U)) << (32-masklen)) - 1U ) : 0xFFFFFFFFU;\n}\n\nstatic inline\nuint32 netmask(unsigned masklen)\n{\n\treturn ~hostmask(masklen);\n}\n\n/* if LO and HI are ends of a CIDR prefix, return the mask length.\n * If not, returns ~0.\n */\n\nstatic inline\nunsigned masklen(uint32 lo, uint32 hi)\n{\n\tuint32 d = (lo ^ hi) + 1;\n\t/* at this point, d can be:\n\t *\t0 if A and B have all bits different\n\t *\t1 if A and B are equal\n\t *\t1 << (32-masklen)\n\t *\tsome other value if A and B are not ends of a CIDR range\n\t * but in any case, after extracting the masklen, we have to\n\t * recheck because some non-CIDR ranges will produce the same\n\t * results.\n\t */\n\tint fbit = ffs(d);\n\tswitch (fbit)\n\t{\n\t\tcase 0: return (lo == 0 && hi == ~0) ? 0 : ~0;\n\t\tcase 1: return (lo == hi) ? 32 : ~0;\n\t\tdefault:\n\t\t\tif ( ((uint32)(1U) << (fbit-1)) == d )\n\t\t\t{\n\t\t\t\tuint32 mask = hostmask(33-fbit);\n\t\t\t\tif ((lo & mask) == 0 && (hi & mask) == mask)\n\t\t\t\t\treturn 33-fbit;\n\t\t\t}\n\t\t\treturn ~0;\n\t}\n}\n\nstatic inline\nbool ip4_valid_netmask(uint32 mask)\n{\n\tuint32 d = ~mask + 1;\n\t/* at this point, d can be:\n\t *\t0 if mask was 0x00000000 (valid)\n\t *\t1 << (32-masklen)\t(valid)\n\t *\tsome other value  (invalid)\n\t */\n\tint fbit = ffs(d);\n\tswitch (fbit)\n\t{\n\t\tcase 0:\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn ( ((uint32)(1U) << (fbit-1)) == d );\n\t}\n}\n\n\nstatic inline\nbool ip4r_from_cidr(IP4 prefix, unsigned masklen, IP4R *ipr)\n{\n\tuint32 mask = hostmask(masklen);\n\tif (masklen > 32)\n\t\treturn false;\n\tif (prefix & mask)\n\t\treturn false;\n\tipr->lower = prefix;\n\tipr->upper = prefix | mask;\n\treturn true;\n}\n\nstatic inline\nbool ip4r_from_inet(IP4 addr, unsigned masklen, IP4R *ipr)\n{\n\tuint32 mask = hostmask(masklen);\n\tif (masklen > 32)\n\t\treturn false;\n\tipr->lower = addr & ~mask;\n\tipr->upper = addr | mask;\n\treturn true;\n}\n\nstatic inline\nbool ip4r_split_cidr(IP4R *val, IP4R *res)\n{\n\tIP4 lo = val->lower;\n\tIP4 hi = val->upper;\n\tint len = 32;\n\tIP4 mask = 1;\n\n\tres->lower = lo;\n\tres->upper = hi;\n\n\tif (masklen(lo,hi) <= 32U)\n\t\treturn true;\n\n\t/*\n\t * We know that all these cases are impossible because the CIDR check\n\t * would catch them:\n\t *\n\t *\tlo==hi\n\t *\tlo==0 && hi==~0\n\t *\tlo==~0\n\t *\n\t * Therefore this loop must terminate before the mask overflows\n\t */\n\twhile ((lo & mask) == 0 && (lo | mask) <= hi)\n\t\t--len, mask = (mask << 1) | 1;\n\tmask >>= 1;\n\n\tres->upper = lo | mask;\n\tval->lower = (lo | mask) + 1;\n\n\treturn false;\n}\n\n/* comparisons */\n\nstatic inline\nbool ip4_equal(IP4 a, IP4 b)\n{\n\treturn (a == b);\n}\n\nstatic inline\nbool ip4_lessthan(IP4 a, IP4 b)\n{\n\treturn (a < b);\n}\n\nstatic inline\nbool ip4_less_eq(IP4 a, IP4 b)\n{\n\treturn (a <= b);\n}\n\n/* helpers for union/intersection for indexing */\n\nstatic inline\nIP4R *ip4r_union_internal(IP4R *a, IP4R *b, IP4R *result)\n{\n\tif (a->lower < b->lower)\n\t\tresult->lower = a->lower;\n\telse\n\t\tresult->lower = b->lower;\n\n\tif (a->upper > b->upper)\n\t\tresult->upper = a->upper;\n\telse\n\t\tresult->upper = b->upper;\n\n\treturn result;\n}\n\nstatic inline\nIP4R *ip4r_inter_internal(IP4R *a, IP4R *b, IP4R *result)\n{\n\tif (a->upper < b->lower || a->lower > b->upper)\n\t{\n\t\t/* disjoint */\n\t\tresult->lower = 1;\n\t\tresult->upper = 0;\t/* INVALID VALUE */\n\t\treturn NULL;\n\t}\n\n\tif (a->upper < b->upper)\n\t\tresult->upper = a->upper;\n\telse\n\t\tresult->upper = b->upper;\n\n\tif (a->lower > b->lower)\n\t\tresult->lower = a->lower;\n\telse\n\t\tresult->lower = b->lower;\n\n\treturn result;\n}\n\nstatic inline\ndouble ip4r_metric(IP4R *v)\n{\n\tif (!v)\n\t\treturn 0.0;\n\treturn ((v->upper - v->lower) + 1.0);\n}\n\nstatic inline\nbool ip4r_equal(IP4R *a, IP4R *b)\n{\n\treturn (a->lower == b->lower && a->upper == b->upper);\n}\n\nstatic inline\nbool ip4r_lessthan(IP4R *a, IP4R *b)\n{\n\treturn (a->lower == b->lower) ? (a->upper < b->upper) : (a->lower < b->lower);\n}\n\nstatic inline\nbool ip4r_less_eq(IP4R *a, IP4R *b)\n{\n\treturn (a->lower == b->lower) ? (a->upper <= b->upper) : (a->lower < b->lower);\n}\n\nstatic inline\nbool ip4r_contains_internal(IP4R *left, IP4R *right, bool eqval)\n{\n\tif (ip4r_equal(left,right))\n\t\treturn eqval;\n\treturn ((left->lower <= right->lower) && (left->upper >= right->upper));\n}\n\nstatic inline\nbool ip4r_overlaps_internal(IP4R *left, IP4R *right)\n{\n\treturn (left->upper >= right->lower && left->lower <= right->upper);\n}\n\nstatic inline\nbool ip4_contains_internal(IP4R *left, IP4 right)\n{\n\treturn (left->lower <= right && left->upper >= right);\n}\n\nstatic inline\nbool ip4r_left_internal(IP4R *left, IP4R *right)\n{\n\treturn (left->upper < right->lower);\n}\n\nstatic inline\nbool ip4r_extends_left_of_internal(IP4R *left, IP4R *right)\n{\n\treturn (left->lower < right->lower);\n}\n\nstatic inline\nbool ip4r_extends_right_of_internal(IP4R *left, IP4R *right)\n{\n\treturn (left->upper > right->upper);\n}\n\n/* end */\n"
  },
  {
    "path": "src/ip4r_module.c",
    "content": "/* ip4r_module.c */\n\n#include \"postgres.h\"\n#include \"fmgr.h\"\n\nPG_MODULE_MAGIC;\n\n/* end */\n"
  },
  {
    "path": "src/ip6r.c",
    "content": "/* ip6r.c */\n\n#include \"postgres.h\"\n\n#include <math.h>\n#include <sys/socket.h>\n\n#include \"fmgr.h\"\n#include \"funcapi.h\"\n\n#include \"access/gist.h\"\n#include \"access/hash.h\"\n#include \"access/skey.h\"\n#include \"libpq/pqformat.h\"\n#include \"utils/builtins.h\"\n#include \"utils/elog.h\"\n#include \"utils/numeric.h\"\n#include \"utils/palloc.h\"\n#include \"utils/varbit.h\"\n\n#include \"ipr_internal.h\"\n#include \"ip6r_funcs.h\"\n\n/* extract an IP range from text.\n */\nstatic\nbool ip6r_from_str(char *str, IP6R *ipr)\n{\n\tchar buf[IP6_STRING_MAX];\n\tint pos = strcspn(str, \"-/\");\n\tIP6 ip;\n\n\tswitch (str[pos])\n\t{\n\t\tcase 0:\t\t/* no separator, must be single ip6 addr */\n\t\t{\n\t\t\tif (!ip6_raw_input(str, ip.bits))\n\t\t\t\treturn false;\n\t\t\tipr->lower = ip;\n\t\t\tipr->upper = ip;\n\t\t\treturn true;\n\t\t}\n\n\t\tcase '-':\t/* lower-upper */\n\t\t{\n\t\t\tchar *rest = str + pos + 1;\n\n\t\t\tif (pos > sizeof(buf)-2)\n\t\t\t\treturn false;\n\t\t\tmemcpy(buf, str, pos);\n\t\t\tbuf[pos] = 0;\n\t\t\tif (!ip6_raw_input(buf, ip.bits))\n\t\t\t\treturn false;\n\t\t\tipr->lower = ip;\n\t\t\tif (!ip6_raw_input(rest, ip.bits))\n\t\t\t\treturn false;\n\t\t\tif (!ip6_lessthan(&ip, &ipr->lower))\n\t\t\t\tipr->upper = ip;\n\t\t\telse\n\t\t\t{\n\t\t\t\tipr->upper = ipr->lower;\n\t\t\t\tipr->lower = ip;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tcase '/':  /* prefix/len */\n\t\t{\n\t\t\tchar *rest = str + pos + 1;\n\t\t\tunsigned pfxlen;\n\t\t\tchar dummy;\n\n\t\t\tif (pos > sizeof(buf)-2)\n\t\t\t\treturn false;\n\t\t\tmemcpy(buf, str, pos);\n\t\t\tbuf[pos] = 0;\n\t\t\tif (!ip6_raw_input(buf, ip.bits))\n\t\t\t\treturn false;\n\t\t\tif (rest[strspn(rest,\"0123456789\")])\n\t\t\t\treturn false;\n\t\t\tif (sscanf(rest, \"%u%c\", &pfxlen, &dummy) != 1)\n\t\t\t\treturn false;\n\t\t\treturn ip6r_from_cidr(&ip, pfxlen, ipr);\n\t\t}\n\n\t\tdefault:\n\t\t\treturn false;\t   /* can't happen */\n\t}\n}\n\n\n/* Output an ip range in text form\n */\nstatic\nint ip6r_to_str(IP6R *ipr, char *str, int slen)\n{\n\tchar buf1[IP6_STRING_MAX];\n\tchar buf2[IP6_STRING_MAX];\n\tunsigned msk;\n\n\tif (ip6_equal(&ipr->lower, &ipr->upper))\n\t\treturn ip6_raw_output(ipr->lower.bits, str, slen);\n\n\tif ((msk = masklen6(&ipr->lower,&ipr->upper)) <= 128)\n\t{\n\t\tip6_raw_output(ipr->lower.bits, buf1, sizeof(buf1));\n\t\treturn snprintf(str, slen, \"%s/%u\", buf1, msk);\n\t}\n\n\tip6_raw_output(ipr->lower.bits, buf1, sizeof(buf1));\n\tip6_raw_output(ipr->upper.bits, buf2, sizeof(buf2));\n\n\treturn snprintf(str, slen, \"%s-%s\", buf1, buf2);\n}\n\n\n/**************************************************************************/\n/* This part handles all aspects of postgres interfacing.\n */\n\n\n/* end of version dependencies */\n\n\n/*\n#define GIST_DEBUG\n#define GIST_QUERY_DEBUG\n*/\n\nstatic\ntext *\nmake_text(int len)\n{\n\ttext *ret = (text *) palloc0(len + VARHDRSZ);\n\tSET_VARSIZE(ret, len + VARHDRSZ);\n\treturn ret;\n}\n\nstatic inline\nvoid\nset_text_len(text *txt, int len)\n{\n\tAssert(len >= 0 && len + VARHDRSZ <= VARSIZE(txt));\n\tif (len + VARHDRSZ <= VARSIZE(txt))\n\t\tSET_VARSIZE(txt, len + VARHDRSZ);\n}\n\n/*\n** Input/Output routines\n*/\n\nPG_FUNCTION_INFO_V1(ip6_in);\nDatum\nip6_in(PG_FUNCTION_ARGS)\n{\n\tchar *str = PG_GETARG_CSTRING(0);\n\tIP6 *ip = palloc(sizeof(IP6));\n\tif (ip6_raw_input(str, ip->bits))\n\t\tPG_RETURN_IP6_P(ip);\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP6 value: '%s'\", str)));\n}\n\nPG_FUNCTION_INFO_V1(ip6_out);\nDatum\nip6_out(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tchar *out = palloc(IP6_STRING_MAX);\n\tip6_raw_output(ip->bits, out, IP6_STRING_MAX);\n\tPG_RETURN_CSTRING(out);\n}\n\nPG_FUNCTION_INFO_V1(ip6_recv);\nDatum\nip6_recv(PG_FUNCTION_ARGS)\n{\n\tStringInfo buf = (StringInfo) PG_GETARG_POINTER(0);\n\tIP6 *ip = palloc(sizeof(IP6));\n\n\tip->bits[0] = pq_getmsgint64(buf);\n\tip->bits[1] = pq_getmsgint64(buf);\n\n\tPG_RETURN_IP6_P(ip);\n}\n\nPG_FUNCTION_INFO_V1(ip6_send);\nDatum\nip6_send(PG_FUNCTION_ARGS)\n{\n\tIP6 *arg1 = PG_GETARG_IP6_P(0);\n\tStringInfoData buf;\n\n\tpq_begintypsend(&buf);\n\tpq_sendint64(&buf, arg1->bits[0]);\n\tpq_sendint64(&buf, arg1->bits[1]);\n\tPG_RETURN_BYTEA_P(pq_endtypsend(&buf));\n}\n\nPG_FUNCTION_INFO_V1(ip6hash);\nDatum\nip6hash(PG_FUNCTION_ARGS)\n{\n\tIP6 *arg1 = PG_GETARG_IP6_P(0);\n\n\treturn hash_any((unsigned char *)arg1, sizeof(IP6));\n}\n\nPG_FUNCTION_INFO_V1(ip6_hash_extended);\nDatum\nip6_hash_extended(PG_FUNCTION_ARGS)\n{\n\tIP6 *arg1 = PG_GETARG_IP6_P(0);\n\tuint64 seed = DatumGetUInt64(PG_GETARG_DATUM(1));\n\n\treturn hash_any_extended((unsigned char *)arg1, sizeof(IP6), seed);\n}\n\nPG_FUNCTION_INFO_V1(ip6_cast_to_text);\nDatum\nip6_cast_to_text(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\ttext *out = make_text(IP6_STRING_MAX);\n\tset_text_len(out, ip6_raw_output(ip->bits, VARDATA(out), IP6_STRING_MAX));\n\tPG_RETURN_TEXT_P(out);\n}\n\nPG_FUNCTION_INFO_V1(ip6_cast_from_text);\nDatum\nip6_cast_from_text(PG_FUNCTION_ARGS)\n{\n\ttext *txt = PG_GETARG_TEXT_PP(0);\n\tint tlen = VARSIZE_ANY_EXHDR(txt);\n\tchar buf[IP6_STRING_MAX];\n\n\tif (tlen < sizeof(buf))\n\t{\n\t\tIP6 *ip = palloc(sizeof(IP6));\n\n\t\tmemcpy(buf, VARDATA_ANY(txt), tlen);\n\t\tbuf[tlen] = 0;\n\t\tif (ip6_raw_input(buf, ip->bits))\n\t\t\tPG_RETURN_IP6_P(ip);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP6 value in text\")));\n}\n\nPG_FUNCTION_INFO_V1(ip6_cast_from_inet);\nDatum\nip6_cast_from_inet(PG_FUNCTION_ARGS)\n{\n\tinet *inetptr = PG_GETARG_INET_P(0);\n\tinet_struct *in = INET_STRUCT_DATA(inetptr);\n\n\tif (in->family == PGSQL_AF_INET6)\n\t{\n\t\tunsigned char *p = in->ipaddr;\n\t\tIP6 *ip = palloc(sizeof(IP6));\n\t\tip6_deserialize(p, ip);\n\t\tPG_RETURN_IP6_P(ip);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid INET value for conversion to IP6\")));\n}\n\nPG_FUNCTION_INFO_V1(ip6_cast_to_cidr);\nDatum\nip6_cast_to_cidr(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tinet *res = palloc0(VARHDRSZ + sizeof(inet_struct));\n\tinet_struct *in;\n\n\tSET_VARSIZE(res, VARHDRSZ + offsetof(inet_struct, ipaddr) + 16);\n\n\tin = ((inet_struct *)VARDATA(res));\n\tin->bits = 128;\n\tin->family = PGSQL_AF_INET6;\n\tip6_serialize(ip, in->ipaddr);\n\n\tPG_RETURN_INET_P(res);\n}\n\n\nPG_FUNCTION_INFO_V1(ip6_cast_to_numeric);\nDatum\nip6_cast_to_numeric(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tDatum res,tmp,mul;\n\tstatic int64 mul_val = ((int64)1 << 56);\n\tint64 tmp_val;\n\n\tmul = DirectFunctionCall1(int8_numeric,Int64GetDatumFast(mul_val));\n\ttmp_val = (ip->bits[0] >> 48);\n\tres = DirectFunctionCall1(int8_numeric,Int64GetDatumFast(tmp_val));\n\ttmp_val = ((ip->bits[0] & (uint64)(0xFFFFFFFFFFFFULL)) << 8) | (ip->bits[1] >> 56);\n\ttmp = DirectFunctionCall1(int8_numeric,Int64GetDatumFast(tmp_val));\n\tres = DirectFunctionCall2(numeric_mul,res,mul);\n\tres = DirectFunctionCall2(numeric_add,res,tmp);\n\ttmp_val = (ip->bits[1] & (uint64)(0xFFFFFFFFFFFFFFULL));\n\ttmp = DirectFunctionCall1(int8_numeric,Int64GetDatumFast(tmp_val));\n\tres = DirectFunctionCall2(numeric_mul,res,mul);\n\tres = DirectFunctionCall2(numeric_add,res,tmp);\n\n\tPG_RETURN_DATUM(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6_cast_from_numeric);\nDatum\nip6_cast_from_numeric(PG_FUNCTION_ARGS)\n{\n\tDatum val = NumericGetDatum(PG_GETARG_NUMERIC(0));\n\tDatum rem,tmp,div,mul;\n\tstatic int64 mul_val = ((int64)1 << 56);\n\tuint64 tmp_val;\n\tIP6 *res;\n\n\ttmp = DirectFunctionCall1(numeric_floor,DirectFunctionCall1(numeric_abs,val));\n\n\tif (!DatumGetBool(DirectFunctionCall2(numeric_eq,tmp,val)))\n\t{\n\t\tereturn(fcinfo->context, (Datum)0,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"invalid numeric value for conversion to IP6\")));\n\t}\n\n\tres = palloc(sizeof(IP6));\n\n\t/* we use div/mul here rather than mod because numeric_mod is implemented as\n\t * a div/mul/subtract in any case, so we save a division step by doing the\n\t * mul/subtract ourselves\n\t */\n\n\tmul = DirectFunctionCall1(int8_numeric,Int64GetDatumFast(mul_val));\n\tdiv = DirectFunctionCall2(numeric_div_trunc,val,mul);\n\ttmp = DirectFunctionCall2(numeric_mul,div,mul);\n\trem = DirectFunctionCall2(numeric_sub,val,tmp);\n\tres->bits[1] = (uint64)DatumGetInt64(DirectFunctionCall1(numeric_int8,rem));\n\tval = div;\n\tdiv = DirectFunctionCall2(numeric_div_trunc,val,mul);\n\ttmp = DirectFunctionCall2(numeric_mul,div,mul);\n\trem = DirectFunctionCall2(numeric_sub,val,tmp);\n\ttmp_val = (uint64)DatumGetInt64(DirectFunctionCall1(numeric_int8,rem));\n\tres->bits[1] |= ((tmp_val & 0xFF) << 56);\n\tres->bits[0] = (tmp_val >> 8);\n\tif (!DatumGetBool(DirectFunctionCall2(numeric_gt,div,mul)))\n\t{\n\t\ttmp_val = (uint64)DatumGetInt64(DirectFunctionCall1(numeric_int8,div));\n\t\tif (tmp_val <= (uint64)0xFFFFU)\n\t\t{\n\t\t\tres->bits[0] |= (tmp_val << 48);\n\t\t\tPG_RETURN_IP6_P(res);\n\t\t}\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t errmsg(\"numeric value too large for conversion to IP6\")));\n}\n\nPG_FUNCTION_INFO_V1(ip6_cast_from_bit);\nDatum\nip6_cast_from_bit(PG_FUNCTION_ARGS)\n{\n\tVarBit *val = PG_GETARG_VARBIT_P(0);\n\n\tif (VARBITLEN(val) == 128)\n\t{\n\t\tbits8 *p = VARBITS(val);\n\t\tIP6 *res = palloc(sizeof(IP6));\n\t\tip6_deserialize(p, res);\n\t\tPG_RETURN_IP6_P(res);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid BIT value for conversion to IP6\")));\n}\n\nPG_FUNCTION_INFO_V1(ip6_cast_to_bit);\nDatum\nip6_cast_to_bit(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tint len = VARBITTOTALLEN(128);\n\tVarBit *res = palloc0(len);\n\tunsigned char *p = VARBITS(res);\n\n\tSET_VARSIZE(res, len);\n\tVARBITLEN(res) = 128;\n\n\tip6_serialize(ip, p);\n\n\tPG_RETURN_VARBIT_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6_cast_from_bytea);\nDatum\nip6_cast_from_bytea(PG_FUNCTION_ARGS)\n{\n\tvoid *val = PG_GETARG_BYTEA_PP(0);\n\n\tif (VARSIZE_ANY_EXHDR(val) == 16)\n\t{\n\t\tvoid *p = VARDATA_ANY(val);\n\t\tIP6 *res = palloc(sizeof(IP6));\n\t\tip6_deserialize(p, res);\n\t\tPG_RETURN_IP6_P(res);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid BYTEA value for conversion to IP4\")));\n}\n\nPG_FUNCTION_INFO_V1(ip6_cast_to_bytea);\nDatum\nip6_cast_to_bytea(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tbytea *res = palloc(VARHDRSZ + 16);\n\tunsigned char *p = (unsigned char *) VARDATA(res);\n\n\tSET_VARSIZE(res, VARHDRSZ + 16);\n\n\tip6_serialize(ip, p);\n\n\tPG_RETURN_BYTEA_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6_netmask);\nDatum\nip6_netmask(PG_FUNCTION_ARGS)\n{\n\tint pfxlen = PG_GETARG_INT32(0);\n\tIP6 *mask;\n\n\tif (pfxlen < 0 || pfxlen > 128)\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"prefix length out of range\")));\n\t}\n\n\tmask = palloc(sizeof(IP6));\n\tmask->bits[0] = netmask6_hi(pfxlen);\n\tmask->bits[1] = netmask6_lo(pfxlen);\n\tPG_RETURN_IP6_P(mask);\n}\n\nPG_FUNCTION_INFO_V1(ip6_net_lower);\nDatum\nip6_net_lower(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tint pfxlen = PG_GETARG_INT32(1);\n\tIP6 *res;\n\n\tif (pfxlen < 0 || pfxlen > 128)\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"prefix length out of range\")));\n\t}\n\n\tres = palloc(sizeof(IP6));\n\tres->bits[0] = ip->bits[0] & netmask6_hi(pfxlen);\n\tres->bits[1] = ip->bits[1] & netmask6_lo(pfxlen);\n\n\tPG_RETURN_IP6_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6_net_upper);\nDatum\nip6_net_upper(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tint pfxlen = PG_GETARG_INT32(1);\n\tIP6 *res;\n\n\tif (pfxlen < 0 || pfxlen > 128)\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"prefix length out of range\")));\n\t}\n\n\tres = palloc(sizeof(IP6));\n\tres->bits[0] = ip->bits[0] | hostmask6_hi(pfxlen);\n\tres->bits[1] = ip->bits[1] | hostmask6_lo(pfxlen);\n\n\tPG_RETURN_IP6_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6_plus_int);\nDatum\nip6_plus_int(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tint addend = PG_GETARG_INT32(1);\n\tIP6 *result = palloc(sizeof(IP6));\n\n\tif (addend >= 0)\n\t{\n\t\tresult->bits[1] = ip->bits[1] + addend;\n\t\tresult->bits[0] = ip->bits[0] + (result->bits[1] < ip->bits[1]);\n\t}\n\telse\n\t{\n\t\tresult->bits[1] = ip->bits[1] - (uint64)(-addend);\n\t\tresult->bits[0] = ip->bits[0] - (result->bits[1] > ip->bits[1]);\n\t}\n\n\tif ((addend < 0) != ip6_lessthan(result,ip))\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t\t errmsg(\"ip address out of range\")));\n\t}\n\n\tPG_RETURN_IP6_P(result);\n}\n\nPG_FUNCTION_INFO_V1(ip6_plus_bigint);\nDatum\nip6_plus_bigint(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tint64 addend = PG_GETARG_INT64(1);\n\tIP6 *result = palloc(sizeof(IP6));\n\n\tif (addend >= 0)\n\t{\n\t\tresult->bits[1] = ip->bits[1] + addend;\n\t\tresult->bits[0] = ip->bits[0] + (result->bits[1] < ip->bits[1]);\n\t}\n\telse\n\t{\n\t\tresult->bits[1] = ip->bits[1] - (uint64)(-addend);\n\t\tresult->bits[0] = ip->bits[0] - (result->bits[1] > ip->bits[1]);\n\t}\n\n\tif ((addend < 0) != ip6_lessthan(result,ip))\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t\t errmsg(\"ip address out of range\")));\n\t}\n\n\tPG_RETURN_IP6_P(result);\n}\n\nPG_FUNCTION_INFO_V1(ip6_plus_numeric);\nDatum\nip6_plus_numeric(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tDatum addend_num = NumericGetDatum(PG_GETARG_NUMERIC(1));\n\tDatum addend_abs;\n\tIP6 *addend;\n\tIP6 *result = palloc(sizeof(IP6));\n\tbool is_negative;\n\n\taddend_abs = DirectFunctionCall1(numeric_abs,addend_num);\n\taddend = DatumGetIP6P(DirectFunctionCall1(ip6_cast_from_numeric,addend_abs));\n\n\tif (DatumGetBool(DirectFunctionCall2(numeric_eq,addend_num,addend_abs)))\n\t{\n\t\tis_negative = false;\n\t\tresult->bits[1] = ip->bits[1] + addend->bits[1];\n\t\tresult->bits[0] = ip->bits[0] + addend->bits[0] + (result->bits[1] < ip->bits[1]);\n\t}\n\telse\n\t{\n\t\tis_negative = true;\n\t\tresult->bits[1] = ip->bits[1] - addend->bits[1];\n\t\tresult->bits[0] = ip->bits[0] - addend->bits[0] - (result->bits[1] > ip->bits[1]);\n\t}\n\n\tif (is_negative != ip6_lessthan(result,ip))\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t\t errmsg(\"ip address out of range\")));\n\t}\n\n\tPG_RETURN_IP6_P(result);\n}\n\nPG_FUNCTION_INFO_V1(ip6_minus_int);\nDatum\nip6_minus_int(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tint subtrahend = PG_GETARG_INT32(1);\n\tIP6 *result = palloc(sizeof(IP6));\n\n\tip6_sub_int(ip, subtrahend, result);\n\n\tif ((subtrahend > 0) != ip6_lessthan(result,ip))\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t\t errmsg(\"ip address out of range\")));\n\t}\n\n\tPG_RETURN_IP6_P(result);\n}\n\nPG_FUNCTION_INFO_V1(ip6_minus_bigint);\nDatum\nip6_minus_bigint(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tint64 subtrahend = PG_GETARG_INT64(1);\n\tIP6 *result = palloc(sizeof(IP6));\n\n\tif (subtrahend >= 0)\n\t{\n\t\tresult->bits[1] = ip->bits[1] - (uint64)subtrahend;\n\t\tresult->bits[0] = ip->bits[0] - (result->bits[1] > ip->bits[1]);\n\t}\n\telse\n\t{\n\t\tresult->bits[1] = ip->bits[1] + (uint64)(-subtrahend);\n\t\tresult->bits[0] = ip->bits[0] + (result->bits[1] < ip->bits[1]);\n\t}\n\n\tif ((subtrahend > 0) != ip6_lessthan(result,ip))\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),\n\t\t\t\t errmsg(\"ip address out of range\")));\n\t}\n\n\tPG_RETURN_IP6_P(result);\n}\n\nPG_FUNCTION_INFO_V1(ip6_minus_numeric);\nDatum\nip6_minus_numeric(PG_FUNCTION_ARGS)\n{\n\tDatum ip = PG_GETARG_DATUM(0);\n\tDatum subtrahend = PG_GETARG_DATUM(1);\n\n\tsubtrahend = DirectFunctionCall1(numeric_uminus,subtrahend);\n\treturn DirectFunctionCall2(ip6_plus_numeric,ip,subtrahend);\n}\n\nPG_FUNCTION_INFO_V1(ip6_minus_ip6);\nDatum\nip6_minus_ip6(PG_FUNCTION_ARGS)\n{\n\tDatum minuend = PG_GETARG_DATUM(0);\n\tDatum subtrahend = PG_GETARG_DATUM(1);\n\tDatum res;\n\n\tres = DirectFunctionCall2(numeric_sub,\n\t\t\t\t\t\t\t  DirectFunctionCall1(ip6_cast_to_numeric,minuend),\n\t\t\t\t\t\t\t  DirectFunctionCall1(ip6_cast_to_numeric,subtrahend));\n\n\tPG_RETURN_DATUM(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6_and);\nDatum\nip6_and(PG_FUNCTION_ARGS)\n{\n\tIP6 *a = PG_GETARG_IP6_P(0);\n\tIP6 *b = PG_GETARG_IP6_P(1);\n\tIP6 *res = palloc(sizeof(IP6));\n\n\tres->bits[0] = a->bits[0] & b->bits[0];\n\tres->bits[1] = a->bits[1] & b->bits[1];\n\n\tPG_RETURN_IP6_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6_or);\nDatum\nip6_or(PG_FUNCTION_ARGS)\n{\n\tIP6 *a = PG_GETARG_IP6_P(0);\n\tIP6 *b = PG_GETARG_IP6_P(1);\n\tIP6 *res = palloc(sizeof(IP6));\n\n\tres->bits[0] = a->bits[0] | b->bits[0];\n\tres->bits[1] = a->bits[1] | b->bits[1];\n\n\tPG_RETURN_IP6_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6_xor);\nDatum\nip6_xor(PG_FUNCTION_ARGS)\n{\n\tIP6 *a = PG_GETARG_IP6_P(0);\n\tIP6 *b = PG_GETARG_IP6_P(1);\n\tIP6 *res = palloc(sizeof(IP6));\n\n\tres->bits[0] = a->bits[0] ^ b->bits[0];\n\tres->bits[1] = a->bits[1] ^ b->bits[1];\n\n\tPG_RETURN_IP6_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6_not);\nDatum\nip6_not(PG_FUNCTION_ARGS)\n{\n\tIP6 *a = PG_GETARG_IP6_P(0);\n\tIP6 *res = palloc(sizeof(IP6));\n\n\tres->bits[0] = ~a->bits[0];\n\tres->bits[1] = ~a->bits[1];\n\n\tPG_RETURN_IP6_P(res);\n}\n\n\n/*---- ip6r ----*/\n\nPG_FUNCTION_INFO_V1(ip6r_in);\nDatum\nip6r_in(PG_FUNCTION_ARGS)\n{\n\tchar *str = PG_GETARG_CSTRING(0);\n\tIP6R ipr;\n\n\tif (ip6r_from_str(str, &ipr))\n\t{\n\t\tIP6R *res = palloc(sizeof(IP6R));\n\t\t*res = ipr;\n\t\tPG_RETURN_IP6R_P(res);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP6R value: \\\"%s\\\"\", str)));\n}\n\nPG_FUNCTION_INFO_V1(ip6r_out);\nDatum\nip6r_out(PG_FUNCTION_ARGS)\n{\n\tIP6R *ipr = PG_GETARG_IP6R_P(0);\n\tchar *out = palloc(IP6R_STRING_MAX);\n\tip6r_to_str(ipr, out, IP6R_STRING_MAX);\n\tPG_RETURN_CSTRING(out);\n}\n\nPG_FUNCTION_INFO_V1(ip6r_recv);\nDatum\nip6r_recv(PG_FUNCTION_ARGS)\n{\n\tStringInfo buf = (StringInfo) PG_GETARG_POINTER(0);\n\tIP6R *ipr = palloc(sizeof(IP6R));\n\n\tipr->lower.bits[0] = pq_getmsgint64(buf);\n\tipr->lower.bits[1] = pq_getmsgint64(buf);\n\tipr->upper.bits[0] = pq_getmsgint64(buf);\n\tipr->upper.bits[1] = pq_getmsgint64(buf);\n\n\tif (ip6_lessthan(&ipr->upper, &ipr->lower))\n\t{\n\t\tIP6 t = ipr->upper;\n\t\tipr->upper = ipr->lower;\n\t\tipr->lower = t;\n\t}\n\n\tPG_RETURN_IP6R_P(ipr);\n}\n\nPG_FUNCTION_INFO_V1(ip6r_send);\nDatum\nip6r_send(PG_FUNCTION_ARGS)\n{\n\tIP6R *ipr = PG_GETARG_IP6R_P(0);\n\tStringInfoData buf;\n\n\tpq_begintypsend(&buf);\n\tpq_sendint64(&buf, ipr->lower.bits[0]);\n\tpq_sendint64(&buf, ipr->lower.bits[1]);\n\tpq_sendint64(&buf, ipr->upper.bits[0]);\n\tpq_sendint64(&buf, ipr->upper.bits[1]);\n\tPG_RETURN_BYTEA_P(pq_endtypsend(&buf));\n}\n\nPG_FUNCTION_INFO_V1(ip6rhash);\nDatum\nip6rhash(PG_FUNCTION_ARGS)\n{\n\tIP6R *arg1 = PG_GETARG_IP6R_P(0);\n\n\treturn hash_any((unsigned char *)arg1, sizeof(IP6R));\n}\n\nPG_FUNCTION_INFO_V1(ip6r_hash_extended);\nDatum\nip6r_hash_extended(PG_FUNCTION_ARGS)\n{\n\tIP6R *arg1 = PG_GETARG_IP6R_P(0);\n\tuint64 seed = DatumGetUInt64(PG_GETARG_DATUM(1));\n\n\treturn hash_any_extended((unsigned char *)arg1, sizeof(IP6R), seed);\n}\n\nPG_FUNCTION_INFO_V1(ip6r_cast_to_text);\nDatum\nip6r_cast_to_text(PG_FUNCTION_ARGS)\n{\n\tIP6R *ipr = PG_GETARG_IP6R_P(0);\n\ttext *out = make_text(IP6R_STRING_MAX);\n\tset_text_len(out, ip6r_to_str(ipr, VARDATA(out), IP6R_STRING_MAX));\n\tPG_RETURN_TEXT_P(out);\n}\n\nPG_FUNCTION_INFO_V1(ip6r_cast_from_text);\nDatum\nip6r_cast_from_text(PG_FUNCTION_ARGS)\n{\n\ttext *txt = PG_GETARG_TEXT_PP(0);\n\tint tlen = VARSIZE_ANY_EXHDR(txt);\n\tchar buf[IP6R_STRING_MAX];\n\n\tif (tlen < sizeof(buf))\n\t{\n\t\tIP6R ipr;\n\n\t\tmemcpy(buf, VARDATA_ANY(txt), tlen);\n\t\tbuf[tlen] = 0;\n\t\tif (ip6r_from_str(buf, &ipr))\n\t\t{\n\t\t\tIP6R *res = palloc(sizeof(IP6R));\n\t\t\t*res = ipr;\n\t\t\tPG_RETURN_IP6R_P(res);\n\t\t}\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP6R value in text\")));\n}\n\nPG_FUNCTION_INFO_V1(ip6r_cast_from_cidr);\nDatum\nip6r_cast_from_cidr(PG_FUNCTION_ARGS)\n{\n\tinet *inetptr = PG_GETARG_INET_P(0);\n\tinet_struct *in = INET_STRUCT_DATA(inetptr);\n\n\tif (in->family == PGSQL_AF_INET6)\n\t{\n\t\tunsigned char *p = in->ipaddr;\n\t\tIP6 ip;\n\t\tIP6R ipr;\n\t\tip6_deserialize(p, &ip);\n\t\tif (ip6r_from_cidr(&ip, in->bits, &ipr))\n\t\t{\n\t\t\tIP6R *res = palloc(sizeof(IP6R));\n\t\t\t*res = ipr;\n\t\t\tPG_RETURN_IP6R_P(res);\n\t\t}\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid CIDR value for conversion to IP6R\")));\n}\n\nPG_FUNCTION_INFO_V1(ip6r_cast_to_cidr);\nDatum\nip6r_cast_to_cidr(PG_FUNCTION_ARGS)\n{\n\tIP6R *ipr = PG_GETARG_IP6R_P(0);\n\tIP6 *ip = &ipr->lower;\n\tinet *res;\n\tinet_struct *in;\n\tunsigned bits = masklen6(ip, &ipr->upper);\n\n\tif (bits > 128)\n\t\tPG_RETURN_NULL();\n\n\tres = palloc0(VARHDRSZ + sizeof(inet_struct));\n\tSET_VARSIZE(res, VARHDRSZ + offsetof(inet_struct, ipaddr) + 16);\n\n\tin = ((inet_struct *)VARDATA(res));\n\tin->bits = bits;\n\tin->family = PGSQL_AF_INET6;\n\tip6_serialize(ip, in->ipaddr);\n\n\tPG_RETURN_INET_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6r_cast_from_ip6);\nDatum\nip6r_cast_from_ip6(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tIP6R *res = palloc(sizeof(IP6R));\n\tif (ip6r_from_inet(ip, 128, res))\n\t{\n\t\tPG_RETURN_IP6R_P(res);\n\t}\n\n\tpfree(res);\n\tereport(ERROR,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP6 value for conversion to IP6R (shouldn't be possible)\")));\n\tPG_RETURN_NULL();\n}\n\nPG_FUNCTION_INFO_V1(ip6r_from_ip6s);\nDatum\nip6r_from_ip6s(PG_FUNCTION_ARGS)\n{\n\tIP6 *a = PG_GETARG_IP6_P(0);\n\tIP6 *b = PG_GETARG_IP6_P(1);\n\tIP6R *res = palloc(sizeof(IP6R));\n\tif (ip6_lessthan(a,b))\n\t\tres->lower = *a, res->upper = *b;\n\telse\n\t\tres->lower = *b, res->upper = *a;\n\tPG_RETURN_IP6R_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6r_cast_from_bit);\nDatum\nip6r_cast_from_bit(PG_FUNCTION_ARGS)\n{\n\tVarBit *val = PG_GETARG_VARBIT_P(0);\n\tint bitlen = VARBITLEN(val);\n\n\tif (bitlen <= 128)\n\t{\n\t\tbits8 buf[16];\n\t\tbits8 *p = VARBITS(val);\n\t\tIP6 ip;\n\t\tIP6R *res = palloc(sizeof(IP6R));\n\n\t\tif (bitlen <= 120)\n\t\t{\n\t\t\tmemset(buf, 0, sizeof(buf));\n\t\t\tmemcpy(buf, p, VARBITBYTES(val));\n\t\t\tp = buf;\n\t\t}\n\n\t\tip6_deserialize(p, &ip);\n\t\tif (ip6r_from_cidr(&ip, bitlen, res))\n\t\t\tPG_RETURN_IP6_P(res);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid BIT value for conversion to IP6R\")));\n}\n\nPG_FUNCTION_INFO_V1(ip6r_cast_to_bit);\nDatum\nip6r_cast_to_bit(PG_FUNCTION_ARGS)\n{\n\tIP6R *ipr = PG_GETARG_IP6R_P(0);\n\tIP6 *ip = &ipr->lower;\n\tunsigned bits = masklen6(ip, &ipr->upper);\n\tVarBit *res;\n\tunsigned char buf[16];\n\tint len;\n\n\tif (bits > 128)\n\t\tPG_RETURN_NULL();\n\n\tlen = VARBITTOTALLEN(bits);\n\tres = palloc0(len);\n\tSET_VARSIZE(res, len);\n\tVARBITLEN(res) = bits;\n\n\tip6_serialize(ip, buf);\n\n\tmemcpy(VARBITS(res), buf, VARBITBYTES(res));\n\tPG_RETURN_VARBIT_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6r_net_prefix);\nDatum\nip6r_net_prefix(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tint pfxlen = PG_GETARG_INT32(1);\n\n\tif (pfxlen < 0 || pfxlen > 128)\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"prefix length out of range\")));\n\t}\n\n\t{\n\t\tIP6R *res = palloc(sizeof(IP6R));\n\t\tip6r_from_inet(ip, (unsigned)pfxlen, res);\n\t\tPG_RETURN_IP6R_P(res);\n\t}\n}\n\nPG_FUNCTION_INFO_V1(ip6r_net_mask);\nDatum\nip6r_net_mask(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tIP6 *mask = PG_GETARG_IP6_P(1);\n\n\tif (!ip6_valid_netmask(mask->bits[0], mask->bits[1]))\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"invalid netmask\")));\n\t}\n\n\t{\n\t\tIP6R *res = palloc(sizeof(IP6R));\n\n\t\tres->lower.bits[0] = ip->bits[0] & mask->bits[0];\n\t\tres->lower.bits[1] = ip->bits[1] & mask->bits[1];\n\t\tres->upper.bits[0] = ip->bits[0] | ~(mask->bits[0]);\n\t\tres->upper.bits[1] = ip->bits[1] | ~(mask->bits[1]);\n\n\t\tPG_RETURN_IP6R_P(res);\n\t}\n}\n\n\nPG_FUNCTION_INFO_V1(ip6r_lower);\nDatum\nip6r_lower(PG_FUNCTION_ARGS)\n{\n\tIP6R *ipr = PG_GETARG_IP6R_P(0);\n\tIP6 *res = palloc(sizeof(IP6));\n\t*res = ipr->lower;\n\tPG_RETURN_IP6_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6r_upper);\nDatum\nip6r_upper(PG_FUNCTION_ARGS)\n{\n\tIP6R *ipr = PG_GETARG_IP6R_P(0);\n\tIP6 *res = palloc(sizeof(IP6));\n\t*res = ipr->upper;\n\tPG_RETURN_IP6_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6r_is_cidr);\nDatum\nip6r_is_cidr(PG_FUNCTION_ARGS)\n{\n\tIP6R *ipr = PG_GETARG_IP6R_P(0);\n\tPG_RETURN_BOOL( (masklen6(&ipr->lower,&ipr->upper) <= 128U) );\n}\n\n/*\n * Decompose an arbitrary range into CIDRs\n */\n\nPG_FUNCTION_INFO_V1(ip6r_cidr_split);\nDatum\nip6r_cidr_split(PG_FUNCTION_ARGS)\n{\n\tFuncCallContext *funcctx;\n\tIP6R *val;\n\tIP6R *res;\n\n\tif (SRF_IS_FIRSTCALL())\n\t{\n\t\tIP6R *in = PG_GETARG_IP6R_P(0);\n\t\tfuncctx = SRF_FIRSTCALL_INIT();\n\t\tval = MemoryContextAlloc(funcctx->multi_call_memory_ctx,\n\t\t\t\t\t\t\t\t sizeof(IP6R));\n\t\t*val = *in;\n\t\tfuncctx->user_fctx = val;\n\t}\n\n\tfuncctx = SRF_PERCALL_SETUP();\n\tval = funcctx->user_fctx;\n\tif (!val)\n\t\tSRF_RETURN_DONE(funcctx);\n\n\tres = palloc(sizeof(IP6R));\n\tif (ip6r_split_cidr(val, res))\n\t\tfuncctx->user_fctx = NULL;\n\n\tSRF_RETURN_NEXT(funcctx, IP6RPGetDatum(res));\n}\n\n/*\n * comparisons and indexing\n */\n\nPG_FUNCTION_INFO_V1(ip6_lt);\nDatum\nip6_lt(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6_lessthan(PG_GETARG_IP6_P(0), PG_GETARG_IP6_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6_le);\nDatum\nip6_le(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6_less_eq(PG_GETARG_IP6_P(0), PG_GETARG_IP6_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6_gt);\nDatum\nip6_gt(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6_lessthan(PG_GETARG_IP6_P(1), PG_GETARG_IP6_P(0)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6_ge);\nDatum\nip6_ge(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6_less_eq(PG_GETARG_IP6_P(1), PG_GETARG_IP6_P(0)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6_eq);\nDatum\nip6_eq(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6_equal(PG_GETARG_IP6_P(0), PG_GETARG_IP6_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6_neq);\nDatum\nip6_neq(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( !ip6_equal(PG_GETARG_IP6_P(0), PG_GETARG_IP6_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6r_lt);\nDatum\nip6r_lt(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6r_lessthan(PG_GETARG_IP6R_P(0), PG_GETARG_IP6R_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6r_le);\nDatum\nip6r_le(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6r_less_eq(PG_GETARG_IP6R_P(0), PG_GETARG_IP6R_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6r_gt);\nDatum\nip6r_gt(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6r_lessthan(PG_GETARG_IP6R_P(1), PG_GETARG_IP6R_P(0)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6r_ge);\nDatum\nip6r_ge(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6r_less_eq(PG_GETARG_IP6R_P(1), PG_GETARG_IP6R_P(0)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6r_eq);\nDatum\nip6r_eq(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6r_equal(PG_GETARG_IP6R_P(0), PG_GETARG_IP6R_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6r_neq);\nDatum\nip6r_neq(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( !ip6r_equal(PG_GETARG_IP6R_P(0), PG_GETARG_IP6R_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6r_overlaps);\nDatum\nip6r_overlaps(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6r_overlaps_internal(PG_GETARG_IP6R_P(0),\n\t\t\t\t\t\t\t\t\t\t   PG_GETARG_IP6R_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6r_contains);\nDatum\nip6r_contains(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6r_contains_internal(PG_GETARG_IP6R_P(0),\n\t\t\t\t\t\t\t\t\t\t   PG_GETARG_IP6R_P(1),\n\t\t\t\t\t\t\t\t\t\t   true) );\n}\n\nPG_FUNCTION_INFO_V1(ip6r_contains_strict);\nDatum\nip6r_contains_strict(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6r_contains_internal(PG_GETARG_IP6R_P(0),\n\t\t\t\t\t\t\t\t\t\t   PG_GETARG_IP6R_P(1),\n\t\t\t\t\t\t\t\t\t\t   false) );\n}\n\nPG_FUNCTION_INFO_V1(ip6r_contained_by);\nDatum\nip6r_contained_by(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6r_contains_internal(PG_GETARG_IP6R_P(1),\n\t\t\t\t\t\t\t\t\t\t   PG_GETARG_IP6R_P(0),\n\t\t\t\t\t\t\t\t\t\t   true) );\n}\n\nPG_FUNCTION_INFO_V1(ip6r_contained_by_strict);\nDatum\nip6r_contained_by_strict(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6r_contains_internal(PG_GETARG_IP6R_P(1),\n\t\t\t\t\t\t\t\t\t\t   PG_GETARG_IP6R_P(0),\n\t\t\t\t\t\t\t\t\t\t   false) );\n}\n\nPG_FUNCTION_INFO_V1(ip6_contains);\nDatum\nip6_contains(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6_contains_internal(PG_GETARG_IP6R_P(0), PG_GETARG_IP6_P(1)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6_contained_by);\nDatum\nip6_contained_by(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( ip6_contains_internal(PG_GETARG_IP6R_P(1), PG_GETARG_IP6_P(0)) );\n}\n\nPG_FUNCTION_INFO_V1(ip6r_union);\nDatum\nip6r_union(PG_FUNCTION_ARGS)\n{\n\tIP6R *res = palloc(sizeof(IP6R));\n\tip6r_union_internal(PG_GETARG_IP6R_P(0), PG_GETARG_IP6R_P(1), res);\n\tPG_RETURN_IP6R_P(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6r_inter);\nDatum\nip6r_inter(PG_FUNCTION_ARGS)\n{\n\tIP6R *res = palloc(sizeof(IP6R));\n\tif (ip6r_inter_internal(PG_GETARG_IP6R_P(0), PG_GETARG_IP6R_P(1), res))\n\t{\n\t\tPG_RETURN_IP6R_P(res);\n\t}\n\tpfree(res);\n\tPG_RETURN_NULL();\n}\n\nPG_FUNCTION_INFO_V1(ip6r_size);\nDatum\nip6r_size(PG_FUNCTION_ARGS)\n{\n\tdouble size = ip6r_metric(PG_GETARG_IP6R_P(0));\n\tPG_RETURN_FLOAT8(size);\n}\n\nPG_FUNCTION_INFO_V1(ip6r_size_exact);\nDatum\nip6r_size_exact(PG_FUNCTION_ARGS)\n{\n\tIP6R *ipr = PG_GETARG_IP6R_P(0);\n\tDatum l = DirectFunctionCall1(ip6_cast_to_numeric, IP6PGetDatum(&ipr->lower));\n\tDatum u = DirectFunctionCall1(ip6_cast_to_numeric, IP6PGetDatum(&ipr->upper));\n\tDatum d = DirectFunctionCall2(numeric_sub, u, l);\n\tDatum s = DirectFunctionCall1(numeric_inc, d);\n\tPG_RETURN_DATUM(s);\n}\n\nPG_FUNCTION_INFO_V1(ip6r_prefixlen);\nDatum\nip6r_prefixlen(PG_FUNCTION_ARGS)\n{\n\tIP6R *ipr = PG_GETARG_IP6R_P(0);\n\tunsigned len = masklen6(&ipr->lower, &ipr->upper);\n\tif (len <= 128)\n\t\tPG_RETURN_INT32((int32) len);\n\tPG_RETURN_NULL();\n}\n\n\n/*****************************************************************************\n *\t\t\t\t\t\t\t\t\t\t\t\t   Btree functions\n *****************************************************************************/\n\nPG_FUNCTION_INFO_V1(ip6r_cmp);\nDatum\nip6r_cmp(PG_FUNCTION_ARGS)\n{\n\tIP6R *a = PG_GETARG_IP6R_P(0);\n\tIP6R *b = PG_GETARG_IP6R_P(1);\n\tif (ip6r_lessthan(a,b))\n\t\tPG_RETURN_INT32(-1);\n\tif (ip6r_equal(a,b))\n\t\tPG_RETURN_INT32(0);\n\tPG_RETURN_INT32(1);\n}\n\nPG_FUNCTION_INFO_V1(ip6_cmp);\nDatum\nip6_cmp(PG_FUNCTION_ARGS)\n{\n\tIP6 *a = PG_GETARG_IP6_P(0);\n\tIP6 *b = PG_GETARG_IP6_P(1);\n\tPG_RETURN_INT32(ip6_compare(a,b));\n}\n\n/*\n * in_range(val ip6,base ip6,offset bigint,sub bool,less bool)\n * returns val CMP (base OP offset)\n * where CMP is <= if less, >= otherwise\n *\t and OP is - if sub, + otherwise\n * We treat negative values of offset as special: they indicate\n * the (negation of) a cidr prefix length\n */\nPG_FUNCTION_INFO_V1(ip6_in_range_bigint);\nDatum\nip6_in_range_bigint(PG_FUNCTION_ARGS)\n{\n\tIP6 *val = PG_GETARG_IP6_P(0);\n\tIP6 *base = PG_GETARG_IP6_P(1);\n\tint64 offset = PG_GETARG_INT64(2);\n\tbool sub = PG_GETARG_BOOL(3);\n\tbool less = PG_GETARG_BOOL(4);\n\tbool res;\n\n\tif (offset < -128)\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),\n\t\t\t\t errmsg(\"invalid preceding or following size in window function\"),\n\t\t\t\t errdetail(\"Offset value \" INT64_FORMAT \" is outside the range -128 to 2^63-1\", offset)));\n\n\tif (offset < 0)\n\t{\n\t\tint bits = -offset;\n\t\tres = ip6_in_range_internal_bits(val, base, bits, sub, less);\n\t}\n\telse\n\t{\n\t\tIP6 offs;\n\t\toffs.bits[0] = 0;\n\t\toffs.bits[1] = offset;\n\t\tres = ip6_in_range_internal(val, base, &offs, sub, less);\n\t}\n\n\tPG_RETURN_BOOL(res);\n}\n\nPG_FUNCTION_INFO_V1(ip6_in_range_ip6);\nDatum\nip6_in_range_ip6(PG_FUNCTION_ARGS)\n{\n\tIP6 *val = PG_GETARG_IP6_P(0);\n\tIP6 *base = PG_GETARG_IP6_P(1);\n\tIP6 *offset = PG_GETARG_IP6_P(2);\n\tbool sub = PG_GETARG_BOOL(3);\n\tbool less = PG_GETARG_BOOL(4);\n\n\tPG_RETURN_BOOL(ip6_in_range_internal(val, base, offset, sub, less));\n}\n\n#if 0\n/*\n * This one is left disabled because it's inefficient and causes type\n * ambiguity problems; if you want it, use an explicit numeric::ip6 cast\n * insteag to get the previous function. Only leaving the code here for\n * reference purposes.\n */\nPG_FUNCTION_INFO_V1(ip6_in_range_numeric);\nDatum\nip6_in_range_numeric(PG_FUNCTION_ARGS)\n{\n\tIP6 *val = PG_GETARG_IP6_P(0);\n\tIP6 *base = PG_GETARG_IP6_P(1);\n\tNumeric offset;\n\tbool sub = PG_GETARG_BOOL(3);\n\tbool less = PG_GETARG_BOOL(4);\n\tDatum zero;\n\tMemoryContext oldcontext;\n\tMemoryContext mycontext = fcinfo->flinfo->fn_extra;\n\tbool res;\n\n\t/*\n\t * This is tricky because we have to not leak memory into the caller's\n\t * context.\n\t *\n\t * Retail pfree of everything would be too hard, so we make a memory\n\t * context and store it in fn_extra, resetting it each time.\n\t */\n\tif (!mycontext)\n\t\tfcinfo->flinfo->fn_extra = mycontext =\n\t\t\tAllocSetContextCreate(fcinfo->flinfo->fn_mcxt,\n\t\t\t\t\t\t\t\t  \"ip6_in_range_numeric workspace\",\n\t\t\t\t\t\t\t\t  ALLOCSET_SMALL_SIZES);\n\toldcontext = MemoryContextSwitchTo(mycontext);\n\n\t/*\n\t * Don't do this before switching contexts since it may detoast.\n\t */\n\toffset = PG_GETARG_NUMERIC(2);\n\tzero = DirectFunctionCall1(int4_numeric, Int32GetDatum(0));\n\n\tif (DatumGetBool(DirectFunctionCall2(numeric_lt, NumericGetDatum(offset), zero)))\n\t{\n\t\tDatum tmp1 = DirectFunctionCall2(numeric_larger,\n\t\t\t\t\t\t DirectFunctionCall1(int4_numeric, Int32GetDatum(-128)),\n\t\t\t\t\t\t DirectFunctionCall1(numeric_floor, NumericGetDatum(offset)));\n\t\tint32 bits;\n\t\tif (!DatumGetBool(DirectFunctionCall2(numeric_eq, NumericGetDatum(offset), tmp1)))\n\t\t\tereport(ERROR,\n\t\t\t\t\t(errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),\n\t\t\t\t\t errmsg(\"invalid preceding or following size in window function\"),\n\t\t\t\t\t errdetail(\"numeric value is not an integer in the range -128 to 2^128\")));\n\t\tbits = DatumGetInt32(DirectFunctionCall1(numeric_int4, NumericGetDatum(offset)));\n\t\tres = ip6_in_range_internal_bits(val, base, bits, sub, less);\n\t}\n\telse\n\t{\n\t\tIP6 *offs = DatumGetIP6P(DirectFunctionCall1(ip6_cast_from_numeric, NumericGetDatum(offset)));\n\t\tres = ip6_in_range_internal(val, base, offs, sub, less);\n\t}\n\n\tMemoryContextSwitchTo(oldcontext);\n\tMemoryContextReset(mycontext);\n\tPG_RETURN_BOOL(res);\n}\n#endif\n\n/*****************************************************************************\n *\t\t\t\t\t\t\t\t\t\t\t\t   GiST functions\n *****************************************************************************/\n\n/*\n** GiST support methods\n*/\n\nDatum gip6r_consistent(PG_FUNCTION_ARGS);\nDatum gip6r_compress(PG_FUNCTION_ARGS);\nDatum gip6r_decompress(PG_FUNCTION_ARGS);\nDatum gip6r_penalty(PG_FUNCTION_ARGS);\nDatum gip6r_picksplit(PG_FUNCTION_ARGS);\nDatum gip6r_union(PG_FUNCTION_ARGS);\nDatum gip6r_same(PG_FUNCTION_ARGS);\nDatum gip6r_fetch(PG_FUNCTION_ARGS);\n\nstatic bool gip6r_leaf_consistent(IP6R * key, IP6R * query, StrategyNumber strategy);\nstatic bool gip6r_internal_consistent(IP6R * key, IP6R * query, StrategyNumber strategy);\n\n/*\n** The GiST Consistent method for IP ranges\n** Should return false if for all data items x below entry,\n** the predicate x op query == false, where op is the oper\n** corresponding to strategy in the pg_amop table.\n*/\nPG_FUNCTION_INFO_V1(gip6r_consistent);\nDatum\ngip6r_consistent(PG_FUNCTION_ARGS)\n{\n\tGISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);\n\tIP6R *query = (IP6R *) PG_GETARG_POINTER(1);\n\tStrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);\n\tbool *recheck = (bool *) PG_GETARG_POINTER(4);\n\tIP6R *key = (IP6R *) DatumGetPointer(entry->key);\n\tbool retval;\n\n\t/* recheck is never needed with this type */\n\tif (recheck)\n\t\t*recheck = false;\n\n\t/*\n\t * * if entry is not leaf, use gip6r_internal_consistent, * else use\n\t * gip6r_leaf_consistent\n\t */\n\tif (GIST_LEAF(entry))\n\t\tretval = gip6r_leaf_consistent(key, query, strategy);\n\telse\n\t\tretval = gip6r_internal_consistent(key, query, strategy);\n\n\tPG_RETURN_BOOL(retval);\n}\n\n/*\n** The GiST Union method for IP ranges\n** returns the minimal bounding IP4R that encloses all the entries in entryvec\n*/\nPG_FUNCTION_INFO_V1(gip6r_union);\nDatum\ngip6r_union(PG_FUNCTION_ARGS)\n{\n\tGistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);\n\tint *sizep = (int *) PG_GETARG_POINTER(1);\n\tGISTENTRY *ent = GISTENTRYVEC(entryvec);\n\n\tint numranges, i;\n\tIP6R *out = palloc(sizeof(IP6R));\n\tIP6R *tmp;\n\n#ifdef GIST_DEBUG\n\tfprintf(stderr, \"union\\n\");\n#endif\n\n\tnumranges = GISTENTRYCOUNT(entryvec);\n\ttmp = (IP6R *) DatumGetPointer(ent[0].key);\n\t*sizep = sizeof(IP6R);\n\t*out = *tmp;\n\n\tfor (i = 1; i < numranges; i++)\n\t{\n\t\ttmp = (IP6R *) DatumGetPointer(ent[i].key);\n\t\tif (ip6_lessthan(&tmp->lower,&out->lower))\n\t\t\tout->lower = tmp->lower;\n\t\tif (ip6_lessthan(&out->upper,&tmp->upper))\n\t\t\tout->upper = tmp->upper;\n\t}\n\n\tPG_RETURN_IP6R_P(out);\n}\n\n/*\n** GiST Compress and Decompress methods for IP ranges\n** do not do anything.\n*/\nPG_FUNCTION_INFO_V1(gip6r_compress);\nDatum\ngip6r_compress(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_POINTER(PG_GETARG_POINTER(0));\n}\n\nPG_FUNCTION_INFO_V1(gip6r_decompress);\nDatum\ngip6r_decompress(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_POINTER(PG_GETARG_POINTER(0));\n}\n\nPG_FUNCTION_INFO_V1(gip6r_fetch);\nDatum\ngip6r_fetch(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_POINTER(PG_GETARG_POINTER(0));\n}\n\n/*\n** The GiST Penalty method for IP ranges\n** As in the R-tree paper, we use change in area as our penalty metric\n*/\nPG_FUNCTION_INFO_V1(gip6r_penalty);\nDatum\ngip6r_penalty(PG_FUNCTION_ARGS)\n{\n\tGISTENTRY *origentry = (GISTENTRY *) PG_GETARG_POINTER(0);\n\tGISTENTRY *newentry = (GISTENTRY *) PG_GETARG_POINTER(1);\n\tfloat *result = (float *) PG_GETARG_POINTER(2);\n\tIP6R *key = (IP6R *) DatumGetPointer(origentry->key);\n\tIP6R *newkey = (IP6R *) DatumGetPointer(newentry->key);\n\tIP6R ud;\n\tdouble tmp = 0.0;\n\n\t/* rather than subtract the sizes, which might lose due to rounding errors,\n\t * we calculate the actual number of addresses added to the range.\n\t */\n\n\tif (ip6_lessthan(&newkey->lower,&key->lower))\n\t{\n\t\tud.lower = newkey->lower;\n\t\tud.upper = key->lower;\n\t\tip6_sub_int(&ud.upper,1,&ud.upper);\n\t\ttmp = ip6r_metric(&ud);\n\t}\n\tif (ip6_lessthan(&key->upper,&newkey->upper))\n\t{\n\t\tud.lower = key->upper;\n\t\tud.upper = newkey->upper;\n\t\tip6_sub_int(&ud.upper,1,&ud.upper);\n\t\ttmp += ip6r_metric(&ud);\n\t}\n\n\t/*\n\t * we want to scale the result a bit. For one thing, the gist code implicitly\n\t * assigns a penalty of 1e10 for a union of null and non-null values, and we\n\t * want to keep our values less than that. For another, the penalty is sometimes\n\t * summed across columns of a multi-column index, and we don't want our huge\n\t * metrics (>2^80) to completely swamp anything else.\n\t *\n\t * So, we scale as the fourth power of the log2 of the computed penalty, which\n\t * gives us a range 0 - 268435456.\n\t */\n\n\t*result = (float) pow(log(tmp+1) / log(2), 4);\n\n#ifdef GIST_DEBUG\n\tfprintf(stderr, \"penalty\\n\");\n\tfprintf(stderr, \"\\t%g\\n\", *result);\n#endif\n\n\tPG_RETURN_POINTER(result);\n}\n\n\n/* Helper functions for picksplit. We might need to sort a list of\n * ranges by size; these are for that.\n */\n\nstruct gip6r_sort\n{\n\tIP6R *key;\n\tOffsetNumber pos;\n};\n\nstatic int\ngip6r_sort_compare(const void *a, const void *b)\n{\n\tdouble sa = ip6r_metric(((struct gip6r_sort *)a)->key);\n\tdouble sb = ip6r_metric(((struct gip6r_sort *)b)->key);\n\treturn (sa > sb) ? 1 : ((sa == sb) ? 0 : -1);\n}\n\n/*\n** The GiST PickSplit method for IP ranges\n** This is a linear-time algorithm based on a left/right split,\n** based on the box functions in rtree_gist simplified to one\n** dimension\n*/\nPG_FUNCTION_INFO_V1(gip6r_picksplit);\nDatum\ngip6r_picksplit(PG_FUNCTION_ARGS)\n{\n\tGistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);\n\tGIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);\n\tGISTENTRY *ent = GISTENTRYVEC(entryvec);\n\tOffsetNumber i;\n\tint nbytes;\n\tOffsetNumber maxoff;\n\tOffsetNumber *listL;\n\tOffsetNumber *listR;\n\tbool allisequal = true;\n\tIP6R pageunion;\n\tIP6R *cur;\n\tIP6R *unionL;\n\tIP6R *unionR;\n\tint posL = 0;\n\tint posR = 0;\n\n\tposL = posR = 0;\n\tmaxoff = GISTENTRYCOUNT(entryvec) - 1;\n\n\tcur = (IP6R *) DatumGetPointer(ent[FirstOffsetNumber].key);\n\tpageunion = *cur;\n\n\t/* find MBR */\n\tfor (i = OffsetNumberNext(FirstOffsetNumber); i <= maxoff; i = OffsetNumberNext(i))\n\t{\n\t\tcur = (IP6R *) DatumGetPointer(ent[i].key);\n\t\tif (allisequal == true && !ip6r_equal(&pageunion,cur))\n\t\t\tallisequal = false;\n\n\t\tif (ip6_lessthan(&cur->lower,&pageunion.lower))\n\t\t\tpageunion.lower = cur->lower;\n\t\tif (ip6_lessthan(&pageunion.upper,&cur->upper))\n\t\t\tpageunion.upper = cur->upper;\n\t}\n\n\tnbytes = (maxoff + 2) * sizeof(OffsetNumber);\n\tlistL = (OffsetNumber *) palloc(nbytes);\n\tlistR = (OffsetNumber *) palloc(nbytes);\n\tunionL = palloc(sizeof(IP6R));\n\tunionR = palloc(sizeof(IP6R));\n\tv->spl_ldatum = PointerGetDatum(unionL);\n\tv->spl_rdatum = PointerGetDatum(unionR);\n\tv->spl_left = listL;\n\tv->spl_right = listR;\n\n\tif (allisequal)\n\t{\n\t\tcur = (IP6R *) DatumGetPointer(ent[OffsetNumberNext(FirstOffsetNumber)].key);\n\t\tif (ip6r_equal(cur, &pageunion))\n\t\t{\n\t\t\tOffsetNumber split_at = FirstOffsetNumber + (maxoff - FirstOffsetNumber + 1)/2;\n\t\t\tv->spl_nleft = v->spl_nright = 0;\n\t\t\t*unionL = pageunion;\n\t\t\t*unionR = pageunion;\n\n\t\t\tfor (i = FirstOffsetNumber; i < split_at; i = OffsetNumberNext(i))\n\t\t\t\tv->spl_left[v->spl_nleft++] = i;\n\t\t\tfor (; i <= maxoff; i = OffsetNumberNext(i))\n\t\t\t\tv->spl_right[v->spl_nright++] = i;\n\n\t\t\tPG_RETURN_POINTER(v);\n\t\t}\n\t}\n\n#define ADDLIST( list_, u_, pos_, num_ ) do { \\\n\t\tif ( pos_ ) { \\\n\t\t\tif ( ip6_lessthan(&(u_)->upper, &(cur)->upper) ) (u_)->upper = (cur)->upper; \\\n\t\t\tif ( ip6_lessthan(&(cur)->lower, &(u_)->lower) ) (u_)->lower = (cur)->lower; \\\n\t\t} else { \\\n\t\t\t\t*(u_) = *(cur); \\\n\t\t} \\\n\t\t(list_)[(pos_)++] = (num_); \\\n} while(0)\n\n\tfor (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))\n\t{\n\t\tIP6 diff1;\n\t\tIP6 diff2;\n\n\t\tcur = (IP6R *) DatumGetPointer(ent[i].key);\n\t\tip6_sub(&cur->lower, &pageunion.lower, &diff1);\n\t\tip6_sub(&pageunion.upper, &cur->upper, &diff2);\n\t\tif (ip6_lessthan(&diff1,&diff2))\n\t\t\tADDLIST(listL, unionL, posL, i);\n\t\telse\n\t\t\tADDLIST(listR, unionR, posR, i);\n\t}\n\n\t/* bad disposition, sort by ascending size and resplit */\n\tif (posR == 0 || posL == 0)\n\t{\n\t\tstruct gip6r_sort *arr = (struct gip6r_sort *)\n\t\t\tpalloc(sizeof(struct gip6r_sort) * (maxoff + FirstOffsetNumber));\n\n\t\tfor (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))\n\t\t{\n\t\t\tarr[i].key = (IP6R *) DatumGetPointer(ent[i].key);\n\t\t\tarr[i].pos = i;\n\t\t}\n\n\t\tqsort(arr + FirstOffsetNumber,\n\t\t\t  maxoff - FirstOffsetNumber + 1,\n\t\t\t  sizeof(struct gip6r_sort),\n\t\t\t  gip6r_sort_compare);\n\n\t\tposL = posR = 0;\n\t\tfor (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))\n\t\t{\n\t\t\tIP6 diff1;\n\t\t\tIP6 diff2;\n\n\t\t\tcur = arr[i].key;\n\t\t\tip6_sub(&cur->lower, &pageunion.lower, &diff1);\n\t\t\tip6_sub(&pageunion.upper, &cur->upper, &diff2);\n\n\t\t\tif (ip6_lessthan(&diff1,&diff2))\n\t\t\t\tADDLIST(listL, unionL, posL, arr[i].pos);\n\t\t\telse if (ip6_equal(&diff1,&diff2))\n\t\t\t{\n\t\t\t\tif (posL > posR)\n\t\t\t\t\tADDLIST(listR, unionR, posR, arr[i].pos);\n\t\t\t\telse\n\t\t\t\t\tADDLIST(listL, unionL, posL, arr[i].pos);\n\t\t\t}\n\t\t\telse\n\t\t\t\tADDLIST(listR, unionR, posR, arr[i].pos);\n\t\t}\n\t\tpfree(arr);\n\t}\n\n\tv->spl_nleft = posL;\n\tv->spl_nright = posR;\n\n\tPG_RETURN_POINTER(v);\n}\n\n#undef ADDLIST\n\n/*\n** Equality methods\n*/\nPG_FUNCTION_INFO_V1(gip6r_same);\nDatum\ngip6r_same(PG_FUNCTION_ARGS)\n{\n\tIP6R *v1 = (IP6R *) PG_GETARG_POINTER(0);\n\tIP6R *v2 = (IP6R *) PG_GETARG_POINTER(1);\n\tbool *result = (bool *) PG_GETARG_POINTER(2);\n\n\tif (v1 && v2)\n\t\t*result = ip6r_equal(v1,v2);\n\telse\n\t\t*result = (v1 == NULL && v2 == NULL);\n\n#ifdef GIST_DEBUG\n\tfprintf(stderr, \"same: %s\\n\", (*result ? \"true\" : \"false\"));\n#endif\n\n\tPG_RETURN_POINTER(result);\n}\n\n\n/*\n * Strategy numbers:\n *\t\tOPERATOR\t\t1\t\t>>= ,\n *\t\tOPERATOR\t\t2\t\t<<= ,\n *\t\tOPERATOR\t\t3\t\t>> ,\n *\t\tOPERATOR\t\t4\t\t<< ,\n *\t\tOPERATOR\t\t5\t\t&& ,\n *\t\tOPERATOR\t\t6\t\t= ,\n */\n\n/*\n** SUPPORT ROUTINES\n*/\nstatic bool\ngip6r_leaf_consistent(IP6R * key,\n\t\t\t\t\t  IP6R * query,\n\t\t\t\t\t  StrategyNumber strategy)\n{\n#ifdef GIST_QUERY_DEBUG\n\tfprintf(stderr, \"leaf_consistent, %d\\n\", strategy);\n#endif\n\n\tswitch (strategy)\n\t{\n\t\tcase 1:\t  /* left contains right nonstrict */\n\t\t\treturn ip6r_contains_internal(key, query, true);\n\t\tcase 2:\t  /* left contained in right nonstrict */\n\t\t\treturn ip6r_contains_internal(query, key, true);\n\t\tcase 3:\t  /* left contains right strict */\n\t\t\treturn ip6r_contains_internal(key, query, false);\n\t\tcase 4:\t  /* left contained in right strict */\n\t\t\treturn ip6r_contains_internal(query, key, false);\n\t\tcase 5:\t  /* left overlaps right */\n\t\t\treturn ip6r_overlaps_internal(key, query);\n\t\tcase 6:\t  /* left equal right */\n\t\t\treturn ip6r_equal(key, query);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/* logic notes:\n * If the union value we're looking at overlaps with our query value\n * at all, then any of the values underneath it might overlap with us\n * or be contained by us, so all the \"contained by\" and \"overlaps\"\n * cases degenerate to \"overlap\".\n * If the union value is equal to the query value, then none of the\n * values under it can strictly contain the query value, so for\n * \"contained\" queries the strictness is preserved.\n * If we're looking for an \"equal\" value, then we have to enter any\n * subtree whose union contains (not strictly) our query value.\n */\n\nbool\ngip6r_internal_consistent(IP6R * key,\n\t\t\t\t\t\t  IP6R * query,\n\t\t\t\t\t\t  StrategyNumber strategy)\n{\n#ifdef GIST_QUERY_DEBUG\n\tfprintf(stderr, \"internal_consistent, %d\\n\", strategy);\n#endif\n\n\tswitch (strategy)\n\t{\n\t\tcase 2:\t  /* left contained in right nonstrict */\n\t\tcase 4:\t  /* left contained in right strict */\n\t\tcase 5:\t  /* left overlaps right */\n\t\t\treturn ip6r_overlaps_internal(key, query);\n\t\tcase 3:\t  /* left contains right strict */\n\t\t\treturn ip6r_contains_internal(key, query, false);\n\t\tcase 1:\t  /* left contains right nonstrict */\n\t\tcase 6:\t  /* left equal right */\n\t\t\treturn ip6r_contains_internal(key, query, true);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/* end */\n"
  },
  {
    "path": "src/ip6r_funcs.h",
    "content": "/* ip6r_funcs.h */\n\n/**************************************************************************/\n/* This part is the internal implementation of all functionality, with no\n * reference to the interface with postgres. That part comes later and is\n * implemented in terms of these functions.\n */\n\nstatic inline\nuint64 hostmask6_hi(unsigned masklen)\n{\n\tif (masklen >= 64)\n\t\treturn 0;\n\tif (masklen == 0)\n\t\treturn ~((uint64)0);\n\treturn (((uint64)(1U)) << (64-masklen)) - 1U;\n}\n\nstatic inline\nuint64 hostmask6_lo(unsigned masklen)\n{\n\tif (masklen <= 64)\n\t\treturn ~((uint64)0);\n\treturn (((uint64)(1U)) << (128-masklen)) - 1U;\n}\n\nstatic inline\nuint64 netmask6_hi(unsigned masklen)\n{\n\treturn ~hostmask6_hi(masklen);\n}\n\nstatic inline\nuint64 netmask6_lo(unsigned masklen)\n{\n\treturn ~hostmask6_lo(masklen);\n}\n\n/* if LO and HI are ends of a CIDR prefix, return the mask length.\n * If not, returns ~0.\n */\n\nstatic inline\nunsigned masklen64(uint64 lo, uint64 hi, int offset)\n{\n\tuint64 d = (lo ^ hi) + 1;\n\tint t = 0;\n\tint b;\n\n\t/* at this point, d can be:\n\t *\t0 if A and B have all bits different\n\t *\t1 if A and B are equal\n\t *\t1 << (64-masklen)\n\t *\tsome other value if A and B are not ends of a CIDR range\n\t * but in any case, after extracting the masklen, we have to\n\t * recheck because some non-CIDR ranges will produce the same\n\t * results.\n\t */\n\tif (d == 0)\n\t\treturn (lo == 0 && hi == ~((uint64)0)) ? offset : ~0;\n\tif (d == 1)\n\t\treturn (lo == hi) ? 64+offset : ~0;\n\n\tif (!(d & 0xFFFFFFFFUL))\n\t{\n\t\tt = 32;\n\t\td >>= 32;\n\t}\n\n\tb = ffs((uint32) d);\n\tif ((((uint32)1U) << (b-1)) != d)\n\t\treturn ~0;\n\n\t{\n\t\tuint64 mask = ((uint64)(1U) << (t+b-1)) - 1U;\n\t\tif ((lo & mask) == 0 && (hi & mask) == mask)\n\t\t\treturn 65-t-b + offset;\n\t}\n\n\treturn ~0;\n}\n\nstatic inline\nunsigned masklen6(IP6 *lo, IP6 *hi)\n{\n\tif (lo->bits[0] == hi->bits[0])\t\t/* masklen >= 64 */\n\t{\n\t\treturn masklen64(lo->bits[1], hi->bits[1], 64);\n\t}\n\telse\t\t\t\t\t\t\t\t/* masklen < 64 */\n\t{\n\t\tif (lo->bits[1] != 0 || hi->bits[1] != ~((uint64)0))\n\t\t\treturn ~0U;\n\t\treturn masklen64(lo->bits[0], hi->bits[0], 0);\n\t}\n}\n\nstatic inline\nbool ip6_valid_netmask(uint64 maskhi, uint64 masklo)\n{\n\tuint64 d;\n\tint fbit;\n\n\tif (maskhi == ~((uint64)0))\n\t\td = ~masklo + 1;\n\telse if (masklo == 0)\n\t\td = ~maskhi + 1;\n\telse\n\t\treturn false;\n\n\t/* at this point, d can be:\n\t *\t0 if mask was 0x00000000 (valid)\n\t *\t1 << (32-masklen)\t(valid)\n\t *\tsome other value  (invalid)\n\t */\n\n\tif (!(d & 0xFFFFFFFFUL))\n\t\td >>= 32;\n\tif (!d)\n\t\treturn true;\n\n\tfbit = ffs((uint32)d);\n\treturn ((uint32)(1U) << (fbit-1)) == d;\n}\n\nstatic inline\nvoid ip6_serialize(IP6 *ip, void *dest)\n{\n\tunsigned char *p = dest;\n\tp[0] = (ip->bits[0] >> 56);\n\tp[1] = (ip->bits[0] >> 48);\n\tp[2] = (ip->bits[0] >> 40);\n\tp[3] = (ip->bits[0] >> 32);\n\tp[4] = (ip->bits[0] >> 24);\n\tp[5] = (ip->bits[0] >> 16);\n\tp[6] = (ip->bits[0] >> 8);\n\tp[7] = (ip->bits[0]);\n\tp[8] = (ip->bits[1] >> 56);\n\tp[9] = (ip->bits[1] >> 48);\n\tp[10] = (ip->bits[1] >> 40);\n\tp[11] = (ip->bits[1] >> 32);\n\tp[12] = (ip->bits[1] >> 24);\n\tp[13] = (ip->bits[1] >> 16);\n\tp[14] = (ip->bits[1] >> 8);\n\tp[15] = (ip->bits[1]);\n}\n\nstatic inline\nvoid ip6_deserialize(const void *src, IP6 *ip)\n{\n\tconst unsigned char *p = src;\n\tip->bits[0] = (((uint64)p[0] << 56)\n\t\t\t\t   | ((uint64)p[1] << 48)\n\t\t\t\t   | ((uint64)p[2] << 40)\n\t\t\t\t   | ((uint64)p[3] << 32)\n\t\t\t\t   | ((uint64)p[4] << 24)\n\t\t\t\t   | ((uint64)p[5] << 16)\n\t\t\t\t   | ((uint64)p[6] << 8)\n\t\t\t\t   | p[7]);\n\tip->bits[1] = (((uint64)p[8] << 56)\n\t\t\t\t   | ((uint64)p[9] << 48)\n\t\t\t\t   | ((uint64)p[10] << 40)\n\t\t\t\t   | ((uint64)p[11] << 32)\n\t\t\t\t   | ((uint64)p[12] << 24)\n\t\t\t\t   | ((uint64)p[13] << 16)\n\t\t\t\t   | ((uint64)p[14] << 8)\n\t\t\t\t   | p[15]);\n}\n\nstatic inline\nbool ip6_equal(IP6 *a, IP6 *b)\n{\n\treturn (a->bits[0] == b->bits[0]) && (a->bits[1] == b->bits[1]);\n}\n\nstatic inline\nint ip6_compare(IP6 *a, IP6 *b)\n{\n\tif (a->bits[0] != b->bits[0])\n\t\treturn (a->bits[0] > b->bits[0]) ? 1 : -1;\n\tif (a->bits[1] != b->bits[1])\n\t\treturn (a->bits[1] > b->bits[1]) ? 1 : -1;\n\treturn 0;\n}\n\nstatic inline\nbool ip6_lessthan(IP6 *a, IP6 *b)\n{\n\treturn ( (a->bits[0] < b->bits[0])\n\t\t\t || ((a->bits[0] == b->bits[0]) && (a->bits[1] < b->bits[1])) );\n}\n\nstatic inline\nvoid ip6_sub(IP6 *minuend, IP6 *subtrahend, IP6 *result)\n{\n\tresult->bits[1] = minuend->bits[1] - subtrahend->bits[1];\n\tresult->bits[0] = minuend->bits[0] - subtrahend->bits[0] - (minuend->bits[1] < subtrahend->bits[1]);\n}\n\nstatic inline\nvoid ip6_sub_int(IP6 *minuend, int subtrahend, IP6 *result)\n{\n\tuint64 res_lo;\n\n\tif (subtrahend >= 0)\n\t{\n\t\tres_lo = minuend->bits[1] - (uint64)(subtrahend);\n\t\tresult->bits[0] = minuend->bits[0] - (res_lo > minuend->bits[1]);\n\t}\n\telse\n\t{\n\t\tres_lo = minuend->bits[1] + (uint64)(-subtrahend);\n\t\tresult->bits[0] = minuend->bits[0] + (res_lo < minuend->bits[1]);\n\t}\n\n\tresult->bits[1] = res_lo;\n}\n\nstatic inline\nbool ip6_in_range_internal(IP6 *val, IP6 *base, IP6 *offset, bool sub, bool less)\n{\n\tIP6 diff;\n\n\t/*\n\t * offset cannot be negative here since IP6 is unsigned\n\t *\n\t * val CMP (base OP offset) is equivalent to:\n\t * (val - base) CMP (offset)  when OP=+,\n\t *\t note that if (base > val) then\n\t *\t   (val - base) <= offset  is known true,\n\t *\t   (val - base) >= offset  is known false,\n\t * (offset) CMP (base - val)  when OP=-,\n\t *\t note that if (val > base) then\n\t *\t   offset >= (base - val)  is known true,\n\t *\t   offset <= (base - val)  is known false,\n\t * so we can choose to do all of these tests in a way that\n\t * avoids underflow of val - base.\n\t */\n\tif (sub)\n\t{\n\t\tif (ip6_lessthan(base, val))\n\t\t\treturn !less;\n\t\tip6_sub(base, val, &diff);\n\t\tless = !less;\n\t}\n\telse\n\t{\n\t\tif (ip6_lessthan(val, base))\n\t\t\treturn less;\n\t\tip6_sub(val, base, &diff);\n\t}\n\tif (less)\n\t\treturn !ip6_lessthan(offset,&diff);\n\telse\n\t\treturn !ip6_lessthan(&diff,offset);\n}\n\nstatic inline\nbool ip6_in_range_internal_bits(IP6 *val, IP6 *base, int bits, bool sub, bool less)\n{\n\tIP6 newbase = *base;\n\tif (sub)\n\t{\n\t\tnewbase.bits[0] &= netmask6_hi(bits);\n\t\tnewbase.bits[1] &= netmask6_lo(bits);\n\t}\n\telse\n\t{\n\t\tnewbase.bits[0] |= hostmask6_hi(bits);\n\t\tnewbase.bits[1] |= hostmask6_lo(bits);\n\t}\n\tif (less)\n\t\treturn !ip6_lessthan(&newbase,val); /* val <= newbase */\n\telse\n\t\treturn !ip6_lessthan(val,&newbase); /* val >= newbase */\n}\n\n\nstatic inline\nbool ip6r_from_cidr(IP6 *prefix, unsigned masklen, IP6R *ipr)\n{\n\tuint64 mask_lo = hostmask6_lo(masklen);\n\tuint64 mask_hi = hostmask6_hi(masklen);\n\tif (masklen > 128)\n\t\treturn false;\n\tif ((prefix->bits[0] & mask_hi) || (prefix->bits[1] & mask_lo))\n\t\treturn false;\n\tipr->upper.bits[0] = (prefix->bits[0] | mask_hi);\n\tipr->upper.bits[1] = (prefix->bits[1] | mask_lo);\n\tipr->lower = *prefix;\n\treturn true;\n}\n\nstatic inline\nbool ip6r_from_inet(IP6 *addr, unsigned masklen, IP6R *ipr)\n{\n\tuint64 mask_lo = hostmask6_lo(masklen);\n\tuint64 mask_hi = hostmask6_hi(masklen);\n\tif (masklen > 128)\n\t\treturn false;\n\tipr->lower.bits[0] = (addr->bits[0] & ~mask_hi);\n\tipr->lower.bits[1] = (addr->bits[1] & ~mask_lo);\n\tipr->upper.bits[0] = (addr->bits[0] | mask_hi);\n\tipr->upper.bits[1] = (addr->bits[1] | mask_lo);\n\treturn true;\n}\n\nstatic inline\nbool ip6r_split_cidr(IP6R *val, IP6R *res)\n{\n\tIP6 lo = val->lower;\n\tIP6 hi = val->upper;\n\tint len = 128;\n\tIP6 mask;\n\tIP6 tmp = lo;\n\n\tres->lower = lo;\n\tres->upper = hi;\n\n\tif (masklen6(&lo,&hi) <= 128U)\n\t\treturn true;\n\n\t/*\n\t * We know that all these cases are impossible because the CIDR check\n\t * would catch them:\n\t *\n\t *\tlo==hi\n\t *\tlo==0 && hi==~0\n\t *\tlo==~0\n\t *\n\t * Therefore this loop must terminate before the mask overflows\n\t */\n\tfor(;;)\n\t{\n\t\tmask.bits[0] = hostmask6_hi(len-1);\n\t\tmask.bits[1] = hostmask6_lo(len-1);\n\n\t\tif ( ((lo.bits[0] & mask.bits[0]) | (lo.bits[1] & mask.bits[1])) != 0 )\n\t\t\tbreak;\n\n\t\ttmp.bits[0] |= mask.bits[0];\n\t\ttmp.bits[1] |= mask.bits[1];\n\n\t\tif (ip6_lessthan(&hi, &tmp))\n\t\t\tbreak;\n\n\t\t--len;\n\t}\n\n\ttmp.bits[0] = lo.bits[0] | hostmask6_hi(len);\n\ttmp.bits[1] = lo.bits[1] | hostmask6_lo(len);\n\n\tres->upper = tmp;\n\tip6_sub_int(&tmp, -1, &val->lower);\n\n\treturn false;\n}\n\n/* helpers for union/intersection for indexing */\n\n/* note that this function has to handle the case where RESULT aliases\n * either of A or B\n */\n\nstatic inline\nIP6R *ip6r_union_internal(IP6R *a, IP6R *b, IP6R *result)\n{\n\tif (ip6_lessthan(&a->lower,&b->lower))\n\t\tresult->lower = a->lower;\n\telse\n\t\tresult->lower = b->lower;\n\n\tif (ip6_lessthan(&b->upper,&a->upper))\n\t\tresult->upper = a->upper;\n\telse\n\t\tresult->upper = b->upper;\n\n\treturn result;\n}\n\nstatic inline\nIP6R *ip6r_inter_internal(IP6R *a, IP6R *b, IP6R *result)\n{\n\tif (ip6_lessthan(&a->upper,&b->lower) || ip6_lessthan(&b->upper,&a->lower))\n\t{\n\t\t/* disjoint */\n\t\tresult->lower.bits[0] = 0;\n\t\tresult->lower.bits[1] = 1;\n\t\tresult->upper.bits[0] = 0;\t/* INVALID VALUE */\n\t\tresult->upper.bits[1] = 0;\t/* INVALID VALUE */\n\t\treturn NULL;\n\t}\n\n\tif (ip6_lessthan(&a->upper,&b->upper))\n\t\tresult->upper = a->upper;\n\telse\n\t\tresult->upper = b->upper;\n\n\tif (ip6_lessthan(&b->lower,&a->lower))\n\t\tresult->lower = a->lower;\n\telse\n\t\tresult->lower = b->lower;\n\n\treturn result;\n}\n\nstatic inline\ndouble ip6r_metric(IP6R *v)\n{\n\tIP6 diff;\n\tdouble res = 0.0;\n\tif (!v)\n\t\treturn res;\n\n\tip6_sub(&v->upper, &v->lower, &diff);\n\n\treturn ( (ldexp((double)diff.bits[0],64))\n\t\t\t + (diff.bits[1] + 1.0) );\n}\n\n/* comparisons */\n\nstatic inline\nbool ip6_less_eq(IP6 *a, IP6 *b)\n{\n\treturn !ip6_lessthan(b,a);\n}\n\nstatic inline\nbool ip6r_equal(IP6R *a, IP6R *b)\n{\n\treturn ip6_equal(&a->lower,&b->lower) && ip6_equal(&a->upper,&b->upper);\n}\n\nstatic inline\nbool ip6r_lessthan(IP6R *a, IP6R *b)\n{\n\tswitch (ip6_compare(&a->lower,&b->lower))\n\t{\n\t\tdefault: return ip6_lessthan(&a->upper,&b->upper);\n\t\tcase -1: return true;\n\t\tcase 1: return false;\n\t}\n}\n\nstatic inline\nbool ip6r_less_eq(IP6R *a, IP6R *b)\n{\n\treturn !ip6r_lessthan(b,a);\n}\n\nstatic inline\nbool ip6r_contains_internal(IP6R *left, IP6R *right, bool eqval)\n{\n\tif (ip6r_equal(left,right))\n\t\treturn eqval;\n\treturn !ip6_lessthan(&right->lower,&left->lower) && !ip6_lessthan(&left->upper,&right->upper);\n}\n\nstatic inline\nbool ip6r_overlaps_internal(IP6R *left, IP6R *right)\n{\n\treturn !ip6_lessthan(&left->upper,&right->lower) && !ip6_lessthan(&right->upper,&left->lower);\n}\n\nstatic inline\nbool ip6_contains_internal(IP6R *left, IP6 *right)\n{\n\treturn !ip6_lessthan(right,&left->lower) && !ip6_lessthan(&left->upper,right);\n}\n\n/* end */\n"
  },
  {
    "path": "src/ipaddr.c",
    "content": "/* ipaddr.c */\n\n#include \"postgres.h\"\n\n#include <math.h>\n#include <sys/socket.h>\n\n#include \"fmgr.h\"\n#include \"funcapi.h\"\n\n#include \"access/gist.h\"\n#include \"access/hash.h\"\n#include \"access/skey.h\"\n#include \"libpq/pqformat.h\"\n#include \"utils/builtins.h\"\n#include \"utils/elog.h\"\n#include \"utils/numeric.h\"\n#include \"utils/palloc.h\"\n#include \"utils/varbit.h\"\n\n#include \"ipr_internal.h\"\n\n#include \"ip4r_funcs.h\"\n#include \"ip6r_funcs.h\"\n\nvoid ipaddr_internal_error(void)\n{\n\telog(ERROR,\"Invalid IP datum\");\n\n\t/* just to shut the compiler up */\n\tabort();\n}\n\n\n/*\n * generic transforms of IP values - apply the specified ip4 or ip6 function\n * to the given args according to parameter type. Where the result type is an\n * IP, it's the same family as the parameter IP.\n */\n\n/* func(IP) returns Datum */\n\nstatic inline\nDatum\nipaddr_transform_1d(Datum d, PGFunction ip4func, PGFunction ip6func)\n{\n\tIP_P ipp = DatumGetIP_P(d);\n\tIP ip;\n\tint af = ip_unpack(ipp, &ip);\n\n\tswitch (af)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\treturn DirectFunctionCall1(ip4func, IP4GetDatum(ip.ip4));\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\treturn DirectFunctionCall1(ip6func, IP6PGetDatum(&ip.ip6));\n\t}\n\n\tipaddr_internal_error();\n}\n\n\n/* func(IP) returns IP */\n\nstatic inline\nIP_P\nipaddr_transform_1(Datum d, PGFunction ip4func, PGFunction ip6func)\n{\n\tIP_P ipp = DatumGetIP_P(d);\n\tIP ip;\n\tint af = ip_unpack(ipp, &ip);\n\n\tswitch (af)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tip.ip4 = DatumGetIP4(DirectFunctionCall1(ip4func, IP4GetDatum(ip.ip4)));\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tip.ip6 = *(DatumGetIP6P(DirectFunctionCall1(ip6func, IP6PGetDatum(&ip.ip6))));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tipaddr_internal_error();\n\t}\n\n\treturn ip_pack(af, &ip);\n}\n\n\n/* func(IP, Datum) returns IP */\n\nstatic inline\nIP_P\nipaddr_transform_2d(Datum d1, Datum d2, PGFunction ip4func, PGFunction ip6func)\n{\n\tIP_P ipp = DatumGetIP_P(d1);\n\tIP ip;\n\tint af = ip_unpack(ipp, &ip);\n\n\tswitch (af)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tip.ip4 = DatumGetIP4(DirectFunctionCall2(ip4func, IP4GetDatum(ip.ip4), d2));\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tip.ip6 = *(DatumGetIP6P(DirectFunctionCall2(ip6func, IP6PGetDatum(&ip.ip6), d2)));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tipaddr_internal_error();\n\t}\n\n\treturn ip_pack(af, &ip);\n}\n\n/* func(IP,IP) returns IP; it's an error for the source IPs to be in different families */\n\nstatic inline\nIP_P\nipaddr_transform_2(Datum d1, Datum d2, PGFunction ip4func, PGFunction ip6func)\n{\n\tIP_P ipp1 = DatumGetIP_P(d1);\n\tIP_P ipp2 = DatumGetIP_P(d2);\n\tIP ip1;\n\tIP ip2;\n\tIP out;\n\tint af1 = ip_unpack(ipp1, &ip1);\n\tint af2 = ip_unpack(ipp2, &ip2);\n\n\tif (af1 != af2)\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"invalid mixing of IP address families\")));\n\n\tswitch (af1)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tout.ip4 = DatumGetIP4(DirectFunctionCall2(ip4func, IP4GetDatum(ip1.ip4), IP4GetDatum(ip2.ip4)));\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tout.ip6 = *(DatumGetIP6P(DirectFunctionCall2(ip6func, IP6PGetDatum(&ip1.ip6), IP6PGetDatum(&ip2.ip6))));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tipaddr_internal_error();\n\t}\n\n\treturn ip_pack(af1, &out);\n}\n\n\n\n\n/*\n#define GIST_DEBUG\n#define GIST_QUERY_DEBUG\n*/\n\nstatic\ntext *\nmake_text(char *str, int len)\n{\n\ttext *ret = (text *) palloc(len + VARHDRSZ);\n\tSET_VARSIZE(ret, len + VARHDRSZ);\n\tif (str)\n\t\tmemcpy(VARDATA(ret), str, len);\n\telse\n\t\tmemset(VARDATA(ret), 0, len);\n\treturn ret;\n}\n\nstatic inline\nvoid\nset_text_len(text *txt, int len)\n{\n\tif ((len + VARHDRSZ) < VARSIZE(txt))\n\t  SET_VARSIZE(txt, len + VARHDRSZ);\n}\n\n\n/*\n** Input/Output routines\n*/\n\nPG_FUNCTION_INFO_V1(ipaddr_in);\nDatum\nipaddr_in(PG_FUNCTION_ARGS)\n{\n\tchar *str = PG_GETARG_CSTRING(0);\n\tIP ip;\n\n\tif (strchr(str,':'))\n\t{\n\t\tif (ip6_raw_input(str, ip.ip6.bits))\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip));\n\t}\n\telse\n\t{\n\t\tif (ip4_raw_input(str, &ip.ip4))\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip));\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP value: '%s'\", str)));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_out);\nDatum\nipaddr_out(PG_FUNCTION_ARGS)\n{\n\tIP_P ipp = PG_GETARG_IP_P(0);\n\tchar *out = palloc(IP6_STRING_MAX);\n\tIP ip;\n\n\tswitch (ip_unpack(ipp, &ip))\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tip4_raw_output(ip.ip4, out, IP6_STRING_MAX);\n\t\t\tbreak;\n\t\tcase PGSQL_AF_INET6:\n\t\t\tip6_raw_output(ip.ip6.bits, out, IP6_STRING_MAX);\n\t\t\tbreak;\n\t}\n\n\tPG_RETURN_CSTRING(out);\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_recv);\nDatum\nipaddr_recv(PG_FUNCTION_ARGS)\n{\n\tStringInfo buf = (StringInfo) PG_GETARG_POINTER(0);\n\tIP ip;\n\tint af, bits, nbytes;\n\n\t/* we copy the external format used by inet/cidr, just because. */\n\n\taf = pq_getmsgbyte(buf);\n\tif (af != PGSQL_AF_INET && af != PGSQL_AF_INET6)\n\t\tereturn(fcinfo->context, (Datum)0,\n\t\t\t\t(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),\n\t\t\t\t errmsg(\"invalid address family in external IP value\")));\n\tbits = pq_getmsgbyte(buf);\n\tif (bits != ipr_af_maxbits(af))\n\t\tereturn(fcinfo->context, (Datum)0,\n\t\t\t\t(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),\n\t\t\t\t errmsg(\"invalid bit length in external IP value\")));\n\t(void) pq_getmsgbyte(buf);\t/* ignore flag */\n\tnbytes = pq_getmsgbyte(buf);\n\tif (nbytes*8 != bits)\n\t\tereturn(fcinfo->context, (Datum)0,\n\t\t\t\t(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),\n\t\t\t\t errmsg(\"invalid address length in external IP value\")));\n\n\tswitch (af)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tip.ip4 = (IP4) pq_getmsgint(buf, sizeof(IP4));\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tip.ip6.bits[0] = pq_getmsgint64(buf);\n\t\t\tip.ip6.bits[1] = pq_getmsgint64(buf);\n\t\t\tbreak;\n\t}\n\n\tPG_RETURN_IP_P(ip_pack(af, &ip));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_send);\nDatum\nipaddr_send(PG_FUNCTION_ARGS)\n{\n\tIP_P arg1 = PG_GETARG_IP_P(0);\n\tStringInfoData buf;\n\tIP ip;\n\tint af = ip_unpack(arg1, &ip);\n\n\tpq_begintypsend(&buf);\n\tpq_sendbyte(&buf, af);\n\tpq_sendbyte(&buf, (int8) ipr_af_maxbits(af));\n\tpq_sendbyte(&buf, 1);\n\tpq_sendbyte(&buf, ip_sizeof(af));\n\n\tswitch (af)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tpq_sendint(&buf, ip.ip4, sizeof(IP4));\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tpq_sendint64(&buf, ip.ip6.bits[0]);\n\t\t\tpq_sendint64(&buf, ip.ip6.bits[1]);\n\t\t\tbreak;\n\t}\n\n\tPG_RETURN_BYTEA_P(pq_endtypsend(&buf));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_hash);\nDatum\nipaddr_hash(PG_FUNCTION_ARGS)\n{\n\tIP_P arg1 = PG_GETARG_IP_P(0);\n\n\treturn hash_any((void*)(VARDATA_ANY(arg1)), VARSIZE_ANY_EXHDR(arg1));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_hash_extended);\nDatum\nipaddr_hash_extended(PG_FUNCTION_ARGS)\n{\n\tIP_P arg1 = PG_GETARG_IP_P(0);\n\tuint64 seed = DatumGetUInt64(PG_GETARG_DATUM(1));\n\n\treturn hash_any_extended((void*)(VARDATA_ANY(arg1)), VARSIZE_ANY_EXHDR(arg1), seed);\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_cast_to_text);\nDatum\nipaddr_cast_to_text(PG_FUNCTION_ARGS)\n{\n\tIP_P ipp = PG_GETARG_IP_P(0);\n\tIP ip;\n\tint af = ip_unpack(ipp, &ip);\n\ttext *out = NULL;\n\n\tswitch (af)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tout = make_text(NULL, IP4_STRING_MAX);\n\t\t\tset_text_len(out, ip4_raw_output(ip.ip4, VARDATA(out), IP4_STRING_MAX));\n\t\t\tbreak;\n\t\tcase PGSQL_AF_INET6:\n\t\t\tout = make_text(NULL, IP6_STRING_MAX);\n\t\t\tset_text_len(out, ip6_raw_output(ip.ip6.bits, VARDATA(out), IP6_STRING_MAX));\n\t\t\tbreak;\n\t}\n\n\tPG_RETURN_TEXT_P(out);\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_cast_from_text);\nDatum\nipaddr_cast_from_text(PG_FUNCTION_ARGS)\n{\n\ttext *txt = PG_GETARG_TEXT_PP(0);\n\tint tlen = VARSIZE_ANY_EXHDR(txt);\n\tchar buf[IP6_STRING_MAX];\n\n\tif (tlen < sizeof(buf))\n\t{\n\t\tIP ip;\n\n\t\tmemcpy(buf, VARDATA_ANY(txt), tlen);\n\t\tbuf[tlen] = 0;\n\n\t\tif (strchr(buf,':'))\n\t\t{\n\t\t\tif (ip6_raw_input(buf, ip.ip6.bits))\n\t\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (ip4_raw_input(buf, &ip.ip4))\n\t\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip));\n\t\t}\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP value in text\")));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_cast_from_inet);\nDatum\nipaddr_cast_from_inet(PG_FUNCTION_ARGS)\n{\n\tinet *inetptr = PG_GETARG_INET_P(0);\n\tinet_struct *in = INET_STRUCT_DATA(inetptr);\n\tIP ip;\n\n\tswitch (in->family)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tip.ip4 = DatumGetIP4(DirectFunctionCall1(ip4_cast_from_inet, InetPGetDatum(inetptr)));\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip));\n\t\tcase PGSQL_AF_INET6:\n\t\t\tip.ip6 = *(DatumGetIP6P(DirectFunctionCall1(ip6_cast_from_inet, InetPGetDatum(inetptr))));\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip));\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid INET value for conversion to IP\")));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_cast_to_cidr);\nDatum\nipaddr_cast_to_cidr(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_DATUM(ipaddr_transform_1d(PG_GETARG_DATUM(0), ip4_cast_to_cidr, ip6_cast_to_cidr));\n}\n\n\nPG_FUNCTION_INFO_V1(ipaddr_cast_to_numeric);\nDatum\nipaddr_cast_to_numeric(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_DATUM(ipaddr_transform_1d(PG_GETARG_DATUM(0), ip4_cast_to_numeric, ip6_cast_to_numeric));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_cast_from_ip4);\nDatum\nipaddr_cast_from_ip4(PG_FUNCTION_ARGS)\n{\n\tIP ip;\n\n\tip.ip4 = PG_GETARG_IP4(0);\n\n\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_cast_from_ip6);\nDatum\nipaddr_cast_from_ip6(PG_FUNCTION_ARGS)\n{\n\tIP6 *in = PG_GETARG_IP6_P(0);\n\tIP ip;\n\n\tip.ip6 = *in;\n\n\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip));\n}\n\n\nPG_FUNCTION_INFO_V1(ipaddr_cast_to_ip4);\nDatum\nipaddr_cast_to_ip4(PG_FUNCTION_ARGS)\n{\n\tIP_P ipp = PG_GETARG_IP_P(0);\n\tIP ip;\n\n\tif (ip_unpack(ipp, &ip) == PGSQL_AF_INET)\n\t{\n\t\tPG_RETURN_IP4(ip.ip4);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP value in cast to IP4\")));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_cast_to_ip6);\nDatum\nipaddr_cast_to_ip6(PG_FUNCTION_ARGS)\n{\n\tIP_P ipp = PG_GETARG_IP_P(0);\n\tIP ip;\n\n\tif (ip_unpack(ipp, &ip) == PGSQL_AF_INET6)\n\t{\n\t\tIP6 *out = palloc(sizeof(IP6));\n\t\t*out = ip.ip6;\n\t\tPG_RETURN_IP6_P(out);\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP value in cast to IP4\")));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_cast_from_bit);\nDatum\nipaddr_cast_from_bit(PG_FUNCTION_ARGS)\n{\n\tVarBit *val = PG_GETARG_VARBIT_P(0);\n\tIP ip;\n\n\tswitch (VARBITLEN(val))\n\t{\n\t\tcase 32:\n\t\t\tip.ip4 = DatumGetIP4(DirectFunctionCall1(ip4_cast_from_bit, VarBitPGetDatum(val)));\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip));\n\t\tcase 128:\n\t\t\tip.ip6 = *(DatumGetIP6P(DirectFunctionCall1(ip6_cast_from_bit, VarBitPGetDatum(val))));\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip));\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid BIT value for conversion to IPADDRESS\")));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_cast_to_bit);\nDatum\nipaddr_cast_to_bit(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_DATUM(ipaddr_transform_1d(PG_GETARG_DATUM(0), ip4_cast_to_bit, ip6_cast_to_bit));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_cast_from_bytea);\nDatum\nipaddr_cast_from_bytea(PG_FUNCTION_ARGS)\n{\n\tvoid *val = PG_GETARG_BYTEA_PP(0);\n\tIP ip;\n\n\tswitch (VARSIZE_ANY_EXHDR(val))\n\t{\n\t\tcase 4:\n\t\t\tip.ip4 = DatumGetIP4(DirectFunctionCall1(ip4_cast_from_bytea, PointerGetDatum(val)));\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip));\n\t\tcase 16:\n\t\t\tip.ip6 = *(DatumGetIP6P(DirectFunctionCall1(ip6_cast_from_bytea, PointerGetDatum(val))));\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip));\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid BYTEA value for conversion to IPADDRESS\")));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_cast_to_bytea);\nDatum\nipaddr_cast_to_bytea(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_DATUM(ipaddr_transform_1d(PG_GETARG_DATUM(0), ip4_cast_to_bytea, ip6_cast_to_bytea));\n}\n\n\nPG_FUNCTION_INFO_V1(ipaddr_family);\nDatum\nipaddr_family(PG_FUNCTION_ARGS)\n{\n\tIP_P ipp = PG_GETARG_IP_P(0);\n\tIP ip;\n\n\tif (ip_unpack(ipp, &ip) == PGSQL_AF_INET6)\n\t\tPG_RETURN_INT32(6);\n\telse\n\t\tPG_RETURN_INT32(4);\n}\n\n\nPG_FUNCTION_INFO_V1(ipaddr_net_lower);\nDatum\nipaddr_net_lower(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_IP_P(ipaddr_transform_2d(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1), ip4_net_lower, ip6_net_lower));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_net_upper);\nDatum\nipaddr_net_upper(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_IP_P(ipaddr_transform_2d(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1), ip4_net_upper, ip6_net_upper));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_plus_int);\nDatum\nipaddr_plus_int(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_IP_P(ipaddr_transform_2d(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1), ip4_plus_int, ip6_plus_int));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_plus_bigint);\nDatum\nipaddr_plus_bigint(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_IP_P(ipaddr_transform_2d(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1), ip4_plus_bigint, ip6_plus_bigint));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_plus_numeric);\nDatum\nipaddr_plus_numeric(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_IP_P(ipaddr_transform_2d(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1), ip4_plus_numeric, ip6_plus_numeric));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_minus_int);\nDatum\nipaddr_minus_int(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_IP_P(ipaddr_transform_2d(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1), ip4_minus_int, ip6_minus_int));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_minus_bigint);\nDatum\nipaddr_minus_bigint(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_IP_P(ipaddr_transform_2d(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1), ip4_minus_bigint, ip6_minus_bigint));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_minus_numeric);\nDatum\nipaddr_minus_numeric(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_IP_P(ipaddr_transform_2d(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1), ip4_minus_numeric, ip6_minus_numeric));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_minus_ipaddr);\nDatum\nipaddr_minus_ipaddr(PG_FUNCTION_ARGS)\n{\n\tDatum minuend = PG_GETARG_DATUM(0);\n\tDatum subtrahend = PG_GETARG_DATUM(1);\n\tDatum res;\n\tIP ip1;\n\tIP ip2;\n\tint af1 = ip_unpack(DatumGetIP_P(minuend), &ip1);\n\tint af2 = ip_unpack(DatumGetIP_P(subtrahend), &ip2);\n\n\tif (af1 != af2)\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"invalid mixing of IP address families\")));\n\n\tswitch (af1)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tres = DirectFunctionCall2(numeric_sub,\n\t\t\t\t\t\t\t\t\t  DirectFunctionCall1(ip4_cast_to_numeric,IP4GetDatum(ip1.ip4)),\n\t\t\t\t\t\t\t\t\t  DirectFunctionCall1(ip4_cast_to_numeric,IP4GetDatum(ip2.ip4)));\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tres = DirectFunctionCall2(numeric_sub,\n\t\t\t\t\t\t\t\t\t  DirectFunctionCall1(ip6_cast_to_numeric,IP6PGetDatum(&ip1.ip6)),\n\t\t\t\t\t\t\t\t\t  DirectFunctionCall1(ip6_cast_to_numeric,IP6PGetDatum(&ip2.ip6)));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tipaddr_internal_error();\n\t}\n\n\tPG_RETURN_DATUM(res);\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_and);\nDatum\nipaddr_and(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_IP_P(ipaddr_transform_2(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1), ip4_and, ip6_and));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_or);\nDatum\nipaddr_or(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_IP_P(ipaddr_transform_2(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1), ip4_or, ip6_or));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_xor);\nDatum\nipaddr_xor(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_IP_P(ipaddr_transform_2(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1), ip4_xor, ip6_xor));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_not);\nDatum\nipaddr_not(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_IP_P(ipaddr_transform_1(PG_GETARG_DATUM(0), ip4_not, ip6_not));\n}\n\n\n/*\n * generic boolean comparison of two IPs. If in the same family, then the\n * passed-in comparison function is called; if in different families, then\n * the result is mismatch_af1 or _af2 according to which of the first or\n * second address is in the larger family.\n */\n\nstatic inline\nbool\nipaddr_comparison_bool(Datum d1, Datum d2,\n\t\t\t\t\t   bool mismatch_af1, bool mismatch_af2,\n\t\t\t\t\t   PGFunction ip4func, PGFunction ip6func)\n{\n\tIP_P ipp1 = DatumGetIP_P(d1);\n\tIP_P ipp2 = DatumGetIP_P(d2);\n\tIP ip1;\n\tIP ip2;\n\tint af1 = ip_unpack(ipp1, &ip1);\n\tint af2 = ip_unpack(ipp2, &ip2);\n\tbool retval;\n\n\tif (af1 != af2)\n\t{\n\t\tretval = (af1 > af2) ? mismatch_af1 : mismatch_af2;\n\t}\n\telse\n\t{\n\t\tswitch (af1)\n\t\t{\n\t\t\tcase PGSQL_AF_INET:\n\t\t\t\tretval = DatumGetBool(DirectFunctionCall2(ip4func, IP4GetDatum(ip1.ip4), IP4GetDatum(ip2.ip4)));\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET6:\n\t\t\t\tretval = DatumGetBool(DirectFunctionCall2(ip6func, IP6PGetDatum(&ip1.ip6), IP6PGetDatum(&ip2.ip6)));\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tipaddr_internal_error();\n\t\t}\n\t}\n\n\tif ((Pointer)ipp1 != DatumGetPointer(d1))\n\t\tpfree(ipp1);\n\tif ((Pointer)ipp2 != DatumGetPointer(d2))\n\t\tpfree(ipp2);\n\n\treturn retval;\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_lt);\nDatum\nipaddr_lt(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL(\n\t\tipaddr_comparison_bool(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1),\n\t\t\t\t\t\t\t   false, true,\n\t\t\t\t\t\t\t   ip4_lt, ip6_lt));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_le);\nDatum\nipaddr_le(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL(\n\t\tipaddr_comparison_bool(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1),\n\t\t\t\t\t\t\t   false, true,\n\t\t\t\t\t\t\t   ip4_le, ip6_le));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_gt);\nDatum\nipaddr_gt(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL(\n\t\tipaddr_comparison_bool(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1),\n\t\t\t\t\t\t\t   true, false,\n\t\t\t\t\t\t\t   ip4_gt, ip6_gt));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_ge);\nDatum\nipaddr_ge(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL(\n\t\tipaddr_comparison_bool(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1),\n\t\t\t\t\t\t\t   true, false,\n\t\t\t\t\t\t\t   ip4_ge, ip6_ge));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_eq);\nDatum\nipaddr_eq(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL(\n\t\tipaddr_comparison_bool(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1),\n\t\t\t\t\t\t\t   false, false,\n\t\t\t\t\t\t\t   ip4_eq, ip6_eq));\n}\n\nPG_FUNCTION_INFO_V1(ipaddr_neq);\nDatum\nipaddr_neq(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL(\n\t\tipaddr_comparison_bool(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1),\n\t\t\t\t\t\t\t   true, true,\n\t\t\t\t\t\t\t   ip4_neq, ip6_neq));\n}\n\n\n/*****************************************************************************\n *\t\t\t\t\t\t\t\t\t\t\t\t   Btree functions\n *****************************************************************************/\n\nPG_FUNCTION_INFO_V1(ipaddr_cmp);\nDatum\nipaddr_cmp(PG_FUNCTION_ARGS)\n{\n\tIP_P ipp1 = PG_GETARG_IP_P(0);\n\tIP_P ipp2 = PG_GETARG_IP_P(1);\n\tIP ip1;\n\tIP ip2;\n\tint af1 = ip_unpack(ipp1, &ip1);\n\tint af2 = ip_unpack(ipp2, &ip2);\n\tint32 retval;\n\n\tif (af1 != af2)\n\t{\n\t\tretval = (af1 > af2) ? 1 : -1;\n\t}\n\telse\n\t{\n\t\tswitch (af1)\n\t\t{\n\t\t\tcase PGSQL_AF_INET:\n\t\t\t\tretval = DatumGetInt32(DirectFunctionCall2(ip4_cmp, IP4GetDatum(ip1.ip4), IP4GetDatum(ip2.ip4)));\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET6:\n\t\t\t\tretval = DatumGetInt32(DirectFunctionCall2(ip6_cmp, IP6PGetDatum(&ip1.ip6), IP6PGetDatum(&ip2.ip6)));\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tipaddr_internal_error();\n\t\t}\n\t}\n\n\tPG_FREE_IF_COPY(ipp1,0);\n\tPG_FREE_IF_COPY(ipp2,1);\n\n\tPG_RETURN_INT32(retval);\n}\n\n/* end */\n"
  },
  {
    "path": "src/ipr.h",
    "content": "/* ipr.h */\n#ifndef IPR_H\n#define IPR_H\n\n#if !defined(PG_VERSION_NUM)\n#error \"Unknown or unsupported postgresql version\"\n#endif\n#if PG_VERSION_NUM < 90100\n#error \"Unknown or unsupported postgresql version\"\n#endif\n\n#include <string.h>\n#include <sys/socket.h>\n\n#include \"fmgr.h\"\n\n#include \"utils/inet.h\"\n#include \"utils/palloc.h\"\n\n#if PG_VERSION_NUM >= 160000\n#include \"varatt.h\"\n#endif\n\n#ifndef PGDLLEXPORT\n#define PGDLLEXPORT\n#endif\n\nPGDLLEXPORT bool ip4_raw_input(const char *src, uint32 *dst);\nPGDLLEXPORT bool ip6_raw_input(const char *src, uint64 *dst);\nPGDLLEXPORT int ip4_raw_output(uint32 ip, char *str, int len);\nPGDLLEXPORT int ip6_raw_output(uint64 *ip, char *str, int len);\n\n/* IP4 = uint32, stored in host-order. fixed-length and pass by value. */\ntypedef uint32 IP4;\n\n#define IP4_INITIALIZER 0\n\n/* IP4R = range of IP4, stored in host-order. fixed-length by reference */\ntypedef struct IP4R {\n\tIP4 lower;\n\tIP4 upper;\n} IP4R;\n\n#define IP4R_INITIALIZER {0,0}\n\n/*\n * IP6 = 2 x uint64, stored hi to lo, each stored in host-order.\n * fixed-length and pass by reference.\n */\ntypedef struct IP6 {\n\tuint64 bits[2];\n} IP6;\n\n#define IP6_INITIALIZER {{0,0}}\n\n/* IP6R = range of IP6. fixed-length by reference */\ntypedef struct IP6R {\n\tIP6 lower;\n\tIP6 upper;\n} IP6R;\n\n#define IP6R_INITIALIZER {IP6_INITIALIZER,IP6_INITIALIZER}\n\n#define IP6_STRING_MAX (sizeof(\"ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255\")+2)\n#define IP6R_STRING_MAX (2*IP6_STRING_MAX)\n\n#define IP4_STRING_MAX (sizeof(\"255.255.255.255\"))\n#define IP4R_STRING_MAX (2*IP4_STRING_MAX)\n\ntypedef union IP {\n\tIP6 ip6;\n\tIP4 ip4;\n} IP;\n\n#define IP_INITIALIZER {IP6_INITIALIZER}\n\n#define ipr_af_maxbits(af_) ((af_) == PGSQL_AF_INET ? 32 : 128)\n#define ip_sizeof(af_) ((af_) == PGSQL_AF_INET ? sizeof(IP4) : sizeof(IP6))\n#define ipr_sizeof(af_) ((af_) == PGSQL_AF_INET ? sizeof(IP4R) : sizeof(IP6R))\n\ntypedef void *IP_P;\t /* unaligned! */\n\nPGDLLEXPORT void ipaddr_internal_error(void) __attribute__((noreturn));\n\nstatic inline\nint ip_unpack(IP_P in, IP *out)\n{\n\tswitch (VARSIZE_ANY_EXHDR(in))\n\t{\n\t\tcase sizeof(IP4):\n\t\t\tmemcpy(&out->ip4, VARDATA_ANY(in), sizeof(IP4));\n\t\t\treturn PGSQL_AF_INET;\n\t\tcase sizeof(IP6):\n\t\t\tmemcpy(&out->ip6, VARDATA_ANY(in), sizeof(IP6));\n\t\t\treturn PGSQL_AF_INET6;\n\t\tdefault:\n\t\t\tipaddr_internal_error();\n\t}\n}\n\nstatic inline\nIP_P ip_pack(int af, IP *val)\n{\n\tint sz = ip_sizeof(af);\n\tIP_P out = palloc(VARHDRSZ + sz);\n\n\tSET_VARSIZE(out, VARHDRSZ + sz);\n\tmemcpy(VARDATA(out), val, sz);\n\treturn out;\n}\n\ntypedef union IPR {\n\tIP6R ip6r;\n\tIP4R ip4r;\n} IPR;\n\n#define IPR_INITIALIZER {IP6R_INITIALIZER}\n\ntypedef void *IPR_P;  /* unaligned! */\n\nPGDLLEXPORT int ipr_unpack(IPR_P in, IPR *out);\nPGDLLEXPORT IPR_P ipr_pack(int af, IPR *val);\n\n#define DatumGetIP4RP(X)\t((IP4R *) DatumGetPointer(X))\n#define IP4RPGetDatum(X)\tPointerGetDatum(X)\n#define PG_GETARG_IP4R_P(n) DatumGetIP4RP(PG_GETARG_DATUM(n))\n#define PG_RETURN_IP4R_P(x) return IP4RPGetDatum(x)\n\n#define DatumGetIP4(X) DatumGetUInt32(X)\n#define IP4GetDatum(X) UInt32GetDatum(X)\n#define PG_GETARG_IP4(n) PG_GETARG_UINT32(n)\n#define PG_RETURN_IP4(x) PG_RETURN_UINT32(x)\n\n#define DatumGetIP6RP(X)\t((IP6R *) DatumGetPointer(X))\n#define IP6RPGetDatum(X)\tPointerGetDatum(X)\n#define PG_GETARG_IP6R_P(n) DatumGetIP6RP(PG_GETARG_DATUM(n))\n#define PG_RETURN_IP6R_P(x) return IP6RPGetDatum(x)\n\n#define DatumGetIP6P(X)\t((IP6 *) DatumGetPointer(X))\n#define IP6PGetDatum(X)\tPointerGetDatum(X)\n#define PG_GETARG_IP6_P(n) DatumGetIP6P(PG_GETARG_DATUM(n))\n#define PG_RETURN_IP6_P(x) return IP6PGetDatum(x)\n\n#define DatumGetIP_P(X) ((IP_P) PG_DETOAST_DATUM_PACKED(X))\n#define IP_PGetDatum(X) PointerGetDatum(X)\n#define PG_GETARG_IP_P(n) DatumGetIP_P(PG_GETARG_DATUM(n))\n#define PG_RETURN_IP_P(x) return IP_PGetDatum(x)\n\n#define DatumGetIPR_P(X) ((IP_P) PG_DETOAST_DATUM_PACKED(X))\n#define IPR_PGetDatum(X) PointerGetDatum(X)\n#define PG_GETARG_IPR_P(n) DatumGetIPR_P(PG_GETARG_DATUM(n))\n#define PG_RETURN_IPR_P(x) return IPR_PGetDatum(x)\n\n#endif\n/* end */\n"
  },
  {
    "path": "src/ipr_internal.h",
    "content": "/* ipr_internal.h */\n#ifndef IPR_INTERNAL_H\n#define IPR_INTERNAL_H\n\n#include \"ipr.h\"\n\n#define IP4R_VERSION_STR \"2.4.2\"\n#define IP4R_VERSION_NUM 20402\n\n/* PG version dependencies */\n\n#define INET_STRUCT_DATA(is_) ((inet_struct *)VARDATA_ANY(is_))\n\n#define GISTENTRYCOUNT(v) ((v)->n)\n#define GISTENTRYVEC(v) ((v)->vector)\n\n/* hash_any_extended is new in pg11. On older pg, we don't care about what the\n * extended hash functions return, so just fake it.\n */\n\n#if PG_VERSION_NUM < 110000\n\n#ifndef ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE\n#define ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE MAKE_SQLSTATE('2','2','0','1','3')\n#endif\n\n#ifndef DatumGetUInt64\n#define DatumGetUInt64(d_) ((uint64) DatumGetInt64(d_))\n#endif\n\n#include \"access/hash.h\"\n\nstatic inline\nDatum hash_any_extended(register const unsigned char *k,\n\t\t\t\t\t\tregister int keylen, uint64 seed)\n{\n\tDatum d = hash_any(k, keylen);\n\tPG_RETURN_INT64((int64)(uint32) DatumGetInt32(d));\n}\n\n#endif\n\n/* cope with variable-length fcinfo in pg12 */\n#if PG_VERSION_NUM < 120000\n#define LOCAL_FCINFO(name_,nargs_) \\\n\tFunctionCallInfoData name_##data; \\\n\tFunctionCallInfo name_ = &name_##data\n\n#define LFCI_ARG_VALUE(fci_,n_) ((fci_)->arg[n_])\n#define LFCI_ARGISNULL(fci_,n_) ((fci_)->argnull[n_])\n#else\n#define LFCI_ARG_VALUE(fci_,n_) ((fci_)->args[n_].value)\n#define LFCI_ARGISNULL(fci_,n_) ((fci_)->args[n_].isnull)\n#endif\n\n/* Soft-error handling is new in pg16 */\n#if PG_VERSION_NUM >= 160000\n#include \"nodes/miscnodes.h\"\n#else\n#define ereturn(context_, dummy_value_, ...)\t\\\n\tdo { ereport(ERROR, __VA_ARGS__); return dummy_value_; } while(0)\n#define SOFT_ERROR_OCCURRED(escontext) false\n#endif\n\n/* funcs */\n\nDatum ip4_in(PG_FUNCTION_ARGS);\nDatum ip4_out(PG_FUNCTION_ARGS);\nDatum ip4_recv(PG_FUNCTION_ARGS);\nDatum ip4_send(PG_FUNCTION_ARGS);\nDatum ip4hash(PG_FUNCTION_ARGS);\nDatum ip4_hash_extended(PG_FUNCTION_ARGS);\nDatum ip4_cast_to_text(PG_FUNCTION_ARGS);\nDatum ip4_cast_from_text(PG_FUNCTION_ARGS);\nDatum ip4_cast_from_bit(PG_FUNCTION_ARGS);\nDatum ip4_cast_to_bit(PG_FUNCTION_ARGS);\nDatum ip4_cast_from_bytea(PG_FUNCTION_ARGS);\nDatum ip4_cast_to_bytea(PG_FUNCTION_ARGS);\nDatum ip4_cast_from_inet(PG_FUNCTION_ARGS);\nDatum ip4_cast_to_cidr(PG_FUNCTION_ARGS);\nDatum ip4_cast_to_bigint(PG_FUNCTION_ARGS);\nDatum ip4_cast_to_numeric(PG_FUNCTION_ARGS);\nDatum ip4_cast_from_bigint(PG_FUNCTION_ARGS);\nDatum ip4_cast_from_numeric(PG_FUNCTION_ARGS);\nDatum ip4_cast_to_double(PG_FUNCTION_ARGS);\nDatum ip4_cast_from_double(PG_FUNCTION_ARGS);\nDatum ip4r_in(PG_FUNCTION_ARGS);\nDatum ip4r_out(PG_FUNCTION_ARGS);\nDatum ip4r_recv(PG_FUNCTION_ARGS);\nDatum ip4r_send(PG_FUNCTION_ARGS);\nDatum ip4rhash(PG_FUNCTION_ARGS);\nDatum ip4r_hash_extended(PG_FUNCTION_ARGS);\nDatum ip4r_cast_to_text(PG_FUNCTION_ARGS);\nDatum ip4r_cast_from_text(PG_FUNCTION_ARGS);\nDatum ip4r_cast_from_bit(PG_FUNCTION_ARGS);\nDatum ip4r_cast_to_bit(PG_FUNCTION_ARGS);\nDatum ip4r_cast_from_cidr(PG_FUNCTION_ARGS);\nDatum ip4r_cast_to_cidr(PG_FUNCTION_ARGS);\nDatum ip4r_cast_from_ip4(PG_FUNCTION_ARGS);\nDatum ip4r_from_ip4s(PG_FUNCTION_ARGS);\nDatum ip4r_net_prefix(PG_FUNCTION_ARGS);\nDatum ip4r_net_mask(PG_FUNCTION_ARGS);\nDatum ip4r_lower(PG_FUNCTION_ARGS);\nDatum ip4r_upper(PG_FUNCTION_ARGS);\nDatum ip4r_is_cidr(PG_FUNCTION_ARGS);\nDatum ip4r_cidr_split(PG_FUNCTION_ARGS);\nDatum ip4_netmask(PG_FUNCTION_ARGS);\nDatum ip4_net_lower(PG_FUNCTION_ARGS);\nDatum ip4_net_upper(PG_FUNCTION_ARGS);\nDatum ip4_plus_int(PG_FUNCTION_ARGS);\nDatum ip4_plus_bigint(PG_FUNCTION_ARGS);\nDatum ip4_plus_numeric(PG_FUNCTION_ARGS);\nDatum ip4_minus_int(PG_FUNCTION_ARGS);\nDatum ip4_minus_bigint(PG_FUNCTION_ARGS);\nDatum ip4_minus_numeric(PG_FUNCTION_ARGS);\nDatum ip4_minus_ip4(PG_FUNCTION_ARGS);\nDatum ip4_and(PG_FUNCTION_ARGS);\nDatum ip4_or(PG_FUNCTION_ARGS);\nDatum ip4_xor(PG_FUNCTION_ARGS);\nDatum ip4_not(PG_FUNCTION_ARGS);\nDatum ip4_lt(PG_FUNCTION_ARGS);\nDatum ip4_le(PG_FUNCTION_ARGS);\nDatum ip4_gt(PG_FUNCTION_ARGS);\nDatum ip4_ge(PG_FUNCTION_ARGS);\nDatum ip4_eq(PG_FUNCTION_ARGS);\nDatum ip4_neq(PG_FUNCTION_ARGS);\nDatum ip4r_lt(PG_FUNCTION_ARGS);\nDatum ip4r_le(PG_FUNCTION_ARGS);\nDatum ip4r_gt(PG_FUNCTION_ARGS);\nDatum ip4r_ge(PG_FUNCTION_ARGS);\nDatum ip4r_eq(PG_FUNCTION_ARGS);\nDatum ip4r_neq(PG_FUNCTION_ARGS);\nDatum ip4r_overlaps(PG_FUNCTION_ARGS);\nDatum ip4r_contains(PG_FUNCTION_ARGS);\nDatum ip4r_contains_strict(PG_FUNCTION_ARGS);\nDatum ip4r_contained_by(PG_FUNCTION_ARGS);\nDatum ip4r_contained_by_strict(PG_FUNCTION_ARGS);\nDatum ip4_contains(PG_FUNCTION_ARGS);\nDatum ip4_contained_by(PG_FUNCTION_ARGS);\nDatum ip4r_union(PG_FUNCTION_ARGS);\nDatum ip4r_inter(PG_FUNCTION_ARGS);\nDatum ip4r_size(PG_FUNCTION_ARGS);\nDatum ip4r_size_exact(PG_FUNCTION_ARGS);\nDatum ip4r_prefixlen(PG_FUNCTION_ARGS);\nDatum ip4r_cmp(PG_FUNCTION_ARGS);\nDatum ip4_cmp(PG_FUNCTION_ARGS);\nDatum ip4_in_range_bigint(PG_FUNCTION_ARGS);\nDatum ip4_in_range_ip4(PG_FUNCTION_ARGS);\nDatum ip4r_left_of(PG_FUNCTION_ARGS);\nDatum ip4r_right_of(PG_FUNCTION_ARGS);\n\nDatum ip6_in(PG_FUNCTION_ARGS);\nDatum ip6_out(PG_FUNCTION_ARGS);\nDatum ip6_recv(PG_FUNCTION_ARGS);\nDatum ip6_send(PG_FUNCTION_ARGS);\nDatum ip6hash(PG_FUNCTION_ARGS);\nDatum ip6_hash_extended(PG_FUNCTION_ARGS);\nDatum ip6_cast_to_text(PG_FUNCTION_ARGS);\nDatum ip6_cast_from_text(PG_FUNCTION_ARGS);\nDatum ip6_cast_from_bit(PG_FUNCTION_ARGS);\nDatum ip6_cast_to_bit(PG_FUNCTION_ARGS);\nDatum ip6_cast_from_bytea(PG_FUNCTION_ARGS);\nDatum ip6_cast_to_bytea(PG_FUNCTION_ARGS);\nDatum ip6_cast_from_inet(PG_FUNCTION_ARGS);\nDatum ip6_cast_to_cidr(PG_FUNCTION_ARGS);\nDatum ip6_cast_to_numeric(PG_FUNCTION_ARGS);\nDatum ip6_cast_from_numeric(PG_FUNCTION_ARGS);\nDatum ip6r_in(PG_FUNCTION_ARGS);\nDatum ip6r_out(PG_FUNCTION_ARGS);\nDatum ip6r_recv(PG_FUNCTION_ARGS);\nDatum ip6r_send(PG_FUNCTION_ARGS);\nDatum ip6rhash(PG_FUNCTION_ARGS);\nDatum ip6r_hash_extended(PG_FUNCTION_ARGS);\nDatum ip6r_cast_to_text(PG_FUNCTION_ARGS);\nDatum ip6r_cast_from_text(PG_FUNCTION_ARGS);\nDatum ip6r_cast_from_bit(PG_FUNCTION_ARGS);\nDatum ip6r_cast_to_bit(PG_FUNCTION_ARGS);\nDatum ip6r_cast_from_cidr(PG_FUNCTION_ARGS);\nDatum ip6r_cast_to_cidr(PG_FUNCTION_ARGS);\nDatum ip6r_cast_from_ip6(PG_FUNCTION_ARGS);\nDatum ip6r_from_ip6s(PG_FUNCTION_ARGS);\nDatum ip6r_net_prefix(PG_FUNCTION_ARGS);\nDatum ip6r_net_mask(PG_FUNCTION_ARGS);\nDatum ip6r_lower(PG_FUNCTION_ARGS);\nDatum ip6r_upper(PG_FUNCTION_ARGS);\nDatum ip6r_is_cidr(PG_FUNCTION_ARGS);\nDatum ip6r_cidr_split(PG_FUNCTION_ARGS);\nDatum ip6_netmask(PG_FUNCTION_ARGS);\nDatum ip6_net_lower(PG_FUNCTION_ARGS);\nDatum ip6_net_upper(PG_FUNCTION_ARGS);\nDatum ip6_plus_int(PG_FUNCTION_ARGS);\nDatum ip6_plus_bigint(PG_FUNCTION_ARGS);\nDatum ip6_plus_numeric(PG_FUNCTION_ARGS);\nDatum ip6_minus_int(PG_FUNCTION_ARGS);\nDatum ip6_minus_bigint(PG_FUNCTION_ARGS);\nDatum ip6_minus_numeric(PG_FUNCTION_ARGS);\nDatum ip6_minus_ip6(PG_FUNCTION_ARGS);\nDatum ip6_and(PG_FUNCTION_ARGS);\nDatum ip6_or(PG_FUNCTION_ARGS);\nDatum ip6_xor(PG_FUNCTION_ARGS);\nDatum ip6_not(PG_FUNCTION_ARGS);\nDatum ip6_lt(PG_FUNCTION_ARGS);\nDatum ip6_le(PG_FUNCTION_ARGS);\nDatum ip6_gt(PG_FUNCTION_ARGS);\nDatum ip6_ge(PG_FUNCTION_ARGS);\nDatum ip6_eq(PG_FUNCTION_ARGS);\nDatum ip6_neq(PG_FUNCTION_ARGS);\nDatum ip6r_lt(PG_FUNCTION_ARGS);\nDatum ip6r_le(PG_FUNCTION_ARGS);\nDatum ip6r_gt(PG_FUNCTION_ARGS);\nDatum ip6r_ge(PG_FUNCTION_ARGS);\nDatum ip6r_eq(PG_FUNCTION_ARGS);\nDatum ip6r_neq(PG_FUNCTION_ARGS);\nDatum ip6r_overlaps(PG_FUNCTION_ARGS);\nDatum ip6r_contains(PG_FUNCTION_ARGS);\nDatum ip6r_contains_strict(PG_FUNCTION_ARGS);\nDatum ip6r_contained_by(PG_FUNCTION_ARGS);\nDatum ip6r_contained_by_strict(PG_FUNCTION_ARGS);\nDatum ip6_contains(PG_FUNCTION_ARGS);\nDatum ip6_contained_by(PG_FUNCTION_ARGS);\nDatum ip6r_union(PG_FUNCTION_ARGS);\nDatum ip6r_inter(PG_FUNCTION_ARGS);\nDatum ip6r_size(PG_FUNCTION_ARGS);\nDatum ip6r_size_exact(PG_FUNCTION_ARGS);\nDatum ip6r_prefixlen(PG_FUNCTION_ARGS);\nDatum ip6r_cmp(PG_FUNCTION_ARGS);\nDatum ip6_cmp(PG_FUNCTION_ARGS);\nDatum ip6_in_range_bigint(PG_FUNCTION_ARGS);\nDatum ip6_in_range_ip6(PG_FUNCTION_ARGS);\n#if 0\nDatum ip6_in_range_numeric(PG_FUNCTION_ARGS);\n#endif\nDatum ip6r_left_of(PG_FUNCTION_ARGS);\nDatum ip6r_right_of(PG_FUNCTION_ARGS);\n\nDatum ipaddr_in(PG_FUNCTION_ARGS);\nDatum ipaddr_out(PG_FUNCTION_ARGS);\nDatum ipaddr_recv(PG_FUNCTION_ARGS);\nDatum ipaddr_send(PG_FUNCTION_ARGS);\nDatum ipaddr_hash(PG_FUNCTION_ARGS);\nDatum ipaddr_hash_extended(PG_FUNCTION_ARGS);\nDatum ipaddr_cast_to_text(PG_FUNCTION_ARGS);\nDatum ipaddr_cast_from_text(PG_FUNCTION_ARGS);\nDatum ipaddr_cast_from_bit(PG_FUNCTION_ARGS);\nDatum ipaddr_cast_to_bit(PG_FUNCTION_ARGS);\nDatum ipaddr_cast_from_bytea(PG_FUNCTION_ARGS);\nDatum ipaddr_cast_to_bytea(PG_FUNCTION_ARGS);\nDatum ipaddr_cast_from_inet(PG_FUNCTION_ARGS);\nDatum ipaddr_cast_to_cidr(PG_FUNCTION_ARGS);\nDatum ipaddr_cast_to_numeric(PG_FUNCTION_ARGS);\nDatum ipaddr_cast_from_ip4(PG_FUNCTION_ARGS);\nDatum ipaddr_cast_from_ip6(PG_FUNCTION_ARGS);\nDatum ipaddr_cast_to_ip4(PG_FUNCTION_ARGS);\nDatum ipaddr_cast_to_ip6(PG_FUNCTION_ARGS);\nDatum ipaddr_net_lower(PG_FUNCTION_ARGS);\nDatum ipaddr_net_upper(PG_FUNCTION_ARGS);\nDatum ipaddr_family(PG_FUNCTION_ARGS);\nDatum ipaddr_plus_int(PG_FUNCTION_ARGS);\nDatum ipaddr_plus_bigint(PG_FUNCTION_ARGS);\nDatum ipaddr_plus_numeric(PG_FUNCTION_ARGS);\nDatum ipaddr_minus_int(PG_FUNCTION_ARGS);\nDatum ipaddr_minus_bigint(PG_FUNCTION_ARGS);\nDatum ipaddr_minus_numeric(PG_FUNCTION_ARGS);\nDatum ipaddr_minus_ipaddr(PG_FUNCTION_ARGS);\nDatum ipaddr_and(PG_FUNCTION_ARGS);\nDatum ipaddr_or(PG_FUNCTION_ARGS);\nDatum ipaddr_xor(PG_FUNCTION_ARGS);\nDatum ipaddr_not(PG_FUNCTION_ARGS);\nDatum ipaddr_lt(PG_FUNCTION_ARGS);\nDatum ipaddr_le(PG_FUNCTION_ARGS);\nDatum ipaddr_gt(PG_FUNCTION_ARGS);\nDatum ipaddr_ge(PG_FUNCTION_ARGS);\nDatum ipaddr_eq(PG_FUNCTION_ARGS);\nDatum ipaddr_neq(PG_FUNCTION_ARGS);\nDatum ipaddr_cmp(PG_FUNCTION_ARGS);\n\nDatum iprange_in(PG_FUNCTION_ARGS);\nDatum iprange_out(PG_FUNCTION_ARGS);\nDatum iprange_recv(PG_FUNCTION_ARGS);\nDatum iprange_send(PG_FUNCTION_ARGS);\nDatum iprange_hash(PG_FUNCTION_ARGS);\nDatum iprange_hash_new(PG_FUNCTION_ARGS);\nDatum iprange_hash_extended(PG_FUNCTION_ARGS);\nDatum iprange_cast_to_text(PG_FUNCTION_ARGS);\nDatum iprange_cast_from_text(PG_FUNCTION_ARGS);\nDatum iprange_cast_from_cidr(PG_FUNCTION_ARGS);\nDatum iprange_cast_to_cidr(PG_FUNCTION_ARGS);\nDatum iprange_cast_to_bit(PG_FUNCTION_ARGS);\nDatum iprange_cast_from_ip4(PG_FUNCTION_ARGS);\nDatum iprange_cast_from_ip6(PG_FUNCTION_ARGS);\nDatum iprange_cast_from_ipaddr(PG_FUNCTION_ARGS);\nDatum iprange_cast_from_ip4r(PG_FUNCTION_ARGS);\nDatum iprange_cast_from_ip6r(PG_FUNCTION_ARGS);\nDatum iprange_cast_to_ip4r(PG_FUNCTION_ARGS);\nDatum iprange_cast_to_ip6r(PG_FUNCTION_ARGS);\nDatum iprange_from_ip4s(PG_FUNCTION_ARGS);\nDatum iprange_from_ip6s(PG_FUNCTION_ARGS);\nDatum iprange_from_ipaddrs(PG_FUNCTION_ARGS);\nDatum iprange_net_prefix_ip4(PG_FUNCTION_ARGS);\nDatum iprange_net_prefix_ip6(PG_FUNCTION_ARGS);\nDatum iprange_net_prefix(PG_FUNCTION_ARGS);\nDatum iprange_net_mask_ip4(PG_FUNCTION_ARGS);\nDatum iprange_net_mask_ip6(PG_FUNCTION_ARGS);\nDatum iprange_net_mask(PG_FUNCTION_ARGS);\nDatum iprange_lower(PG_FUNCTION_ARGS);\nDatum iprange_upper(PG_FUNCTION_ARGS);\nDatum iprange_is_cidr(PG_FUNCTION_ARGS);\nDatum iprange_family(PG_FUNCTION_ARGS);\nDatum iprange_cidr_split(PG_FUNCTION_ARGS);\nDatum iprange_lt(PG_FUNCTION_ARGS);\nDatum iprange_le(PG_FUNCTION_ARGS);\nDatum iprange_gt(PG_FUNCTION_ARGS);\nDatum iprange_ge(PG_FUNCTION_ARGS);\nDatum iprange_eq(PG_FUNCTION_ARGS);\nDatum iprange_neq(PG_FUNCTION_ARGS);\nDatum iprange_overlaps(PG_FUNCTION_ARGS);\nDatum iprange_contains(PG_FUNCTION_ARGS);\nDatum iprange_contains_strict(PG_FUNCTION_ARGS);\nDatum iprange_contained_by(PG_FUNCTION_ARGS);\nDatum iprange_contained_by_strict(PG_FUNCTION_ARGS);\nDatum iprange_contains_ip(PG_FUNCTION_ARGS);\nDatum iprange_contains_ip4(PG_FUNCTION_ARGS);\nDatum iprange_contains_ip6(PG_FUNCTION_ARGS);\nDatum iprange_ip_contained_by(PG_FUNCTION_ARGS);\nDatum iprange_ip4_contained_by(PG_FUNCTION_ARGS);\nDatum iprange_ip6_contained_by(PG_FUNCTION_ARGS);\nDatum iprange_union(PG_FUNCTION_ARGS);\nDatum iprange_inter(PG_FUNCTION_ARGS);\nDatum iprange_size(PG_FUNCTION_ARGS);\nDatum iprange_size_exact(PG_FUNCTION_ARGS);\nDatum iprange_prefixlen(PG_FUNCTION_ARGS);\nDatum iprange_cmp(PG_FUNCTION_ARGS);\n\n#endif\n"
  },
  {
    "path": "src/iprange.c",
    "content": "/* iprange.c */\n\n#include \"postgres.h\"\n\n#include <math.h>\n#include <sys/socket.h>\n\n#include \"fmgr.h\"\n#include \"funcapi.h\"\n\n#include \"access/gist.h\"\n#include \"access/hash.h\"\n#include \"access/skey.h\"\n#include \"libpq/pqformat.h\"\n#include \"utils/builtins.h\"\n#include \"utils/elog.h\"\n#include \"utils/numeric.h\"\n#include \"utils/palloc.h\"\n#include \"utils/varbit.h\"\n\n#include \"ipr_internal.h\"\n\n#include \"ip4r_funcs.h\"\n#include \"ip6r_funcs.h\"\n\n/*\n * Some C compilers including GCC really get confused by the use of the IP and\n * IPR unions, generating a lot of completely spurious \"may be used\n * uninitialized\" warnings. The various uses of IP*_INITIALIZER in this file\n * ought to be unnecessary; so this macro is used to make them conditional for\n * ease of experimentation.\n */\n\n#define XINIT(_i) = _i\n\nstatic void iprange_internal_error(void) __attribute__((noreturn,noinline));\nstatic void iprange_af_mismatch(void) __attribute__((noreturn,noinline));\n\nstatic\nvoid iprange_internal_error(void)\n{\n\telog(ERROR,\"Invalid IPR datum\");\n\n\t/* just to shut the compiler up */\n\tabort();\n}\n\nstatic\nvoid iprange_af_mismatch(void)\n{\n\tereport(ERROR,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid mixing of IP address families\")));\n\t/* just to shut the compiler up */\n\tabort();\n}\n\n\n/*\n * Rather than use 32 bytes + length for every IP range, we make the\n * assumption that most ranges (at least in table data and hence gist\n * leaf nodes) will be CIDRs, and many of those /64 or shorter.\n *\n * So we allow the following formats (excluding varlena header):\n *\n *\t0 bytes\t\t\t\t\t - special 'match all' range (af==0)\n *\t8 bytes\t\t\t\t\t - IP4R\n *\t1 byte pfxlen + 8 bytes\t - IP6R cidr range /64 or shorter\n *\t1 byte pfxlen + 16 bytes - IP6R cidr range /65 or longer\n *\t32 bytes\t\t\t\t - arbitrary IP6R range\n */\n\nint ipr_unpack(IPR_P in, IPR *out)\n{\n\tunsigned char *ptr = (unsigned char *) VARDATA_ANY(in);\n\n\tswitch (VARSIZE_ANY_EXHDR(in))\n\t{\n\t\tcase 0:\n\t\t\treturn 0;\n\n\t\tcase sizeof(IP4R):\n\t\t\tmemcpy(&out->ip4r, ptr, sizeof(IP4R));\n\t\t\treturn PGSQL_AF_INET;\n\n\t\tcase 1+sizeof(uint64):\n\t\t{\n\t\t\tunsigned pfxlen = *ptr++;\n\t\t\tmemcpy(out->ip6r.lower.bits, ptr, sizeof(uint64));\n\t\t\tout->ip6r.lower.bits[1] = 0;\n\t\t\tout->ip6r.upper.bits[0] = out->ip6r.lower.bits[0] | hostmask6_hi(pfxlen);\n\t\t\tout->ip6r.upper.bits[1] = hostmask6_lo(pfxlen);\n\t\t\treturn PGSQL_AF_INET6;\n\t\t}\n\n\t\tcase 1+sizeof(IP6):\n\t\t{\n\t\t\tunsigned pfxlen = *ptr++;\n\t\t\tmemcpy(&out->ip6r.lower, ptr, sizeof(IP6));\n\t\t\tout->ip6r.upper.bits[0] = out->ip6r.lower.bits[0] | hostmask6_hi(pfxlen);\n\t\t\tout->ip6r.upper.bits[1] = out->ip6r.lower.bits[1] | hostmask6_lo(pfxlen);\n\t\t\treturn PGSQL_AF_INET6;\n\t\t}\n\n\t\tcase sizeof(IP6R):\n\t\t\tmemcpy(&out->ip6r, ptr, sizeof(IP6R));\n\t\t\treturn PGSQL_AF_INET6;\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n}\n\nIPR_P ipr_pack(int af, IPR *val)\n{\n\tIPR_P out = palloc(VARHDRSZ + sizeof(IP6R));\n\tunsigned char *ptr = (unsigned char *) VARDATA(out);\n\n\tswitch (af)\n\t{\n\t\tcase 0:\n\t\t\tSET_VARSIZE(out, VARHDRSZ);\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET:\n\t\t\tmemcpy(ptr, &val->ip4r, sizeof(IP4R));\n\t\t\tSET_VARSIZE(out, VARHDRSZ + sizeof(IP4R));\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET6:\n\t\t{\n\t\t\tunsigned pfxlen = masklen6(&val->ip6r.lower, &val->ip6r.upper);\n\t\t\tif (pfxlen <= 64)\n\t\t\t{\n\t\t\t\t*ptr++ = pfxlen;\n\t\t\t\tmemcpy(ptr, val->ip6r.lower.bits, sizeof(uint64));\n\t\t\t\tSET_VARSIZE(out, VARHDRSZ + 1 + sizeof(uint64));\n\t\t\t}\n\t\t\telse if (pfxlen <= 128)\n\t\t\t{\n\t\t\t\t*ptr++ = pfxlen;\n\t\t\t\tmemcpy(ptr, &val->ip6r.lower, sizeof(IP6));\n\t\t\t\tSET_VARSIZE(out, VARHDRSZ + 1 + sizeof(IP6));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmemcpy(ptr, &val->ip6r, sizeof(IP6R));\n\t\t\t\tSET_VARSIZE(out, VARHDRSZ + sizeof(IP6R));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n\n\treturn out;\n}\n\n\n/**************************************************************************/\n/* This part handles all aspects of postgres interfacing.\n */\n\n/*\n** Input/Output routines\n*/\n\n/*---- ipr ----*/\n\nPG_FUNCTION_INFO_V1(iprange_in);\nDatum\niprange_in(PG_FUNCTION_ARGS)\n{\n\tchar *str = PG_GETARG_CSTRING(0);\n\tIPR ipr;\n\n\tif (str[0] == '-' && str[1] == 0)\n\t{\n\t\tPG_RETURN_IPR_P(ipr_pack(0, NULL));\n\t}\n\telse if (strchr(str,':'))\n\t{\n\t\tDatum res = ip6r_in(fcinfo);\n\t\tif (SOFT_ERROR_OCCURRED(fcinfo->context))\n\t\t\tPG_RETURN_DATUM(res);\n\t\tipr.ip6r = *DatumGetIP6RP(res);\n\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET6, &ipr));\n\t}\n\telse\n\t{\n\t\tDatum res = ip4r_in(fcinfo);\n\t\tif (SOFT_ERROR_OCCURRED(fcinfo->context))\n\t\t\tPG_RETURN_DATUM(res);\n\t\tipr.ip4r = *DatumGetIP4RP(res);\n\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET, &ipr));\n\t}\n}\n\nPG_FUNCTION_INFO_V1(iprange_out);\nDatum\niprange_out(PG_FUNCTION_ARGS)\n{\n\tIPR_P *iprp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tint af = ipr_unpack(iprp, &ipr);\n\n\tswitch (af)\n\t{\n\t\tcase 0:\n\t\t{\n\t\t\tchar *out = palloc(2);\n\t\t\tstrcpy(out,\"-\");\n\t\t\tPG_RETURN_CSTRING(out);\n\t\t}\n\n\t\tcase PGSQL_AF_INET:\n\t\t\tPG_RETURN_DATUM(DirectFunctionCall1(ip4r_out,IP4RPGetDatum(&ipr.ip4r)));\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tPG_RETURN_DATUM(DirectFunctionCall1(ip6r_out,IP6RPGetDatum(&ipr.ip6r)));\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n}\n\nPG_FUNCTION_INFO_V1(iprange_recv);\nDatum\niprange_recv(PG_FUNCTION_ARGS)\n{\n\tStringInfo buf = (StringInfo) PG_GETARG_POINTER(0);\n\tIPR ipr;\n\tunsigned af, bits, nbytes;\n\n\t/*\n\t * This isn't quite the same format as inet/cidr but we keep reasonably\n\t * close for no very good reason.\n\t *\n\t * 1 byte AF\n\t * 1 byte pfx len (255 if the range is not a prefix)\n\t * 1 byte flag (unused)\n\t * 1 byte number of remaining bytes (0,4,8,16 or 32)\n\t *\n\t */\n\n\taf = pq_getmsgbyte(buf);\n\tif (af != 0 && af != PGSQL_AF_INET && af != PGSQL_AF_INET6)\n\t\tereturn(fcinfo->context, (Datum)0,\n\t\t\t\t(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),\n\t\t\t\t errmsg(\"invalid address family in external IPR value\")));\n\tbits = pq_getmsgbyte(buf);\n\tif (bits != 255 && bits > ipr_af_maxbits(af))\n\t\tereturn(fcinfo->context, (Datum)0,\n\t\t\t\t(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),\n\t\t\t\t errmsg(\"invalid bit length in external IP value\")));\n\t(void) pq_getmsgbyte(buf);\t/* ignore flag */\n\tnbytes = pq_getmsgbyte(buf);\n\n\tswitch (af)\n\t{\n\t\tcase 0:\t /* special 'match all' range */\n\t\t\tif (nbytes == 0)\n\t\t\t\tPG_RETURN_IPR_P(ipr_pack(0,NULL));\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET:\n\t\t\tif (nbytes == sizeof(IP4) && bits <= ipr_af_maxbits(PGSQL_AF_INET))\n\t\t\t{\n\t\t\t\tipr.ip4r.lower = (IP4) pq_getmsgint(buf, sizeof(IP4));\n\t\t\t\tipr.ip4r.upper = ipr.ip4r.lower | hostmask(bits);\n\t\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET,&ipr));\n\t\t\t}\n\t\t\telse if (nbytes == sizeof(IP4R))\n\t\t\t{\n\t\t\t\tipr.ip4r.lower = (IP4) pq_getmsgint(buf, sizeof(IP4));\n\t\t\t\tipr.ip4r.upper = (IP4) pq_getmsgint(buf, sizeof(IP4));\n\t\t\t\tif (ipr.ip4r.upper < ipr.ip4r.lower)\n\t\t\t\t{\n\t\t\t\t\tIP4 t = ipr.ip4r.upper;\n\t\t\t\t\tipr.ip4r.upper = ipr.ip4r.lower;\n\t\t\t\t\tipr.ip4r.lower = t;\n\t\t\t\t}\n\t\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET,&ipr));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tif (nbytes == sizeof(uint64) && bits <= 64)\n\t\t\t{\n\t\t\t\tipr.ip6r.lower.bits[0] = (uint64) pq_getmsgint64(buf);\n\t\t\t\tipr.ip6r.lower.bits[1] = 0;\n\t\t\t\tipr.ip6r.upper.bits[0] = ipr.ip6r.lower.bits[0] | hostmask6_hi(bits);\n\t\t\t\tipr.ip6r.upper.bits[1] = ~(uint64)0;\n\t\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET6,&ipr));\n\t\t\t}\n\t\t\telse if (nbytes == sizeof(IP6) && bits <= ipr_af_maxbits(PGSQL_AF_INET6))\n\t\t\t{\n\t\t\t\tipr.ip6r.lower.bits[0] = (uint64) pq_getmsgint64(buf);\n\t\t\t\tipr.ip6r.lower.bits[1] = (uint64) pq_getmsgint64(buf);\n\t\t\t\tipr.ip6r.upper.bits[0] = ipr.ip6r.lower.bits[0] | hostmask6_hi(bits);\n\t\t\t\tipr.ip6r.upper.bits[1] = ipr.ip6r.lower.bits[1] | hostmask6_lo(bits);\n\t\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET6,&ipr));\n\t\t\t}\n\t\t\telse if (nbytes == sizeof(IP6R))\n\t\t\t{\n\t\t\t\tipr.ip6r.lower.bits[0] = (uint64) pq_getmsgint64(buf);\n\t\t\t\tipr.ip6r.lower.bits[1] = (uint64) pq_getmsgint64(buf);\n\t\t\t\tipr.ip6r.upper.bits[0] = (uint64) pq_getmsgint64(buf);\n\t\t\t\tipr.ip6r.upper.bits[1] = (uint64) pq_getmsgint64(buf);\n\t\t\t\tif (ip6_lessthan(&ipr.ip6r.upper, &ipr.ip6r.lower))\n\t\t\t\t{\n\t\t\t\t\tIP6 t = ipr.ip6r.upper;\n\t\t\t\t\tipr.ip6r.upper = ipr.ip6r.lower;\n\t\t\t\t\tipr.ip6r.lower = t;\n\t\t\t\t}\n\t\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET6,&ipr));\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),\n\t\t\t errmsg(\"invalid address length in external IPR value\")));\n}\n\nPG_FUNCTION_INFO_V1(iprange_send);\nDatum\niprange_send(PG_FUNCTION_ARGS)\n{\n\tIPR_P *iprp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tint af = ipr_unpack(iprp, &ipr);\n\tStringInfoData buf;\n\tunsigned bits = ~0;\n\n\tswitch (af)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tbits = masklen(ipr.ip4r.lower,ipr.ip4r.upper);\n\t\t\tbreak;\n\t\tcase PGSQL_AF_INET6:\n\t\t\tbits = masklen6(&ipr.ip6r.lower,&ipr.ip6r.upper);\n\t\t\tbreak;\n\t}\n\n\tpq_begintypsend(&buf);\n\tpq_sendbyte(&buf, af);\n\tpq_sendbyte(&buf, (int8) bits);\n\tpq_sendbyte(&buf, 1);\n\n\tswitch (af)\n\t{\n\t\tcase 0:\n\t\t\tpq_sendbyte(&buf,0);\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET:\n\t\t\tif (bits <= ipr_af_maxbits(PGSQL_AF_INET))\n\t\t\t{\n\t\t\t\tpq_sendbyte(&buf, sizeof(IP4));\n\t\t\t\tpq_sendint(&buf, ipr.ip4r.lower, sizeof(IP4));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpq_sendbyte(&buf, sizeof(IP4R));\n\t\t\t\tpq_sendint(&buf, ipr.ip4r.lower, sizeof(IP4));\n\t\t\t\tpq_sendint(&buf, ipr.ip4r.upper, sizeof(IP4));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tif (bits <= 64)\n\t\t\t{\n\t\t\t\tpq_sendbyte(&buf, sizeof(uint64));\n\t\t\t\tpq_sendint64(&buf, ipr.ip6r.lower.bits[0]);\n\t\t\t}\n\t\t\telse if (bits <= ipr_af_maxbits(PGSQL_AF_INET6))\n\t\t\t{\n\t\t\t\tpq_sendbyte(&buf, sizeof(IP6));\n\t\t\t\tpq_sendint64(&buf, ipr.ip6r.lower.bits[0]);\n\t\t\t\tpq_sendint64(&buf, ipr.ip6r.lower.bits[1]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpq_sendbyte(&buf, sizeof(IP6R));\n\t\t\t\tpq_sendint64(&buf, ipr.ip6r.lower.bits[0]);\n\t\t\t\tpq_sendint64(&buf, ipr.ip6r.lower.bits[1]);\n\t\t\t\tpq_sendint64(&buf, ipr.ip6r.upper.bits[0]);\n\t\t\t\tpq_sendint64(&buf, ipr.ip6r.upper.bits[1]);\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tPG_RETURN_BYTEA_P(pq_endtypsend(&buf));\n}\n\n/* Unfortunately due to a historical oversight, this function produces\n * different hash values for ipv6 cidr ranges than ip6rhash. This is\n * undesirable for a hash function since it would block future attempts to add\n * cross-type comparisons, and if this behaviour were to be propagated into\n * the extended hash function then it would become cast in stone, thanks to\n * hash partitioning.\n *\n * So we make the old sql-callable function name keep using the old hash, so\n * that anyone manually using iprangehash for partitioning or whatever is\n * unaffected, but change the actual hash opclass to use new names.\n */\n\nPG_FUNCTION_INFO_V1(iprange_hash);\nDatum\niprange_hash(PG_FUNCTION_ARGS)\n{\n\tIPR_P arg1 = PG_GETARG_IPR_P(0);\n\n\treturn hash_any((void *) VARDATA_ANY(arg1), VARSIZE_ANY_EXHDR(arg1));\n}\n\n/* below are the fixed hash functions\n */\n\nPG_FUNCTION_INFO_V1(iprange_hash_new);\nDatum\niprange_hash_new(PG_FUNCTION_ARGS)\n{\n\tIPR_P arg1 = PG_GETARG_IPR_P(0);\n\tIPR tmp;\n\tuint32 vsize = VARSIZE_ANY_EXHDR(arg1);\n\n\tif (vsize <= sizeof(IP4R) || vsize == sizeof(IP6R))\n\t\treturn hash_any((void *) VARDATA_ANY(arg1), vsize);\n\n\tif (ipr_unpack(arg1,&tmp) != PGSQL_AF_INET6)\n\t\tiprange_internal_error();\n\n\treturn hash_any((void *) &tmp, sizeof(IP6R));\n}\n\nPG_FUNCTION_INFO_V1(iprange_hash_extended);\nDatum\niprange_hash_extended(PG_FUNCTION_ARGS)\n{\n\tIPR_P arg1 = PG_GETARG_IPR_P(0);\n\tIPR tmp;\n\tuint32 vsize = VARSIZE_ANY_EXHDR(arg1);\n\tuint32 seed = DatumGetUInt32(PG_GETARG_DATUM(1));\n\n\tif (vsize <= sizeof(IP4R) || vsize == sizeof(IP6R))\n\t\treturn hash_any_extended((void *) VARDATA_ANY(arg1), vsize, seed);\n\n\tif (ipr_unpack(arg1,&tmp) != PGSQL_AF_INET6)\n\t\tiprange_internal_error();\n\n\treturn hash_any_extended((void *) &tmp, sizeof(IP6R), seed);\n}\n\nPG_FUNCTION_INFO_V1(iprange_cast_to_text);\nDatum\niprange_cast_to_text(PG_FUNCTION_ARGS)\n{\n\tIPR_P iprp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tint af = ipr_unpack(iprp,&ipr);\n\n\tswitch (af)\n\t{\n\t\tcase 0:\n\t\t{\n\t\t\ttext *out = cstring_to_text_with_len(\"-\",1);\n\t\t\tPG_RETURN_TEXT_P(out);\n\t\t}\n\n\t\tcase PGSQL_AF_INET:\n\t\t\tPG_RETURN_DATUM(DirectFunctionCall1(ip4r_cast_to_text,IP4RPGetDatum(&ipr.ip4r)));\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tPG_RETURN_DATUM(DirectFunctionCall1(ip6r_cast_to_text,IP6RPGetDatum(&ipr.ip6r)));\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n}\n\nPG_FUNCTION_INFO_V1(iprange_cast_from_text);\nDatum\niprange_cast_from_text(PG_FUNCTION_ARGS)\n{\n\ttext *txt = PG_GETARG_TEXT_PP(0);\n\tint tlen = VARSIZE_ANY_EXHDR(txt);\n\tchar buf[IP6R_STRING_MAX];\n\tLOCAL_FCINFO(fc, 3);\n\tDatum res;\n\n\tif (tlen < sizeof(buf))\n\t{\n\t\tmemcpy(buf, VARDATA_ANY(txt), tlen);\n\t\tbuf[tlen] = 0;\n\n\t\tInitFunctionCallInfoData(*fc, NULL, 1, fcinfo->fncollation, fcinfo->context, NULL);\n\t\tLFCI_ARG_VALUE(fc, 0) = CStringGetDatum(buf);\n\t\tLFCI_ARGISNULL(fc, 0) = false;\n\n\t\tres = iprange_in(fc);\n\t\tfcinfo->isnull = fc->isnull;\n\t\treturn res;\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IPR value in text\")));\n}\n\nPG_FUNCTION_INFO_V1(iprange_cast_from_cidr);\nDatum\niprange_cast_from_cidr(PG_FUNCTION_ARGS)\n{\n\tinet *inetptr = PG_GETARG_INET_P(0);\n\tinet_struct *in = INET_STRUCT_DATA(inetptr);\n\tunsigned char *p = in->ipaddr;\n\tIPR ipr;\n\n\tif (in->bits <= ipr_af_maxbits(in->family))\n\t{\n\t\tswitch (in->family)\n\t\t{\n\t\t\tcase PGSQL_AF_INET:\n\t\t\t{\n\t\t\t\tIP4 ip = (p[0] << 24)|(p[1] << 16)|(p[2] << 8)|p[3];\n\t\t\t\tif (ip4r_from_cidr(ip, in->bits, &ipr.ip4r))\n\t\t\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET,&ipr));\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET6:\n\t\t\t{\n\t\t\t\tIP6 ip;\n\t\t\t\tip.bits[0] = (((uint64)p[0] << 56)\n\t\t\t\t\t\t\t  | ((uint64)p[1] << 48)\n\t\t\t\t\t\t\t  | ((uint64)p[2] << 40)\n\t\t\t\t\t\t\t  | ((uint64)p[3] << 32)\n\t\t\t\t\t\t\t  | ((uint64)p[4] << 24)\n\t\t\t\t\t\t\t  | ((uint64)p[5] << 16)\n\t\t\t\t\t\t\t  | ((uint64)p[6] << 8)\n\t\t\t\t\t\t\t  | p[7]);\n\t\t\t\tip.bits[1] = (((uint64)p[8] << 56)\n\t\t\t\t\t\t\t  | ((uint64)p[9] << 48)\n\t\t\t\t\t\t\t  | ((uint64)p[10] << 40)\n\t\t\t\t\t\t\t  | ((uint64)p[11] << 32)\n\t\t\t\t\t\t\t  | ((uint64)p[12] << 24)\n\t\t\t\t\t\t\t  | ((uint64)p[13] << 16)\n\t\t\t\t\t\t\t  | ((uint64)p[14] << 8)\n\t\t\t\t\t\t\t  | p[15]);\n\t\t\t\tif (ip6r_from_cidr(&ip, in->bits, &ipr.ip6r))\n\t\t\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET6,&ipr));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tereturn(fcinfo->context, (Datum)0,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid CIDR value for conversion to IPR\")));\n}\n\nPG_FUNCTION_INFO_V1(iprange_cast_to_cidr);\nDatum\niprange_cast_to_cidr(PG_FUNCTION_ARGS)\n{\n\tIPR_P iprp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tint af = ipr_unpack(iprp, &ipr);\n\tinet *res;\n\tinet_struct *in;\n\tunsigned bits;\n\n\tswitch (af)\n\t{\n\t\tcase 0:\n\t\t\tPG_RETURN_NULL();\n\n\t\tcase PGSQL_AF_INET:\n\t\t\tbits = masklen(ipr.ip4r.lower, ipr.ip4r.upper);\n\t\t\tif (bits > ipr_af_maxbits(PGSQL_AF_INET))\n\t\t\t\tPG_RETURN_NULL();\n\n\t\t\tres = palloc0(VARHDRSZ + sizeof(inet_struct));\n\t\t\tSET_VARSIZE(res, VARHDRSZ + offsetof(inet_struct, ipaddr) + 4);\n\n\t\t\tin = ((inet_struct *)VARDATA(res));\n\t\t\tin->bits = bits;\n\t\t\tin->family = PGSQL_AF_INET;\n\t\t\t{\n\t\t\t\tunsigned char *p = in->ipaddr;\n\t\t\t\tIP4 ip = ipr.ip4r.lower;\n\t\t\t\tp[0] = (ip >> 24);\n\t\t\t\tp[1] = (ip >> 16);\n\t\t\t\tp[2] = (ip >>  8);\n\t\t\t\tp[3] = (ip\t\t);\n\t\t\t}\n\n\t\t\tPG_RETURN_INET_P(res);\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tbits = masklen6(&ipr.ip6r.lower, &ipr.ip6r.upper);\n\t\t\tif (bits > ipr_af_maxbits(PGSQL_AF_INET6))\n\t\t\t\tPG_RETURN_NULL();\n\n\t\t\tres = palloc0(VARHDRSZ + sizeof(inet_struct));\n\t\t\tSET_VARSIZE(res, VARHDRSZ + offsetof(inet_struct, ipaddr) + 16);\n\n\t\t\tin = ((inet_struct *)VARDATA(res));\n\t\t\tin->bits = bits;\n\t\t\tin->family = PGSQL_AF_INET6;\n\t\t\t{\n\t\t\t\tunsigned char *p = in->ipaddr;\n\t\t\t\tuint64 b = ipr.ip6r.lower.bits[0];\n\t\t\t\tp[0] = (b >> 56);\n\t\t\t\tp[1] = (b >> 48);\n\t\t\t\tp[2] = (b >> 40);\n\t\t\t\tp[3] = (b >> 32);\n\t\t\t\tp[4] = (b >> 24);\n\t\t\t\tp[5] = (b >> 16);\n\t\t\t\tp[6] = (b >> 8);\n\t\t\t\tp[7] = (b);\n\t\t\t\tb = ipr.ip6r.lower.bits[1];\n\t\t\t\tp[8] = (b >> 56);\n\t\t\t\tp[9] = (b >> 48);\n\t\t\t\tp[10] = (b >> 40);\n\t\t\t\tp[11] = (b >> 32);\n\t\t\t\tp[12] = (b >> 24);\n\t\t\t\tp[13] = (b >> 16);\n\t\t\t\tp[14] = (b >> 8);\n\t\t\t\tp[15] = (b);\n\t\t\t}\n\n\t\t\tPG_RETURN_INET_P(res);\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n}\n\nPG_FUNCTION_INFO_V1(iprange_cast_from_ip4);\nDatum\niprange_cast_from_ip4(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tIPR res;\n\n\tif (ip4r_from_inet(ip, 32, &res.ip4r))\n\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET, &res));\n\n\tereport(ERROR,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP4 value for conversion to IPR (shouldn't be possible)\")));\n\tPG_RETURN_NULL();\n}\n\nPG_FUNCTION_INFO_V1(iprange_cast_from_ip6);\nDatum\niprange_cast_from_ip6(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tIPR res;\n\n\tif (ip6r_from_inet(ip, 128, &res.ip6r))\n\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET6, &res));\n\n\tereport(ERROR,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP6 value for conversion to IPR (shouldn't be possible)\")));\n\tPG_RETURN_NULL();\n}\n\nPG_FUNCTION_INFO_V1(iprange_cast_from_ipaddr);\nDatum\niprange_cast_from_ipaddr(PG_FUNCTION_ARGS)\n{\n\tIP_P ipp = PG_GETARG_IP_P(0);\n\tIP ip;\n\tIPR res;\n\tint af = ip_unpack(ipp, &ip);\n\n\tswitch (af)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tif (ip4r_from_inet(ip.ip4, 32, &res.ip4r))\n\t\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET, &res));\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tif (ip6r_from_inet(&ip.ip6, 128, &res.ip6r))\n\t\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET6, &res));\n\t\t\tbreak;\n\t}\n\n\tereport(ERROR,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid IP6 value for conversion to IPR (shouldn't be possible)\")));\n\tPG_RETURN_NULL();\n}\n\nPG_FUNCTION_INFO_V1(iprange_cast_from_ip4r);\nDatum\niprange_cast_from_ip4r(PG_FUNCTION_ARGS)\n{\n\tIP4R *ipr = PG_GETARG_IP4R_P(0);\n\tIPR res;\n\n\tres.ip4r = *ipr;\n\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET, &res));\n}\n\nPG_FUNCTION_INFO_V1(iprange_cast_from_ip6r);\nDatum\niprange_cast_from_ip6r(PG_FUNCTION_ARGS)\n{\n\tIP6R *ipr = PG_GETARG_IP6R_P(0);\n\tIPR res;\n\n\tres.ip6r = *ipr;\n\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET6, &res));\n}\n\nPG_FUNCTION_INFO_V1(iprange_cast_to_ip4r);\nDatum\niprange_cast_to_ip4r(PG_FUNCTION_ARGS)\n{\n\tIPR_P iprp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tint af = ipr_unpack(iprp,&ipr);\n\tIP4R *res;\n\n\tif (af != PGSQL_AF_INET)\n\t\tereturn(fcinfo->context, (Datum)0,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"invalid IPR value for conversion to IP4R\")));\n\n\tres = palloc(sizeof(IP4R));\n\t*res = ipr.ip4r;\n\n\tPG_RETURN_IP4R_P(res);\n}\n\nPG_FUNCTION_INFO_V1(iprange_cast_to_ip6r);\nDatum\niprange_cast_to_ip6r(PG_FUNCTION_ARGS)\n{\n\tIPR_P iprp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tint af = ipr_unpack(iprp,&ipr);\n\tIP6R *res;\n\n\tif (af != PGSQL_AF_INET6)\n\t\tereturn(fcinfo->context, (Datum)0,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"invalid IPR value for conversion to IP6R\")));\n\n\tres = palloc(sizeof(IP6R));\n\t*res = ipr.ip6r;\n\n\tPG_RETURN_IP6R_P(res);\n}\n\nPG_FUNCTION_INFO_V1(iprange_cast_to_bit);\nDatum\niprange_cast_to_bit(PG_FUNCTION_ARGS)\n{\n\tIPR_P iprp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tint af = ipr_unpack(iprp, &ipr);\n\tunsigned bits;\n\tVarBit *res;\n\tint len;\n\tunsigned char buf[16];\n\n\tswitch (af)\n\t{\n\t\tcase 0:\n\t\t\tPG_RETURN_NULL();\n\n\t\tcase PGSQL_AF_INET:\n\t\t\tbits = masklen(ipr.ip4r.lower, ipr.ip4r.upper);\n\t\t\tif (bits > ipr_af_maxbits(PGSQL_AF_INET))\n\t\t\t\tPG_RETURN_NULL();\n\n\t\t\t{\n\t\t\t\tIP4 ip = ipr.ip4r.lower;\n\t\t\t\tbuf[0] = (ip >> 24);\n\t\t\t\tbuf[1] = (ip >> 16);\n\t\t\t\tbuf[2] = (ip >>\t 8);\n\t\t\t\tbuf[3] = (ip\t  );\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tbits = masklen6(&ipr.ip6r.lower, &ipr.ip6r.upper);\n\t\t\tif (bits > ipr_af_maxbits(PGSQL_AF_INET6))\n\t\t\t\tPG_RETURN_NULL();\n\n\t\t\tip6_serialize(&ipr.ip6r.lower, buf);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n\n\tlen = VARBITTOTALLEN(bits);\n\tres = palloc0(len);\n\tSET_VARSIZE(res, len);\n\tVARBITLEN(res) = bits;\n\n\tmemcpy(VARBITS(res), buf, VARBITBYTES(res));\n\tPG_RETURN_VARBIT_P(res);\n}\n\n\nstatic\nDatum\niprange_from_ipaddrs_internal(int af, IP4 a4, IP4 b4, IP6 *a6, IP6 *b6)\n{\n\tIPR res;\n\n\tswitch (af)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tif (ip4_lessthan(a4,b4))\n\t\t\t\tres.ip4r.lower = a4, res.ip4r.upper = b4;\n\t\t\telse\n\t\t\t\tres.ip4r.lower = b4, res.ip4r.upper = a4;\n\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET,&res));\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tif (ip6_lessthan(a6,b6))\n\t\t\t\tres.ip6r.lower = *a6, res.ip6r.upper = *b6;\n\t\t\telse\n\t\t\t\tres.ip6r.lower = *b6, res.ip6r.upper = *a6;\n\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET6,&res));\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n}\n\nPG_FUNCTION_INFO_V1(iprange_from_ip4s);\nDatum\niprange_from_ip4s(PG_FUNCTION_ARGS)\n{\n\tIP4 a = PG_GETARG_IP4(0);\n\tIP4 b = PG_GETARG_IP4(1);\n\n\tPG_RETURN_DATUM(iprange_from_ipaddrs_internal(PGSQL_AF_INET, a, b, NULL, NULL));\n}\n\nPG_FUNCTION_INFO_V1(iprange_from_ip6s);\nDatum\niprange_from_ip6s(PG_FUNCTION_ARGS)\n{\n\tIP6 *a = PG_GETARG_IP6_P(0);\n\tIP6 *b = PG_GETARG_IP6_P(1);\n\n\tPG_RETURN_DATUM(iprange_from_ipaddrs_internal(PGSQL_AF_INET6, 0, 0, a, b));\n}\n\nPG_FUNCTION_INFO_V1(iprange_from_ipaddrs);\nDatum\niprange_from_ipaddrs(PG_FUNCTION_ARGS)\n{\n\tIP_P ap = PG_GETARG_IP_P(0);\n\tIP_P bp = PG_GETARG_IP_P(1);\n\tIP a,b;\n\tint af_a = ip_unpack(ap,&a);\n\tint af_b = ip_unpack(bp,&b);\n\n\tif (af_a != af_b)\n\t\tiprange_af_mismatch();\n\n\tPG_RETURN_DATUM(iprange_from_ipaddrs_internal(af_a, a.ip4, b.ip4, &a.ip6, &b.ip6));\n}\n\n\nstatic Datum\niprange_net_prefix_internal(int af, IP4 ip4, IP6 *ip6, int pfxlen)\n{\n\tIPR res;\n\n\tif (pfxlen < 0 || pfxlen > ipr_af_maxbits(af))\n\t{\n\t\tereport(ERROR,\n\t\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t\t errmsg(\"prefix length out of range\")));\n\t}\n\n\tswitch (af)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tip4r_from_inet(ip4, (unsigned)pfxlen, &res.ip4r);\n\t\t\tbreak;\n\t\tcase PGSQL_AF_INET6:\n\t\t\tip6r_from_inet(ip6, (unsigned)pfxlen, &res.ip6r);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n\n\tPG_RETURN_IPR_P(ipr_pack(af,&res));\n}\n\nPG_FUNCTION_INFO_V1(iprange_net_prefix_ip4);\nDatum\niprange_net_prefix_ip4(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tint pfxlen = PG_GETARG_INT32(1);\n\n\tPG_RETURN_DATUM(iprange_net_prefix_internal(PGSQL_AF_INET, ip, NULL, pfxlen));\n}\n\nPG_FUNCTION_INFO_V1(iprange_net_prefix_ip6);\nDatum\niprange_net_prefix_ip6(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tint pfxlen = PG_GETARG_INT32(1);\n\n\tPG_RETURN_DATUM(iprange_net_prefix_internal(PGSQL_AF_INET6, 0, ip, pfxlen));\n}\n\nPG_FUNCTION_INFO_V1(iprange_net_prefix);\nDatum\niprange_net_prefix(PG_FUNCTION_ARGS)\n{\n\tIP_P ipp = PG_GETARG_IP_P(0);\n\tIP ip;\n\tint pfxlen = PG_GETARG_INT32(1);\n\tint af = ip_unpack(ipp,&ip);\n\n\tPG_RETURN_DATUM(iprange_net_prefix_internal(af, ip.ip4, &ip.ip6, pfxlen));\n}\n\nstatic Datum\niprange_net_mask_internal(int af, IP4 ip4, IP6 *ip6, IP4 mask4, IP6 *mask6)\n{\n\tIPR res;\n\n\tswitch (af)\n\t{\n\t\tcase PGSQL_AF_INET:\n\t\t\tif (!ip4_valid_netmask(mask4))\n\t\t\t\tbreak;\n\n\t\t\tres.ip4r.lower = ip4 & mask4;\n\t\t\tres.ip4r.upper = ip4 | ~mask4;\n\n\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET,&res));\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tif (!ip6_valid_netmask(mask6->bits[0], mask6->bits[1]))\n\t\t\t\tbreak;\n\n\t\t\tres.ip6r.lower.bits[0] = ip6->bits[0] & mask6->bits[0];\n\t\t\tres.ip6r.lower.bits[1] = ip6->bits[1] & mask6->bits[1];\n\t\t\tres.ip6r.upper.bits[0] = ip6->bits[0] | ~(mask6->bits[0]);\n\t\t\tres.ip6r.upper.bits[1] = ip6->bits[1] | ~(mask6->bits[1]);\n\n\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET6,&res));\n\t}\n\n\tereport(ERROR,\n\t\t\t(errcode(ERRCODE_INVALID_PARAMETER_VALUE),\n\t\t\t errmsg(\"invalid netmask\")));\n\tPG_RETURN_VOID();\n}\n\nPG_FUNCTION_INFO_V1(iprange_net_mask_ip4);\nDatum\niprange_net_mask_ip4(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tIP4 mask = PG_GETARG_IP4(1);\n\n\tPG_RETURN_DATUM(iprange_net_mask_internal(PGSQL_AF_INET, ip, NULL, mask, NULL));\n}\n\nPG_FUNCTION_INFO_V1(iprange_net_mask_ip6);\nDatum\niprange_net_mask_ip6(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tIP6 *mask = PG_GETARG_IP6_P(1);\n\n\tPG_RETURN_DATUM(iprange_net_mask_internal(PGSQL_AF_INET6, 0, ip, 0, mask));\n}\n\nPG_FUNCTION_INFO_V1(iprange_net_mask);\nDatum\niprange_net_mask(PG_FUNCTION_ARGS)\n{\n\tIP_P ipp = PG_GETARG_IP_P(0);\n\tIP_P maskp = PG_GETARG_IP_P(1);\n\tIP ip XINIT(IP_INITIALIZER);\n\tIP mask XINIT(IP_INITIALIZER);\n\tint af1 = ip_unpack(ipp,&ip);\n\tint af2 = ip_unpack(maskp,&mask);\n\n\tif (af1 != af2)\n\t\tiprange_af_mismatch();\n\n\tPG_RETURN_DATUM(iprange_net_mask_internal(af1, ip.ip4, &ip.ip6, mask.ip4, &mask.ip6));\n}\n\nPG_FUNCTION_INFO_V1(iprange_lower);\nDatum\niprange_lower(PG_FUNCTION_ARGS)\n{\n\tIPR_P iprp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tIP ip;\n\tint af = ipr_unpack(iprp,&ipr);\n\n\tswitch (af)\n\t{\n\t\tcase 0:\n\t\t\tip.ip4 = 0;\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET,&ip));\n\n\t\tcase PGSQL_AF_INET:\n\t\t\tip.ip4 = ipr.ip4r.lower;\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET,&ip));\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tip.ip6 = ipr.ip6r.lower;\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6,&ip));\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n}\n\nPG_FUNCTION_INFO_V1(iprange_upper);\nDatum\niprange_upper(PG_FUNCTION_ARGS)\n{\n\tIPR_P iprp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tIP ip;\n\tint af = ipr_unpack(iprp,&ipr);\n\n\tswitch (af)\n\t{\n\t\tcase 0:\n\t\t\tip.ip6.bits[0] = ip.ip6.bits[1] = ~(uint64)0;\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6,&ip));\n\n\t\tcase PGSQL_AF_INET:\n\t\t\tip.ip4 = ipr.ip4r.upper;\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET,&ip));\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tip.ip6 = ipr.ip6r.upper;\n\t\t\tPG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6,&ip));\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n}\n\nPG_FUNCTION_INFO_V1(iprange_is_cidr);\nDatum\niprange_is_cidr(PG_FUNCTION_ARGS)\n{\n\tIPR_P iprp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tint af = ipr_unpack(iprp,&ipr);\n\n\tswitch (af)\n\t{\n\t\tcase 0:\n\t\t\tPG_RETURN_BOOL(false);\n\n\t\tcase PGSQL_AF_INET:\n\t\t\tPG_RETURN_BOOL( (masklen(ipr.ip4r.lower,ipr.ip4r.upper) <= 32U) );\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tPG_RETURN_BOOL( (masklen6(&ipr.ip6r.lower,&ipr.ip6r.upper) <= 128U) );\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n}\n\nPG_FUNCTION_INFO_V1(iprange_family);\nDatum\niprange_family(PG_FUNCTION_ARGS)\n{\n\tIPR_P iprp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tint af = ipr_unpack(iprp,&ipr);\n\n\tswitch (af)\n\t{\n\t\tcase 0:\n\t\t\tPG_RETURN_NULL();\n\n\t\tcase PGSQL_AF_INET:\n\t\t\tPG_RETURN_INT32(4);\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tPG_RETURN_INT32(6);\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n}\n\n/*\n * Decompose an arbitrary range into CIDRs\n */\nPG_FUNCTION_INFO_V1(iprange_cidr_split);\nDatum\niprange_cidr_split(PG_FUNCTION_ARGS)\n{\n\tFuncCallContext *funcctx;\n\tIPR *val;\n\tIPR res;\n\tint af;\n\n\tif (SRF_IS_FIRSTCALL())\n\t{\n\t\tIPR_P *in = PG_GETARG_IPR_P(0);\n\n\t\tfuncctx = SRF_FIRSTCALL_INIT();\n\t\tval = MemoryContextAlloc(funcctx->multi_call_memory_ctx,\n\t\t\t\t\t\t\t\t sizeof(IPR));\n\t\taf = ipr_unpack(in, val);\n\t\tfuncctx->user_fctx = val;\n\t\t/*\n\t\t * We abuse max_calls, which is ignored by the api and only exists as\n\t\t * a convenience variable, to store the current address family. But\n\t\t * out of sheer aesthetics (and for debugging purposes) we store a\n\t\t * value that does actually represent a (loose) upper bound on the row\n\t\t * count.\n\t\t */\n\t\tfuncctx->max_calls = af ? 2*ipr_af_maxbits(af) : 2;\n\t}\n\n\tfuncctx = SRF_PERCALL_SETUP();\n\n\tval = funcctx->user_fctx;\n\tif (!val)\n\t\tSRF_RETURN_DONE(funcctx);\n\tAssert(funcctx->call_cntr < funcctx->max_calls);\n\n\tswitch (funcctx->max_calls)\n\t{\n\t\tcase 2:\n\t\t\t/*\n\t\t\t * We're splitting '-' into '0.0.0.0/0' and '::/0'.\n\t\t\t */\n\t\t\tif (funcctx->call_cntr == 0)\n\t\t\t{\n\t\t\t\tres.ip4r.lower = netmask(0);\n\t\t\t\tres.ip4r.upper = hostmask(0);\n\t\t\t\taf = PGSQL_AF_INET;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfuncctx->user_fctx = NULL;\t/* this is the last row */\n\t\t\t\tres.ip6r.lower.bits[0] = netmask6_hi(0);\n\t\t\t\tres.ip6r.lower.bits[1] = netmask6_lo(0);\n\t\t\t\tres.ip6r.upper.bits[0] = hostmask6_hi(0);\n\t\t\t\tres.ip6r.upper.bits[1] = hostmask6_lo(0);\n\t\t\t\taf = PGSQL_AF_INET6;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 2*ipr_af_maxbits(PGSQL_AF_INET):\n\t\t\tif (ip4r_split_cidr(&val->ip4r, &res.ip4r))\n\t\t\t\tfuncctx->user_fctx = NULL;\n\t\t\taf = PGSQL_AF_INET;\n\t\t\tbreak;\n\n\t\tcase 2*ipr_af_maxbits(PGSQL_AF_INET6):\n\t\t\tif (ip6r_split_cidr(&val->ip6r, &res.ip6r))\n\t\t\t\tfuncctx->user_fctx = NULL;\n\t\t\taf = PGSQL_AF_INET6;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n\n\tSRF_RETURN_NEXT(funcctx, IPR_PGetDatum(ipr_pack(af, &res)));\n}\n\n/*\n * comparisons and indexing\n */\n\nstatic int\niprange_cmp_internal(Datum d1, Datum d2)\n{\n\tIPR_P ipp1 = DatumGetIPR_P(d1);\n\tIPR_P ipp2 = DatumGetIPR_P(d2);\n\tIPR ipr1 XINIT(IPR_INITIALIZER);\n\tIPR ipr2 XINIT(IPR_INITIALIZER);\n\tint af1 = ipr_unpack(ipp1, &ipr1);\n\tint af2 = ipr_unpack(ipp2, &ipr2);\n\tint retval = 0;\n\n\tif (af1 == af2)\n\t{\n\t\tswitch (af1)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET:\n\t\t\t\tif (ip4r_lessthan(&ipr1.ip4r,&ipr2.ip4r))\n\t\t\t\t\tretval = -1;\n\t\t\t\telse if (ip4r_lessthan(&ipr2.ip4r,&ipr1.ip4r))\n\t\t\t\t\tretval = 1;\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET6:\n\t\t\t\tif (ip6r_lessthan(&ipr1.ip6r,&ipr2.ip6r))\n\t\t\t\t\tretval = -1;\n\t\t\t\telse if (ip6r_lessthan(&ipr2.ip6r,&ipr1.ip6r))\n\t\t\t\t\tretval = 1;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tiprange_internal_error();\n\t\t}\n\t}\n\telse if (af1 < af2)\n\t\tretval = -1;\n\telse\n\t\tretval = 1;\n\n\tif ((Pointer)ipp1 != DatumGetPointer(d1))\n\t\tpfree(ipp1);\n\tif ((Pointer)ipp2 != DatumGetPointer(d2))\n\t\tpfree(ipp2);\n\n\treturn retval;\n}\n\nPG_FUNCTION_INFO_V1(iprange_lt);\nDatum\niprange_lt(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( iprange_cmp_internal(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1)) < 0 );\n}\n\nPG_FUNCTION_INFO_V1(iprange_le);\nDatum\niprange_le(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( iprange_cmp_internal(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1)) <= 0 );\n}\n\nPG_FUNCTION_INFO_V1(iprange_gt);\nDatum\niprange_gt(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( iprange_cmp_internal(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1)) > 0 );\n}\n\nPG_FUNCTION_INFO_V1(iprange_ge);\nDatum\niprange_ge(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( iprange_cmp_internal(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1)) >= 0 );\n}\n\nPG_FUNCTION_INFO_V1(iprange_eq);\nDatum\niprange_eq(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( iprange_cmp_internal(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1)) == 0 );\n}\n\nPG_FUNCTION_INFO_V1(iprange_neq);\nDatum\niprange_neq(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( iprange_cmp_internal(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1)) != 0 );\n}\n\nstatic bool\niprange_overlaps_internal(Datum d1, Datum d2)\n{\n\tIPR_P ipp1 = DatumGetIPR_P(d1);\n\tIPR_P ipp2 = DatumGetIPR_P(d2);\n\tIPR ipr1 XINIT(IPR_INITIALIZER);\n\tIPR ipr2 XINIT(IPR_INITIALIZER);\n\tint af1 = ipr_unpack(ipp1, &ipr1);\n\tint af2 = ipr_unpack(ipp2, &ipr2);\n\tbool retval;\n\n\tif (af1 == af2)\n\t{\n\t\tswitch (af1)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tretval = true;\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET:\n\t\t\t\tretval = ip4r_overlaps_internal(&ipr1.ip4r,&ipr2.ip4r);\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET6:\n\t\t\t\tretval = ip6r_overlaps_internal(&ipr1.ip6r,&ipr2.ip6r);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tiprange_internal_error();\n\t\t}\n\t}\n\telse\n\t\tretval = (af1 == 0) || (af2 == 0);\n\n\tif ((Pointer)ipp1 != DatumGetPointer(d1))\n\t\tpfree(ipp1);\n\tif ((Pointer)ipp2 != DatumGetPointer(d2))\n\t\tpfree(ipp2);\n\n\treturn retval;\n}\n\nstatic int\niprange_contains_internal(Datum d1, Datum d2, bool eqval)\n{\n\tIPR_P ipp1 = DatumGetIPR_P(d1);\n\tIPR_P ipp2 = DatumGetIPR_P(d2);\n\tIPR ipr1 XINIT(IPR_INITIALIZER);\n\tIPR ipr2 XINIT(IPR_INITIALIZER);\n\tint af1 = ipr_unpack(ipp1, &ipr1);\n\tint af2 = ipr_unpack(ipp2, &ipr2);\n\tbool retval;\n\n\tif (af1 == af2)\n\t{\n\t\tswitch (af1)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tretval = eqval;\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET:\n\t\t\t\tretval = ip4r_contains_internal(&ipr1.ip4r,&ipr2.ip4r,eqval);\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET6:\n\t\t\t\tretval = ip6r_contains_internal(&ipr1.ip6r,&ipr2.ip6r,eqval);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tiprange_internal_error();\n\t\t}\n\t}\n\telse\n\t\tretval = (af1 == 0);\n\n\tif ((Pointer)ipp1 != DatumGetPointer(d1))\n\t\tpfree(ipp1);\n\tif ((Pointer)ipp2 != DatumGetPointer(d2))\n\t\tpfree(ipp2);\n\n\treturn retval;\n}\n\nstatic int\niprange_contains_ip_internal(Datum d1, int af2, IP4 ip4, IP6 *ip6)\n{\n\tIPR_P ipp1 = DatumGetIPR_P(d1);\n\tIPR ipr1 XINIT(IPR_INITIALIZER);\n\tint af1 = ipr_unpack(ipp1, &ipr1);\n\tbool retval;\n\n\tif (af1 == af2)\n\t{\n\t\tswitch (af1)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tretval = true;\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET:\n\t\t\t\tretval = ip4_contains_internal(&ipr1.ip4r,ip4);\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET6:\n\t\t\t\tretval = ip6_contains_internal(&ipr1.ip6r,ip6);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tiprange_internal_error();\n\t\t}\n\t}\n\telse\n\t\tretval = (af1 == 0);\n\n\tif ((Pointer)ipp1 != DatumGetPointer(d1))\n\t\tpfree(ipp1);\n\n\treturn retval;\n}\n\nPG_FUNCTION_INFO_V1(iprange_overlaps);\nDatum\niprange_overlaps(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( iprange_overlaps_internal(PG_GETARG_DATUM(0),\n\t\t\t\t\t\t\t\t\t\t  PG_GETARG_DATUM(1)) );\n}\n\nPG_FUNCTION_INFO_V1(iprange_contains);\nDatum\niprange_contains(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( iprange_contains_internal(PG_GETARG_DATUM(0),\n\t\t\t\t\t\t\t\t\t\t  PG_GETARG_DATUM(1),\n\t\t\t\t\t\t\t\t\t\t  true) );\n}\n\nPG_FUNCTION_INFO_V1(iprange_contains_strict);\nDatum\niprange_contains_strict(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( iprange_contains_internal(PG_GETARG_DATUM(0),\n\t\t\t\t\t\t\t\t\t\t  PG_GETARG_DATUM(1),\n\t\t\t\t\t\t\t\t\t\t  false) );\n}\n\nPG_FUNCTION_INFO_V1(iprange_contained_by);\nDatum\niprange_contained_by(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( iprange_contains_internal(PG_GETARG_DATUM(1),\n\t\t\t\t\t\t\t\t\t\t  PG_GETARG_DATUM(0),\n\t\t\t\t\t\t\t\t\t\t  true) );\n}\n\nPG_FUNCTION_INFO_V1(iprange_contained_by_strict);\nDatum\niprange_contained_by_strict(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_BOOL( iprange_contains_internal(PG_GETARG_DATUM(1),\n\t\t\t\t\t\t\t\t\t\t  PG_GETARG_DATUM(0),\n\t\t\t\t\t\t\t\t\t\t  false) );\n}\n\nPG_FUNCTION_INFO_V1(iprange_contains_ip);\nDatum\niprange_contains_ip(PG_FUNCTION_ARGS)\n{\n\tIP_P ipp = PG_GETARG_IP_P(1);\n\tIP ip XINIT(IP_INITIALIZER);\n\tint af = ip_unpack(ipp,&ip);\n\tbool retval = iprange_contains_ip_internal(PG_GETARG_DATUM(0), af, ip.ip4, &ip.ip6);\n\n\tPG_FREE_IF_COPY(ipp,1);\n\tPG_RETURN_BOOL(retval);\n}\n\nPG_FUNCTION_INFO_V1(iprange_contains_ip4);\nDatum\niprange_contains_ip4(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(1);\n\tPG_RETURN_BOOL(iprange_contains_ip_internal(PG_GETARG_DATUM(0), PGSQL_AF_INET, ip, NULL));\n}\n\nPG_FUNCTION_INFO_V1(iprange_contains_ip6);\nDatum\niprange_contains_ip6(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(1);\n\tPG_RETURN_BOOL(iprange_contains_ip_internal(PG_GETARG_DATUM(0), PGSQL_AF_INET6, 0, ip));\n}\n\nPG_FUNCTION_INFO_V1(iprange_ip6_contained_by);\nDatum\niprange_ip6_contained_by(PG_FUNCTION_ARGS)\n{\n\tIP6 *ip = PG_GETARG_IP6_P(0);\n\tPG_RETURN_BOOL( iprange_contains_ip_internal(PG_GETARG_DATUM(1), PGSQL_AF_INET6, 0, ip) );\n}\n\nPG_FUNCTION_INFO_V1(iprange_ip4_contained_by);\nDatum\niprange_ip4_contained_by(PG_FUNCTION_ARGS)\n{\n\tIP4 ip = PG_GETARG_IP4(0);\n\tPG_RETURN_BOOL( iprange_contains_ip_internal(PG_GETARG_DATUM(1), PGSQL_AF_INET, ip, NULL) );\n}\n\nPG_FUNCTION_INFO_V1(iprange_ip_contained_by);\nDatum\niprange_ip_contained_by(PG_FUNCTION_ARGS)\n{\n\tIP_P ipp = PG_GETARG_IP_P(0);\n\tIP ip XINIT(IP_INITIALIZER);\n\tint af = ip_unpack(ipp,&ip);\n\tbool retval = iprange_contains_ip_internal(PG_GETARG_DATUM(1), af, ip.ip4, &ip.ip6);\n\n\tPG_FREE_IF_COPY(ipp,0);\n\tPG_RETURN_BOOL(retval);\n}\n\nPG_FUNCTION_INFO_V1(iprange_union);\nDatum\niprange_union(PG_FUNCTION_ARGS)\n{\n\tIPR_P ipp1 = PG_GETARG_IPR_P(0);\n\tIPR_P ipp2 = PG_GETARG_IPR_P(1);\n\tIPR ipr1;\n\tIPR ipr2;\n\tint af1 = ipr_unpack(ipp1, &ipr1);\n\tint af2 = ipr_unpack(ipp2, &ipr2);\n\tIPR res;\n\n\tif (af1 == af2)\n\t{\n\t\tswitch (af1)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tPG_RETURN_IPR_P(ipr_pack(0,NULL));\n\n\t\t\tcase PGSQL_AF_INET:\n\t\t\t\tip4r_union_internal(&ipr1.ip4r,&ipr2.ip4r,&res.ip4r);\n\t\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET,&res));\n\n\t\t\tcase PGSQL_AF_INET6:\n\t\t\t\tip6r_union_internal(&ipr1.ip6r,&ipr2.ip6r,&res.ip6r);\n\t\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET6,&res));\n\n\t\t\tdefault:\n\t\t\t\tiprange_internal_error();\n\t\t}\n\t}\n\telse\n\t\tPG_RETURN_IPR_P(ipr_pack(0,NULL));\n}\n\nPG_FUNCTION_INFO_V1(iprange_inter);\nDatum\niprange_inter(PG_FUNCTION_ARGS)\n{\n\tIPR_P ipp1 = PG_GETARG_IPR_P(0);\n\tIPR_P ipp2 = PG_GETARG_IPR_P(1);\n\tIPR ipr1;\n\tIPR ipr2;\n\tint af1 = ipr_unpack(ipp1, &ipr1);\n\tint af2 = ipr_unpack(ipp2, &ipr2);\n\tIPR res;\n\n\tif (af1 == af2)\n\t{\n\t\tswitch (af1)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tPG_RETURN_IPR_P(ipr_pack(0,NULL));\n\n\t\t\tcase PGSQL_AF_INET:\n\t\t\t\tif (ip4r_inter_internal(&ipr1.ip4r,&ipr2.ip4r,&res.ip4r))\n\t\t\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET,&res));\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET6:\n\t\t\t\tif (ip6r_inter_internal(&ipr1.ip6r,&ipr2.ip6r,&res.ip6r))\n\t\t\t\t\tPG_RETURN_IPR_P(ipr_pack(PGSQL_AF_INET6,&res));\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tiprange_internal_error();\n\t\t}\n\t}\n\telse if (af1 == 0)\n\t\tPG_RETURN_IPR_P(ipr_pack(af2,&ipr2));\n\telse if (af2 == 0)\n\t\tPG_RETURN_IPR_P(ipr_pack(af1,&ipr1));\n\n\tPG_RETURN_NULL();\n}\n\nPG_FUNCTION_INFO_V1(iprange_size);\nDatum\niprange_size(PG_FUNCTION_ARGS)\n{\n\tIPR_P ipp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tint af = ipr_unpack(ipp, &ipr);\n\n\tswitch (af)\n\t{\n\t\tcase 0:\n\t\t\tPG_RETURN_FLOAT8(ldexp(1.0, 129));\n\n\t\tcase PGSQL_AF_INET:\n\t\t\tPG_RETURN_FLOAT8(ip4r_metric(&ipr.ip4r));\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tPG_RETURN_FLOAT8(ip6r_metric(&ipr.ip6r));\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n}\n\nPG_FUNCTION_INFO_V1(iprange_size_exact);\nDatum\niprange_size_exact(PG_FUNCTION_ARGS)\n{\n\tIPR_P ipp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tint af = ipr_unpack(ipp, &ipr);\n\tDatum u,l,d,s;\n\n\tswitch (af)\n\t{\n\t\tcase 0:\n\t\t\ts = DirectFunctionCall3(numeric_in, CStringGetDatum(\"680564733841876926926749214863536422912\"), 0, Int32GetDatum(-1));\n\t\t\tPG_RETURN_DATUM(s);\n\n\t\tcase PGSQL_AF_INET:\n\t\t\tl = DirectFunctionCall1(ip4_cast_to_numeric, IP4GetDatum(ipr.ip4r.lower));\n\t\t\tu = DirectFunctionCall1(ip4_cast_to_numeric, IP4GetDatum(ipr.ip4r.upper));\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET6:\n\t\t\tl = DirectFunctionCall1(ip6_cast_to_numeric, IP6PGetDatum(&ipr.ip6r.lower));\n\t\t\tu = DirectFunctionCall1(ip6_cast_to_numeric, IP6PGetDatum(&ipr.ip6r.upper));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n\n\td = DirectFunctionCall2(numeric_sub, u, l);\n\ts = DirectFunctionCall1(numeric_inc, d);\n\tPG_RETURN_DATUM(s);\n}\n\nPG_FUNCTION_INFO_V1(iprange_prefixlen);\nDatum\niprange_prefixlen(PG_FUNCTION_ARGS)\n{\n\tIPR_P iprp = PG_GETARG_IPR_P(0);\n\tIPR ipr;\n\tint af = ipr_unpack(iprp,&ipr);\n\tunsigned len = ~0;\n\tunsigned maxbits = 0;\n\n\tif (af == PGSQL_AF_INET)\n\t\tmaxbits = 32, len = masklen(ipr.ip4r.lower, ipr.ip4r.upper);\n\telse if (af == PGSQL_AF_INET6)\n\t\tmaxbits = 128, len = masklen6(&ipr.ip6r.lower, &ipr.ip6r.upper);\n\n\tif (len <= maxbits)\n\t\tPG_RETURN_INT32((int32) len);\n\n\tPG_RETURN_NULL();\n}\n\n\n/*****************************************************************************\n *\t\t\t\t\t\t\t\t\t\t\t\t   Btree functions\n *****************************************************************************/\n\nPG_FUNCTION_INFO_V1(iprange_cmp);\nDatum\niprange_cmp(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_INT32( iprange_cmp_internal(PG_GETARG_DATUM(0), PG_GETARG_DATUM(1)) );\n}\n\n\n/*****************************************************************************\n *\t\t\t\t\t\t\t\t\t\t\t\t   GiST functions\n *****************************************************************************/\n\n/*\n** GiST support methods\n*/\n\nDatum gipr_consistent(PG_FUNCTION_ARGS);\nDatum gipr_compress(PG_FUNCTION_ARGS);\nDatum gipr_decompress(PG_FUNCTION_ARGS);\nDatum gipr_penalty(PG_FUNCTION_ARGS);\nDatum gipr_picksplit(PG_FUNCTION_ARGS);\nDatum gipr_union(PG_FUNCTION_ARGS);\nDatum gipr_same(PG_FUNCTION_ARGS);\nDatum gipr_fetch(PG_FUNCTION_ARGS);\n\ntypedef struct {\n\tint32 vl_len_;\n\tint32 af;\n\tIPR ipr;\n} IPR_KEY;\n\nstatic bool gipr_leaf_consistent(IPR_KEY *key, IPR_P query, StrategyNumber strategy);\nstatic bool gipr_internal_consistent(IPR_KEY *key, IPR_P query, StrategyNumber strategy);\n\n\n/*\n * compress is passed a GISTENTRY* containing a leaf or nonleaf key, and is\n * expected to return either the same entry or a new one containing the data to\n * be actually written to the index tuple. The key is a leaf key if and only if\n * it came from outside GiST (via insert or bulkinsert).\n */\n\nPG_FUNCTION_INFO_V1(gipr_compress);\nDatum\ngipr_compress(PG_FUNCTION_ARGS)\n{\n\tGISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);\n\tGISTENTRY *retval = entry;\n\n\tif (!entry->leafkey)\n\t{\n\t\tIPR_KEY *key = (IPR_KEY *) DatumGetPointer(entry->key);\n\n\t\tretval = palloc(sizeof(GISTENTRY));\n\n\t\tAssert(!VARATT_IS_EXTENDED(key) && VARSIZE(key) == sizeof(IPR_KEY));\n\t\tAssert(key->af == 0 || key->af == PGSQL_AF_INET || key->af == PGSQL_AF_INET6);\n\n\t\tgistentryinit(*retval, PointerGetDatum(ipr_pack(key->af, &key->ipr)),\n\t\t\t\t\t  entry->rel, entry->page,\n\t\t\t\t\t  entry->offset, false);\n\t}\n\n\tPG_RETURN_POINTER(retval);\n}\n\nPG_FUNCTION_INFO_V1(gipr_decompress);\nDatum\ngipr_decompress(PG_FUNCTION_ARGS)\n{\n\tGISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);\n\tGISTENTRY *retval = palloc(sizeof(GISTENTRY));\n\tIPR_KEY *key = palloc(sizeof(IPR_KEY));\n\n\tSET_VARSIZE(key, sizeof(IPR_KEY));\n\tkey->af = ipr_unpack((IPR_P) DatumGetPointer(entry->key), &key->ipr);\n\n\tgistentryinit(*retval, PointerGetDatum(key),\n\t\t\t\t  entry->rel, entry->page,\n\t\t\t\t  entry->offset, false);\n\n\tPG_RETURN_POINTER(retval);\n}\n\nPG_FUNCTION_INFO_V1(gipr_fetch);\nDatum\ngipr_fetch(PG_FUNCTION_ARGS)\n{\n\tPG_RETURN_POINTER(PG_GETARG_POINTER(0));\n}\n\n\n/*\n** The GiST Consistent method for IP ranges\n** Should return false if for all data items x below entry,\n** the predicate x op query == false, where op is the oper\n** corresponding to strategy in the pg_amop table.\n*/\n\nPG_FUNCTION_INFO_V1(gipr_consistent);\nDatum\ngipr_consistent(PG_FUNCTION_ARGS)\n{\n\tGISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);\n\tIPR_P query = (IPR_P) PG_GETARG_POINTER(1);\n\tStrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);\n\tbool *recheck = (bool *) PG_GETARG_POINTER(4);\n\tIPR_KEY *key = (IPR_KEY *) DatumGetPointer(entry->key);\n\tbool retval;\n\n\t/* recheck is never needed with this type */\n\tif (recheck)\n\t\t*recheck = false;\n\n\t/*\n\t * * if entry is not leaf, use gipr_internal_consistent, * else use\n\t * gipr_leaf_consistent\n\t */\n\n\tif (GIST_LEAF(entry))\n\t\tretval = gipr_leaf_consistent(key, query, strategy);\n\telse\n\t\tretval = gipr_internal_consistent(key, query, strategy);\n\n\tPG_RETURN_BOOL(retval);\n}\n\n/*\n** The GiST Union method for IP ranges\n** returns the minimal bounding IPR that encloses all the entries in entryvec\n*/\n\nstatic void\ngipr_union_internal_1(IPR_KEY *out, IPR_KEY *tmp)\n{\n\tif (out->af != tmp->af)\n\t\tout->af = 0;\n\n\tswitch (out->af)\n\t{\n\t\tcase 0:\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET:\n\t\t{\n\t\t\tif (ip4_lessthan(tmp->ipr.ip4r.lower,out->ipr.ip4r.lower))\n\t\t\t\tout->ipr.ip4r.lower = tmp->ipr.ip4r.lower;\n\t\t\tif (ip4_lessthan(out->ipr.ip4r.upper,tmp->ipr.ip4r.upper))\n\t\t\t\tout->ipr.ip4r.upper = tmp->ipr.ip4r.upper;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase PGSQL_AF_INET6:\n\t\t{\n\t\t\tif (ip6_lessthan(&tmp->ipr.ip6r.lower,&out->ipr.ip6r.lower))\n\t\t\t\tout->ipr.ip6r.lower = tmp->ipr.ip6r.lower;\n\t\t\tif (ip6_lessthan(&out->ipr.ip6r.upper,&tmp->ipr.ip6r.upper))\n\t\t\t\tout->ipr.ip6r.upper = tmp->ipr.ip6r.upper;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n}\n\nstatic void\ngipr_union_internal(IPR_KEY *out, bool *allequalp, bool *afequalp,\n\t\t\t\t\t\tGISTENTRY *ent, int numranges)\n{\n\tint i;\n\tbool allequal = true;\n\tbool afequal = true;\n\tIPR_KEY *tmp;\n\n\ttmp = (IPR_KEY *) DatumGetPointer(ent[0].key);\n\t*out = *tmp;\n\n\tfor (i = 1; out->af != 0 && i < numranges; ++i)\n\t{\n\t\ttmp = (IPR_KEY *) DatumGetPointer(ent[i].key);\n\t\tif (tmp->af != out->af)\n\t\t{\n\t\t\tout->af = 0;\n\t\t\tafequal = allequal = false;\n\t\t}\n\t}\n\n\tswitch (out->af)\n\t{\n\t\tcase 0:\n\t\t\tbreak;\n\n\t\tcase PGSQL_AF_INET:\n\t\t{\n\t\t\ttmp = (IPR_KEY *) DatumGetPointer(ent[0].key);\n\t\t\tout->ipr.ip4r = tmp->ipr.ip4r;\n\n\t\t\tfor (i = 1; i < numranges; i++)\n\t\t\t{\n\t\t\t\ttmp = (IPR_KEY *) DatumGetPointer(ent[i].key);\n\n\t\t\t\tif (allequal && !ip4r_equal(&tmp->ipr.ip4r, &out->ipr.ip4r))\n\t\t\t\t\tallequal = false;\n\n\t\t\t\tif (ip4_lessthan(tmp->ipr.ip4r.lower,out->ipr.ip4r.lower))\n\t\t\t\t\tout->ipr.ip4r.lower = tmp->ipr.ip4r.lower;\n\t\t\t\tif (ip4_lessthan(out->ipr.ip4r.upper,tmp->ipr.ip4r.upper))\n\t\t\t\t\tout->ipr.ip4r.upper = tmp->ipr.ip4r.upper;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase PGSQL_AF_INET6:\n\t\t{\n\t\t\ttmp = (IPR_KEY *) DatumGetPointer(ent[0].key);\n\t\t\tout->ipr.ip4r = tmp->ipr.ip4r;\n\n\t\t\tfor (i = 1; i < numranges; i++)\n\t\t\t{\n\t\t\t\ttmp = (IPR_KEY *) DatumGetPointer(ent[i].key);\n\n\t\t\t\tif (allequal && !ip6r_equal(&tmp->ipr.ip6r, &out->ipr.ip6r))\n\t\t\t\t\tallequal = false;\n\n\t\t\t\tif (ip6_lessthan(&tmp->ipr.ip6r.lower,&out->ipr.ip6r.lower))\n\t\t\t\t\tout->ipr.ip6r.lower = tmp->ipr.ip6r.lower;\n\t\t\t\tif (ip6_lessthan(&out->ipr.ip6r.upper,&tmp->ipr.ip6r.upper))\n\t\t\t\t\tout->ipr.ip6r.upper = tmp->ipr.ip6r.upper;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tiprange_internal_error();\n\t}\n\n\tif (afequalp)\n\t\t*afequalp = afequal;\n\tif (allequalp)\n\t\t*allequalp = allequal;\n}\n\n\nPG_FUNCTION_INFO_V1(gipr_union);\nDatum\ngipr_union(PG_FUNCTION_ARGS)\n{\n\tGistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);\n\tint *sizep = (int *) PG_GETARG_POINTER(1);\n\tGISTENTRY *ent = GISTENTRYVEC(entryvec);\n\tint numranges;\n\tIPR_KEY *out = palloc(sizeof(IPR_KEY));\n\n#ifdef GIST_DEBUG\n\tfprintf(stderr, \"union\\n\");\n#endif\n\n\tnumranges = GISTENTRYCOUNT(entryvec);\n\n\tgipr_union_internal(out, NULL, NULL, ent, numranges);\n\n\t*sizep = sizeof(IPR_KEY);\n\n\tPG_RETURN_POINTER(out);\n}\n\n\n/*\n** The GiST Penalty method for IP ranges\n** As in the R-tree paper, we use change in area as our penalty metric\n*/\nPG_FUNCTION_INFO_V1(gipr_penalty);\nDatum\ngipr_penalty(PG_FUNCTION_ARGS)\n{\n\tGISTENTRY *origentry = (GISTENTRY *) PG_GETARG_POINTER(0);\n\tGISTENTRY *newentry = (GISTENTRY *) PG_GETARG_POINTER(1);\n\tfloat *result = (float *) PG_GETARG_POINTER(2);\n\tIPR_KEY *key = (IPR_KEY *) DatumGetPointer(origentry->key);\n\tIPR_KEY *newkey = (IPR_KEY *) DatumGetPointer(newentry->key);\n\tIP4R ud4;\n\tIP6R ud6;\n\tdouble tmp = 0.0;\n\n\tif (key->af != newkey->af)\n\t{\n\t\tif (key->af != 0 && newkey->af != 0)\n\t\t\ttmp = 1e10;\n\t}\n\telse\n\t{\n\t\tswitch (key->af)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\n\t\t\t\t/*\n\t\t\t\t * rather than subtract the sizes, which might lose\n\t\t\t\t * due to rounding errors in v6, we calculate the\n\t\t\t\t * actual number of addresses added to the range.\n\t\t\t\t */\n\n\t\t\tcase PGSQL_AF_INET:\n\t\t\t\tif (newkey->ipr.ip4r.lower < key->ipr.ip4r.lower)\n\t\t\t\t{\n\t\t\t\t\tud4.lower = newkey->ipr.ip4r.lower;\n\t\t\t\t\tud4.upper = key->ipr.ip4r.lower - 1;\n\t\t\t\t\ttmp = ip4r_metric(&ud4);\n\t\t\t\t}\n\t\t\t\tif (key->ipr.ip4r.upper < newkey->ipr.ip4r.upper)\n\t\t\t\t{\n\t\t\t\t\tud4.lower = key->ipr.ip4r.upper;\n\t\t\t\t\tud4.upper = newkey->ipr.ip4r.upper - 1;\n\t\t\t\t\ttmp += ip4r_metric(&ud4);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET6:\n\t\t\t\tif (ip6_lessthan(&newkey->ipr.ip6r.lower,&key->ipr.ip6r.lower))\n\t\t\t\t{\n\t\t\t\t\tud6.lower = newkey->ipr.ip6r.lower;\n\t\t\t\t\tud6.upper = key->ipr.ip6r.lower;\n\t\t\t\t\tip6_sub_int(&ud6.upper,1,&ud6.upper);\n\t\t\t\t\ttmp = ip6r_metric(&ud6);\n\t\t\t\t}\n\t\t\t\tif (ip6_lessthan(&key->ipr.ip6r.upper,&newkey->ipr.ip6r.upper))\n\t\t\t\t{\n\t\t\t\t\tud6.lower = key->ipr.ip6r.upper;\n\t\t\t\t\tud6.upper = newkey->ipr.ip6r.upper;\n\t\t\t\t\tip6_sub_int(&ud6.upper,1,&ud6.upper);\n\t\t\t\t\ttmp += ip6r_metric(&ud6);\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * we want to scale the result a bit. For one thing, the gist code implicitly\n\t\t\t\t * assigns a penalty of 1e10 for a union of null and non-null values, and we\n\t\t\t\t * want to keep our values less than that. For another, the penalty is sometimes\n\t\t\t\t * summed across columns of a multi-column index, and we don't want our huge\n\t\t\t\t * metrics (>2^80) to completely swamp anything else.\n\t\t\t\t *\n\t\t\t\t * So, we scale as the fourth power of the log2 of the computed penalty, which\n\t\t\t\t * gives us a range 0 - 268435456.\n\t\t\t\t */\n\n\t\t\t\ttmp = pow(log(tmp+1) / log(2), 4);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tiprange_internal_error();\n\t\t}\n\t}\n\n\t*result = (float) tmp;\n\n#ifdef GIST_DEBUG\n\tfprintf(stderr, \"penalty\\n\");\n\tfprintf(stderr, \"\\t%g\\n\", *result);\n#endif\n\n\tPG_RETURN_POINTER(result);\n}\n\n\n/* Helper functions for picksplit. We might need to sort a list of\n * ranges by size; these are for that. We don't ever need to sort\n * mixed address families though.\n */\n\nstruct gipr_sort\n{\n\tIPR_KEY *key;\n\tOffsetNumber pos;\n};\n\nstatic int\ngipr_sort_compare_v4(const void *av, const void *bv)\n{\n\tIPR_KEY *a = ((struct gipr_sort *)av)->key;\n\tIPR_KEY *b = ((struct gipr_sort *)bv)->key;\n\tdouble sa = ip4r_metric(&a->ipr.ip4r);\n\tdouble sb = ip4r_metric(&b->ipr.ip4r);\n\treturn (sa > sb) ? 1 : ((sa == sb) ? 0 : -1);\n}\n\nstatic int\ngipr_sort_compare_v6(const void *av, const void *bv)\n{\n\tIPR_KEY *a = ((struct gipr_sort *)av)->key;\n\tIPR_KEY *b = ((struct gipr_sort *)bv)->key;\n\tdouble sa = ip6r_metric(&a->ipr.ip6r);\n\tdouble sb = ip6r_metric(&b->ipr.ip6r);\n\treturn (sa > sb) ? 1 : ((sa == sb) ? 0 : -1);\n}\n\n/*\n** The GiST PickSplit method for IP ranges\n** This is a linear-time algorithm based on a left/right split,\n** based on the box functions in rtree_gist simplified to one\n** dimension\n*/\nPG_FUNCTION_INFO_V1(gipr_picksplit);\nDatum\ngipr_picksplit(PG_FUNCTION_ARGS)\n{\n\tGistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);\n\tGIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);\n\tGISTENTRY *ent = GISTENTRYVEC(entryvec);\n\tOffsetNumber i;\n\tint nbytes;\n\tOffsetNumber maxoff;\n\tOffsetNumber *listL;\n\tOffsetNumber *listR;\n\tbool allisequal = true;\n\tbool allafequal = true;\n\tIPR_KEY pageunion;\n\tIPR_KEY *cur;\n\tIPR_KEY *unionL;\n\tIPR_KEY *unionR;\n\tint posL = 0;\n\tint posR = 0;\n\n\tposL = posR = 0;\n\tmaxoff = GISTENTRYCOUNT(entryvec) - 1;\n\n\tgipr_union_internal(&pageunion, &allisequal, &allafequal,\n\t\t\t\t\t\t&ent[FirstOffsetNumber], maxoff);\n\n\tnbytes = (maxoff + 2) * sizeof(OffsetNumber);\n\tlistL = (OffsetNumber *) palloc(nbytes);\n\tlistR = (OffsetNumber *) palloc(nbytes);\n\tunionL = palloc(sizeof(IPR_KEY));\n\tunionR = palloc(sizeof(IPR_KEY));\n\tv->spl_ldatum = PointerGetDatum(unionL);\n\tv->spl_rdatum = PointerGetDatum(unionR);\n\tv->spl_left = listL;\n\tv->spl_right = listR;\n\n\tif (allisequal)\n\t{\n\t\tOffsetNumber split_at = FirstOffsetNumber + (maxoff - FirstOffsetNumber + 1)/2;\n\t\tv->spl_nleft = v->spl_nright = 0;\n\t\t*unionL = pageunion;\n\t\t*unionR = pageunion;\n\n\t\tfor (i = FirstOffsetNumber; i < split_at; i = OffsetNumberNext(i))\n\t\t\tv->spl_left[v->spl_nleft++] = i;\n\t\tfor (; i <= maxoff; i = OffsetNumberNext(i))\n\t\t\tv->spl_right[v->spl_nright++] = i;\n\n\t\tPG_RETURN_POINTER(v);\n\t}\n\n\t/*\n\t * if we have a mix of address families present, then we split by AF regardless\n\t * of all other factors, since the penalty for mixing them is so high. If there's\n\t * at least one universal range, we split those into the right page and leave\n\t * everything else in the left page; otherwise, we split ivp6 into the right page.\n\t * We accept a bad split ratio here in the interests of keeping AFs separate.\n\t */\n\n#define ADDLIST( list_, u_, pos_, num_ ) do { \\\n\t\tif ( pos_ ) { \\\n\t\t\tgipr_union_internal_1(u_, cur); \\\n\t\t} else { \\\n\t\t\t\t*(u_) = *(cur); \\\n\t\t} \\\n\t\t(list_)[(pos_)++] = (num_); \\\n} while(0)\n\n\tif (!allafequal)\n\t{\n\t\tint right_af = PGSQL_AF_INET6;\n\n\t\tfor (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))\n\t\t\tif ( ((IPR_KEY *)DatumGetPointer(ent[i].key))->af == 0)\n\t\t\t\tbreak;\n\n\t\tif (i <= maxoff)\n\t\t\tright_af = 0;\n\n\t\tfor (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))\n\t\t{\n\t\t\tcur = (IPR_KEY *)DatumGetPointer(ent[i].key);\n\t\t\tif (cur->af != right_af)\n\t\t\t\tADDLIST(listL, unionL, posL, i);\n\t\t\telse\n\t\t\t\tADDLIST(listR, unionR, posR, i);\n\t\t}\n\t}\n\telse if (pageunion.af == PGSQL_AF_INET)\n\t{\n\t\tfor (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))\n\t\t{\n\t\t\tcur = (IPR_KEY *) DatumGetPointer(ent[i].key);\n\t\t\tif ((cur->ipr.ip4r.upper - pageunion.ipr.ip4r.lower)\n\t\t\t\t< (pageunion.ipr.ip4r.upper - cur->ipr.ip4r.lower))\n\t\t\t\tADDLIST(listL, unionL, posL, i);\n\t\t\telse\n\t\t\t\tADDLIST(listR, unionR, posR, i);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))\n\t\t{\n\t\t\tIP6 diff1;\n\t\t\tIP6 diff2;\n\n\t\t\tcur = (IPR_KEY *) DatumGetPointer(ent[i].key);\n\t\t\tip6_sub(&cur->ipr.ip6r.upper, &pageunion.ipr.ip6r.lower, &diff1);\n\t\t\tip6_sub(&pageunion.ipr.ip6r.upper, &cur->ipr.ip6r.lower, &diff2);\n\t\t\tif (ip6_lessthan(&diff1,&diff2))\n\t\t\t\tADDLIST(listL, unionL, posL, i);\n\t\t\telse\n\t\t\t\tADDLIST(listR, unionR, posR, i);\n\t\t}\n\t}\n\n\t/* bad disposition, sort by ascending size and resplit */\n\tif (posR == 0 || posL == 0)\n\t{\n\t\tstruct gipr_sort *arr = (struct gipr_sort *)\n\t\t\tpalloc(sizeof(struct gipr_sort) * (maxoff + FirstOffsetNumber));\n\n\t\tAssert(allafequal);\n\n\t\tfor (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))\n\t\t{\n\t\t\tarr[i].key = (IPR_KEY *) DatumGetPointer(ent[i].key);\n\t\t\tarr[i].pos = i;\n\t\t}\n\n\t\tqsort(arr + FirstOffsetNumber,\n\t\t\t  maxoff - FirstOffsetNumber + 1,\n\t\t\t  sizeof(struct gipr_sort),\n\t\t\t  (pageunion.af == PGSQL_AF_INET6) ? gipr_sort_compare_v6 : gipr_sort_compare_v4);\n\n\t\tposL = posR = 0;\n\n\t\tfor (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))\n\t\t{\n\t\t\tIP6 diff1;\n\t\t\tIP6 diff2;\n\n\t\t\tcur = arr[i].key;\n\t\t\tif (pageunion.af == PGSQL_AF_INET)\n\t\t\t{\n\t\t\t\tdiff1.bits[0] = (cur->ipr.ip4r.upper - pageunion.ipr.ip4r.lower);\n\t\t\t\tdiff2.bits[0] = (pageunion.ipr.ip4r.upper - cur->ipr.ip4r.lower);\n\t\t\t\tdiff1.bits[1] = diff2.bits[1] = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tip6_sub(&cur->ipr.ip6r.upper, &pageunion.ipr.ip6r.lower, &diff1);\n\t\t\t\tip6_sub(&pageunion.ipr.ip6r.upper, &cur->ipr.ip6r.lower, &diff2);\n\t\t\t}\n\t\t\tswitch (ip6_compare(&diff1,&diff2))\n\t\t\t{\n\t\t\t\tcase -1:\n\t\t\t\t\tADDLIST(listL, unionL, posL, arr[i].pos);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\n\t\t\t\t\tif (posL > posR)\n\t\t\t\t\t\tADDLIST(listR, unionR, posR, arr[i].pos);\n\t\t\t\t\telse\n\t\t\t\t\t\tADDLIST(listL, unionL, posL, arr[i].pos);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\tADDLIST(listR, unionR, posR, arr[i].pos);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tpfree(arr);\n\t}\n\n\tv->spl_nleft = posL;\n\tv->spl_nright = posR;\n\n\tPG_RETURN_POINTER(v);\n}\n\n#undef ADDLIST\n\n/*\n** Equality methods\n*/\nPG_FUNCTION_INFO_V1(gipr_same);\nDatum\ngipr_same(PG_FUNCTION_ARGS)\n{\n\tIPR_KEY *v1 = (IPR_KEY *) PG_GETARG_POINTER(0);\n\tIPR_KEY *v2 = (IPR_KEY *) PG_GETARG_POINTER(1);\n\tbool *result = (bool *) PG_GETARG_POINTER(2);\n\n\tif (!v1 || !v2)\n\t\t*result = (v1 == NULL && v2 == NULL);\n\tif (v1->af != v2->af)\n\t\t*result = false;\n\telse\n\t{\n\t\tswitch (v1->af)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\t*result = true;\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET:\n\t\t\t\t*result = ip4r_equal(&v1->ipr.ip4r,&v2->ipr.ip4r);\n\t\t\t\tbreak;\n\n\t\t\tcase PGSQL_AF_INET6:\n\t\t\t\t*result = ip6r_equal(&v1->ipr.ip6r,&v2->ipr.ip6r);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n#ifdef GIST_DEBUG\n\tfprintf(stderr, \"same: %s\\n\", (*result ? \"true\" : \"false\"));\n#endif\n\n\tPG_RETURN_POINTER(result);\n}\n\n\n/*\n * Strategy numbers:\n *\t\tOPERATOR\t\t1\t\t>>= ,\n *\t\tOPERATOR\t\t2\t\t<<= ,\n *\t\tOPERATOR\t\t3\t\t>> ,\n *\t\tOPERATOR\t\t4\t\t<< ,\n *\t\tOPERATOR\t\t5\t\t&& ,\n *\t\tOPERATOR\t\t6\t\t= ,\n */\n\n/*\n** SUPPORT ROUTINES\n*/\n\nstatic bool\ngipr_leaf_consistent(IPR_KEY *key,\n\t\t\t\t\t IPR_P queryp,\n\t\t\t\t\t StrategyNumber strategy)\n{\n\tIPR query;\n\tint af = ipr_unpack(queryp, &query);\n\n#ifdef GIST_QUERY_DEBUG\n\tfprintf(stderr, \"leaf_consistent, %d\\n\", strategy);\n#endif\n\n\tif (key->af == 0)\n\t{\n\t\tswitch (strategy)\n\t\t{\n\t\t\tcase 1:\t  /* left contains right nonstrict */\n\t\t\t\treturn true;\n\t\t\tcase 2:\t  /* left contained in right nonstrict */\n\t\t\t\treturn (af == 0);\n\t\t\tcase 3:\t  /* left contains right strict */\n\t\t\t\treturn !(af == 0);\n\t\t\tcase 4:\t  /* left contained in right strict */\n\t\t\t\treturn false;\n\t\t\tcase 5:\t  /* left overlaps right */\n\t\t\t\treturn true;\n\t\t\tcase 6:\t  /* left equal right */\n\t\t\t\treturn (af == 0);\n\t\t}\n\t}\n\telse if (af == 0)\n\t{\n\t\tswitch (strategy)\n\t\t{\n\t\t\tcase 1:\t  /* left contains right nonstrict */\n\t\t\t\treturn false;\n\t\t\tcase 2:\t  /* left contained in right nonstrict */\n\t\t\t\treturn true;\n\t\t\tcase 3:\t  /* left contains right strict */\n\t\t\t\treturn false;\n\t\t\tcase 4:\t  /* left contained in right strict */\n\t\t\t\treturn true;\n\t\t\tcase 5:\t  /* left overlaps right */\n\t\t\t\treturn true;\n\t\t\tcase 6:\t  /* left equal right */\n\t\t\t\treturn false;\n\t\t}\n\t}\n\telse if (af != key->af)\n\t\treturn false;\n\telse if (af == PGSQL_AF_INET)\n\t{\n\t\tswitch (strategy)\n\t\t{\n\t\t\tcase 1:\t  /* left contains right nonstrict */\n\t\t\t\treturn ip4r_contains_internal(&key->ipr.ip4r, &query.ip4r, true);\n\t\t\tcase 2:\t  /* left contained in right nonstrict */\n\t\t\t\treturn ip4r_contains_internal(&query.ip4r, &key->ipr.ip4r, true);\n\t\t\tcase 3:\t  /* left contains right strict */\n\t\t\t\treturn ip4r_contains_internal(&key->ipr.ip4r, &query.ip4r, false);\n\t\t\tcase 4:\t  /* left contained in right strict */\n\t\t\t\treturn ip4r_contains_internal(&query.ip4r, &key->ipr.ip4r, false);\n\t\t\tcase 5:\t  /* left overlaps right */\n\t\t\t\treturn ip4r_overlaps_internal(&key->ipr.ip4r, &query.ip4r);\n\t\t\tcase 6:\t  /* left equal right */\n\t\t\t\treturn ip4r_equal(&key->ipr.ip4r, &query.ip4r);\n\t\t}\n\t}\n\telse if (af == PGSQL_AF_INET6)\n\t{\n\t\tswitch (strategy)\n\t\t{\n\t\t\tcase 1:\t  /* left contains right nonstrict */\n\t\t\t\treturn ip6r_contains_internal(&key->ipr.ip6r, &query.ip6r, true);\n\t\t\tcase 2:\t  /* left contained in right nonstrict */\n\t\t\t\treturn ip6r_contains_internal(&query.ip6r, &key->ipr.ip6r, true);\n\t\t\tcase 3:\t  /* left contains right strict */\n\t\t\t\treturn ip6r_contains_internal(&key->ipr.ip6r, &query.ip6r, false);\n\t\t\tcase 4:\t  /* left contained in right strict */\n\t\t\t\treturn ip6r_contains_internal(&query.ip6r, &key->ipr.ip6r, false);\n\t\t\tcase 5:\t  /* left overlaps right */\n\t\t\t\treturn ip6r_overlaps_internal(&key->ipr.ip6r, &query.ip6r);\n\t\t\tcase 6:\t  /* left equal right */\n\t\t\t\treturn ip6r_equal(&key->ipr.ip6r, &query.ip6r);\n\t\t}\n\t}\n\treturn false;\n}\n\n/* logic notes:\n * If the union value we're looking at overlaps with our query value\n * at all, then any of the values underneath it might overlap with us\n * or be contained by us, so all the \"contained by\" and \"overlaps\"\n * cases degenerate to \"overlap\".\n * If the union value is equal to the query value, then none of the\n * values under it can strictly contain the query value, so for\n * \"contained\" queries the strictness is preserved.\n * If we're looking for an \"equal\" value, then we have to enter any\n * subtree whose union contains (not strictly) our query value.\n */\n\nstatic bool\ngipr_internal_consistent(IPR_KEY *key,\n\t\t\t\t\t\t IPR_P queryp,\n\t\t\t\t\t\t StrategyNumber strategy)\n{\n\tIPR query;\n\tint af = ipr_unpack(queryp, &query);\n\n#ifdef GIST_QUERY_DEBUG\n\tfprintf(stderr, \"leaf_consistent, %d\\n\", strategy);\n#endif\n\n\tif (af == 0 && strategy == 4)\n\t\treturn false;\n\telse if (key->af == 0 || af == 0)\n\t\treturn true;\n\telse if (af != key->af)\n\t\treturn false;\n\telse if (af == PGSQL_AF_INET)\n\t{\n\t\tswitch (strategy)\n\t\t{\n\t\t\tcase 2:\t  /* left contained in right nonstrict */\n\t\t\tcase 4:\t  /* left contained in right strict */\n\t\t\tcase 5:\t  /* left overlaps right */\n\t\t\t\treturn ip4r_overlaps_internal(&key->ipr.ip4r, &query.ip4r);\n\t\t\tcase 3:\t  /* left contains right strict */\n\t\t\t\treturn ip4r_contains_internal(&key->ipr.ip4r, &query.ip4r, false);\n\t\t\tcase 1:\t  /* left contains right nonstrict */\n\t\t\tcase 6:\t  /* left equal right */\n\t\t\t\treturn ip4r_contains_internal(&key->ipr.ip4r, &query.ip4r, true);\n\t\t}\n\t}\n\telse if (af == PGSQL_AF_INET6)\n\t{\n\t\tswitch (strategy)\n\t\t{\n\t\t\tcase 2:\t  /* left contained in right nonstrict */\n\t\t\tcase 4:\t  /* left contained in right strict */\n\t\t\tcase 5:\t  /* left overlaps right */\n\t\t\t\treturn ip6r_overlaps_internal(&key->ipr.ip6r, &query.ip6r);\n\t\t\tcase 3:\t  /* left contains right strict */\n\t\t\t\treturn ip6r_contains_internal(&key->ipr.ip6r, &query.ip6r, false);\n\t\t\tcase 1:\t  /* left contains right nonstrict */\n\t\t\tcase 6:\t  /* left equal right */\n\t\t\t\treturn ip6r_contains_internal(&key->ipr.ip6r, &query.ip6r, true);\n\t\t}\n\t}\n\treturn false;\n}\n\n/* end */\n"
  },
  {
    "path": "src/raw_io.c",
    "content": "/* raw_io.c */\n\n#include \"postgres.h\"\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"ipr_internal.h\"\n\nbool ip4_raw_input(const char *osrc, uint32 *dst)\n{\n\tconst unsigned char *src = (const unsigned char *)osrc;\n\tint digits = 0;\n\tint octets = 0;\n\tint ch;\n\tuint32 octet = 0;\n\tuint32 tmp = 0;\n\n\tfor (;;)\n\t{\n\t\tswitch ((ch = *src++))\n\t\t{\n\t\t\tcase '0': case '1': case '2': case '3': case '4':\n\t\t\tcase '5': case '6': case '7': case '8': case '9':\n\t\t\t\tif (digits++ && octet == 0)\n\t\t\t\t\treturn false;\t/* must have been a leading 0, reject */\n\t\t\t\toctet = (octet * 10) + (ch - '0');\n\t\t\t\tif (octet > 255)\n\t\t\t\t\treturn false;\n\t\t\t\tbreak;\n\n\t\t\tcase '.':\n\t\t\t\tif (!digits || ++octets > 3)\n\t\t\t\t\treturn false;\n\t\t\t\ttmp = (tmp << 8) | octet;\n\t\t\t\tdigits = 0;\n\t\t\t\toctet = 0;\n\t\t\t\tbreak;\n\n\t\t\tcase 0:\n\t\t\t\tif (!digits || octets != 3)\n\t\t\t\t\treturn false;\n\t\t\t\ttmp = (tmp << 8) | octet;\n\t\t\t\t*dst = tmp;\n\t\t\t\treturn true;\n\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n}\n\nbool ip6_raw_input(const char *osrc, uint64 *dst)\n{\n\tconst unsigned char *src = (const unsigned char *)osrc;\n\tconst unsigned char *backtrack = src;\n\tint ch;\n\tint digits = 0;\n\tint words = 0;\n\tint gap = -1;\n\tuint16 word = 0;\n\tuint16 tmp[8];\n\n\t/* leading :: needs a special case */\n\tif (*src == ':')\n\t\tif (*++src != ':')\n\t\t\treturn false;\n\n\tfor (;;)\n\t{\n\t\tswitch ((ch = *src++))\n\t\t{\n\t\t\tcase '0': case '1': case '2': case '3': case '4':\n\t\t\tcase '5': case '6': case '7': case '8': case '9':\n\t\t\t\tword = (word << 4) | (ch - '0');\n\t\t\t\tbreak;\n\n\t\t\tcase 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n\t\t\t\tword = (word << 4) | ((ch - 'a') + 10);\n\t\t\t\tbreak;\n\n\t\t\tcase 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n\t\t\t\tword = (word << 4) | ((ch - 'A') + 10);\n\t\t\t\tbreak;\n\n\t\t\tcase ':':\n\t\t\t\tif (digits == 0)\n\t\t\t\t{\n\t\t\t\t\tif (gap >= 0)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tgap = words;\n\t\t\t\t}\n\t\t\t\telse if (!*src)\n\t\t\t\t\treturn false;\t/* trailing : not valid except as :: */\n\n\t\t\t\ttmp[words++] = word;\n\t\t\t\tif (words > 7 && *src)\n\t\t\t\t\treturn false;\n\t\t\t\tbacktrack = src;\n\t\t\t\tword = 0;\n\t\t\t\tdigits = 0;\n\t\t\t\tcontinue;\n\n\t\t\tcase '.':\n\t\t\t\tif (words < 1 || words > 6)\n\t\t\t\t\treturn false;\n\n\t\t\t\t{\n\t\t\t\t\tuint32 ip4val;\n\t\t\t\t\tif (!ip4_raw_input((const char *)backtrack, &ip4val))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\ttmp[words++] = (ip4val >> 16);\n\t\t\t\t\tword = (ip4val & 0xffff);\n\t\t\t\t\tdigits = 4;\n\t\t\t\t}\n\n\t\t\t\t/* FALLTHROUGH */\n\t\t\tcase 0:\n\t\t\t\tif (digits)\n\t\t\t\t\ttmp[words++] = word;\n\t\t\t\tif (words < 8)\n\t\t\t\t{\n\t\t\t\t\tint i,d;\n\t\t\t\t\tif (gap < 0)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\td = 8 - words;\n\t\t\t\t\tfor (i = 7; i > gap+d; --i)\n\t\t\t\t\t\ttmp[i] = tmp[i-d];\n\t\t\t\t\tfor (; i > gap; --i)\n\t\t\t\t\t\ttmp[i] = 0;\n\t\t\t\t}\n\t\t\t\tdst[0] = (((uint64)(tmp[0]) << 48) | ((uint64)(tmp[1]) << 32)\n\t\t\t\t\t\t  | ((uint64)(tmp[2]) << 16) | tmp[3]);\n\t\t\t\tdst[1] = (((uint64)(tmp[4]) << 48) | ((uint64)(tmp[5]) << 32)\n\t\t\t\t\t\t  | ((uint64)(tmp[6]) << 16) | tmp[7]);\n\t\t\t\treturn true;\n\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\n\t\tif (++digits > 4)\n\t\t\treturn false;\n\t}\n}\n\nint ip4_raw_output(uint32 ip, char *str, int len)\n{\n\treturn snprintf(str, len, \"%u.%u.%u.%u\",\n\t\t\t\t\t(ip >> 24)&0xff, (ip >> 16)&0xff, (ip >> 8)&0xff, (ip)&0xff);\n}\n\nint ip6_raw_output(uint64 *ip, char *str, int len)\n{\n\tuint16 tmp[8];\n\tchar buf[sizeof(\"ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255\") + 2];\n\tchar *ptr = buf;\n\tunsigned flags = (1 << 8);\n\tint best = -1;\n\tint best_len = 1;\n\tint best_end;\n\tuint16 word;\n\tint i,j;\n\n\ttmp[0] = ip[0] >> 48;\n\ttmp[1] = ip[0] >> 32;\n\ttmp[2] = ip[0] >> 16;\n\ttmp[3] = ip[0];\n\ttmp[4] = ip[1] >> 48;\n\ttmp[5] = ip[1] >> 32;\n\ttmp[6] = ip[1] >> 16;\n\ttmp[7] = ip[1];\n\n\t/*\n\t * Find the best place to put :: in the output. Per RFC5952, we must:\n\t *\t- not use :: to replace a single 0 word\n\t *\t- use :: to replace the longest string of 0 words\n\t *\t- use :: to replace the leftmost candidate string of equal length\n\t *\n\t * The bitmask we construct here has the least significant bit\n\t * representing the leftmost word, and we process the bitmask by\n\t * shifting right, therefore we are processing the original words\n\t * left to right. Thus we take a new best position only if it is\n\t * strictly better than the previous one.\n\t *\n\t * best = -1  implies that there is no position to use ::\n\t */\n\n\tfor (i = 0; i < 8; ++i)\n\t\tflags |= (tmp[i] ? (1 << i) : 0);\n\tfor (i = 0; i < 8; ++i, flags >>= 1)\n\t\tif ((flags & 1) == 0 && (ffs(flags)-1) > best_len)\n\t\t\tbest = i, best_len = ffs(flags)-1;\n\n\tbest_end = best + best_len - 1;\n\n\t/*\n\t * If we're starting with a string of more than one zero word, process\n\t * the special cases:\n\t *\n\t * all zeros (8 zero words) - '::'\n\t * 6 zero words followed by a non-zero word - '::1.2.3.4'\n\t * 5 zero words followed by 0xffff - '::ffff:1.2.3.4'\n\t * 4 zero words followed by ffff:0 - '::ffff:0:1.2.3.4'\t [rfc2765]\n\t *\n\t * The case of 7 zero words we leave alone; that avoids trying to output\n\t * '::1' as '::0.0.0.1'. We assume that '0.0.x.y' will never be a valid\n\t * IPv4 address used in an IPv4-compatible IPv6 address (which are in any\n\t * event deprecated).\n\t */\n\n\tif (best == 0)\n\t{\n\t\tif (best_len == 6\n\t\t\t|| (best_len == 5 && tmp[5] == 0xffff)\n\t\t\t|| (best_len == 4 && tmp[4] == 0xffff && tmp[5] == 0))\n\t\t{\n\t\t\tip4_raw_output(((uint32)(tmp[6]) << 16) | tmp[7], buf, sizeof(buf)-2);\n\t\t\treturn snprintf(str, len, \":%s%s:%s\",\n\t\t\t\t\t\t\t(best_len != 6) ? \":ffff\" : \"\",\n\t\t\t\t\t\t\t(best_len == 4) ? \":0\" : \"\",\n\t\t\t\t\t\t\tbuf);\n\t\t}\n\t\telse if (best_len == 8)\n\t\t\treturn snprintf(str, len, \"::\");\n\t}\n\n\tfor (i = 0; i < 8; ++i)\n\t{\n\t\tif (i >= best && i <= best_end)\n\t\t{\n\t\t\tif (i == best_end)\n\t\t\t\t*ptr++ = ':';\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (i > 0)\n\t\t\t*ptr++ = ':';\n\n\t\tword = tmp[i];\n\n\t\t/*\n\t\t * canonicalization rules:\n\t\t *\n\t\t * leading zeros must be suppressed.\n\t\t * output must be lowercase.\n\t\t */\n\n\t\tif (!word)\n\t\t\t*ptr++ = '0';\n\t\telse\n\t\t{\n\t\t\tword = (word >> 8) | (word << 8);\n\t\t\tword = ((word & 0xf0f0) >> 4) | ((word & 0x0f0f) << 4);\n\t\t\tfor (j = 0; j < 3; ++j, word >>= 4)\n\t\t\t\tif (word & 0xf)\n\t\t\t\t\tbreak;\n\t\t\tfor (; j < 4; ++j, word >>= 4)\n\t\t\t\t*ptr++ = ((word & 0xf) > 9) ? ((word & 0xf) + 'a' - 10) : ((word & 0xf) + '0');\n\t\t}\n\t}\n\n\tif (best_end == 7)\n\t\t*ptr++ = ':';\n\n\t*ptr = 0;\n\n\treturn snprintf(str, len, \"%s\", buf);\n}\n\n/* end */\n"
  },
  {
    "path": "tools/numeric-tests.mk",
    "content": "##\n\ninclude tools/numeric.mk\n\ndefine assert\n$(if $1,,$(error assert failed: $2))\nendef\n\ndefine assert_n\n$(if $1,$(error assert_n failed: $2),)\nendef\n\n.PHONY: tools_test_numeric\n\ntools_test_numeric:\n    $(call assert_n,$(call version_ge,9.0,9.1))\n    $(call assert,$(call version_ge,9.2,9.1))\n    $(call assert,$(call version_ge,9.0,9.0))\n    $(call assert_n,$(call version_ge,9.4,13))\n"
  },
  {
    "path": "tools/numeric.mk",
    "content": "##--\n## Hacks for numeric comparisons.\n\n# $(call version_ge,a,b)\n#  true iff a >= b when treated as vectors of integers separated by . or space\nversion_ge = $(strip $(call vge_2,$(subst ., ,$(1)),$(subst ., ,$(2))))\n\n# if a is empty, result is true if b is empty otherwise false.\n# if b is empty, result is true.\n# if neither is empty, compare first words; if equal, strip one word and recurse.\ndefine vge_2\n$(if $(strip $(1)),\n     $(if $(strip $(2)),\n          $(if $(call numeric_lt,$(firstword $(2)),$(firstword $(1))),\n               t,\n               $(if $(call numeric_lt,$(firstword $(1)),$(firstword $(2))),\n                    ,\n                    $(call vge_2,$(wordlist 2,$(words $(1)),$(1)),$(wordlist 2,$(words $(2)),$(2))))),\n          t),\n     $(if $(strip $(2)),,t))\nendef\n\n# $(call numeric_le,a,b)  - true if a <= b, i.e. either a is 0 or a can index a [1..b] list\nnumeric_le = $(if $(filter 0,$(1)),t,$(word $(1),$(call nwords,$(2),)))\n\n# $(call numeric_lt,a,b)  - true if a < b, i.e. !(b <= a)\nnumeric_lt = $(if $(call numeric_le,$(2),$(1)),,t)\n\n# list of N words\nnwords = $(if $(filter-out 0,$(1)),$(if $(word $(1),$(2)),$(2),$(call nwords,$(1),$(2) t)))\n\n## end of hacks.\n##--\n"
  }
]