diff options
Diffstat (limited to 'src/backend/utils/adt/network.c')
-rw-r--r-- | src/backend/utils/adt/network.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c index 32ebc66fd02..715880e307b 100644 --- a/src/backend/utils/adt/network.c +++ b/src/backend/utils/adt/network.c @@ -1,18 +1,18 @@ /* * PostgreSQL type definitions for the INET and CIDR types. * - * $PostgreSQL: pgsql/src/backend/utils/adt/network.c,v 1.51 2004/06/13 19:56:50 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/network.c,v 1.52 2004/06/13 21:57:25 tgl Exp $ * * Jon Postel RIP 16 Oct 1998 */ #include "postgres.h" -#include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> +#include "access/hash.h" #include "catalog/pg_type.h" #include "libpq/ip.h" #include "libpq/libpq-be.h" @@ -42,7 +42,7 @@ static int ip_addrsize(inet *inetptr); (((inet_struct *)VARDATA(inetptr))->type) #define ip_addr(inetptr) \ - (((inet_struct *)VARDATA(inetptr))->ip_addr) + (((inet_struct *)VARDATA(inetptr))->ipaddr) #define ip_maxbits(inetptr) \ (ip_family(inetptr) == PGSQL_AF_INET ? 32 : 128) @@ -60,7 +60,7 @@ ip_addrsize(inet *inetptr) case PGSQL_AF_INET6: return 16; default: - return -1; + return 0; } } @@ -425,6 +425,27 @@ network_ne(PG_FUNCTION_ARGS) } /* + * Support function for hash indexes on inet/cidr. + * + * Since network_cmp considers only ip_family, ip_bits, and ip_addr, + * only these fields may be used in the hash; in particular don't use type. + */ +Datum +hashinet(PG_FUNCTION_ARGS) +{ + inet *addr = PG_GETARG_INET_P(0); + int addrsize = ip_addrsize(addr); + unsigned char key[sizeof(inet_struct)]; + + Assert(addrsize + 2 <= sizeof(key)); + key[0] = ip_family(addr); + key[1] = ip_bits(addr); + memcpy(key + 2, ip_addr(addr), addrsize); + + return hash_any(key, addrsize + 2); +} + +/* * Boolean network-inclusion tests. */ Datum |