mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Add ipv6 address parsing support to 'inet' and 'cidr' data types.
Regression tests for IPv6 operations added. Documentation updated to document IPv6 bits. Stop treating IPv4 as an "unsigned int" and IPv6 as an array of characters. Instead, always use the array of characters so we can have one function fits all. This makes bitncmp(), addressOK(), and several other functions "just work" on both address families. add family() function which returns integer 4 or 6 for IPv4 or IPv6. (See examples below) Note that to add this new function you will need to dump/initdb/reload or find the correct magic to add the function to the postgresql function catalogs. IPv4 addresses always sort before IPv6. On disk we use AF_INET for IPv4, and AF_INET+1 for IPv6 addresses. This prevents the need for a dump and reload, but lets IPv6 parsing work on machines without AF_INET6. To select all IPv4 addresses from a table: select * from foo where family(addr) = 4 ... Order by and other bits should all work. Michael Graff
This commit is contained in:
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: builtins.h,v 1.219 2003/05/26 00:11:28 tgl Exp $
|
||||
* $Id: builtins.h,v 1.220 2003/06/24 22:21:23 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -644,6 +644,7 @@ extern Datum network_network(PG_FUNCTION_ARGS);
|
||||
extern Datum network_netmask(PG_FUNCTION_ARGS);
|
||||
extern Datum network_hostmask(PG_FUNCTION_ARGS);
|
||||
extern Datum network_masklen(PG_FUNCTION_ARGS);
|
||||
extern Datum network_family(PG_FUNCTION_ARGS);
|
||||
extern Datum network_broadcast(PG_FUNCTION_ARGS);
|
||||
extern Datum network_host(PG_FUNCTION_ARGS);
|
||||
extern Datum network_show(PG_FUNCTION_ARGS);
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: inet.h,v 1.13 2002/06/20 20:29:53 momjian Exp $
|
||||
* $Id: inet.h,v 1.14 2003/06/24 22:21:23 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -23,13 +23,19 @@ typedef struct
|
||||
unsigned char family;
|
||||
unsigned char bits;
|
||||
unsigned char type;
|
||||
union
|
||||
{
|
||||
unsigned int ipv4_addr; /* network byte order */
|
||||
/* add IPV6 address type here */
|
||||
} addr;
|
||||
unsigned char ip_addr[16]; /* 128 bits of address */
|
||||
} inet_struct;
|
||||
|
||||
/*
|
||||
* Referencing all of the non-AF_INET types to AF_INET lets us work on
|
||||
* machines which may not have the appropriate address family (like
|
||||
* inet6 addresses when AF_INET6 isn't present) but doesn't cause a
|
||||
* dump/reload requirement. Existing databases used AF_INET for the family
|
||||
* type on disk.
|
||||
*/
|
||||
#define PGSQL_AF_INET (AF_INET + 0)
|
||||
#define PGSQL_AF_INET6 (AF_INET + 1)
|
||||
|
||||
/*
|
||||
* Both INET and CIDR addresses are represented within Postgres as varlena
|
||||
* objects, ie, there is a varlena header (basically a length word) in front
|
||||
|
Reference in New Issue
Block a user