]> granicus.if.org Git - postgresql/commitdiff
Convert inet-related functions to new fmgr style. I have also taken it
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 3 Aug 2000 23:07:51 +0000 (23:07 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 3 Aug 2000 23:07:51 +0000 (23:07 +0000)
on myself to do something about the non-self-consistency of the inet
comparison functions.  The results are probably still semantically wrong
(inet and cidr should have different comparison semantics, I think)
but at least the boolean operators now agree with each other and with
the sort order of indexes on inet/cidr.

src/backend/utils/adt/mac.c
src/backend/utils/adt/network.c
src/include/catalog/pg_proc.h
src/include/utils/builtins.h
src/include/utils/inet.h
src/test/regress/expected/inet.out

index 5b542504643c689c9213fcb1fb4cf2dc84b29f1c..e8d502b87d27f09a5c2d1ec89d31bc3881537c55 100644 (file)
@@ -1,20 +1,18 @@
 /*
  *     PostgreSQL type definitions for MAC addresses.
  *
- *     $Header: /cvsroot/pgsql/src/backend/utils/adt/mac.c,v 1.16 2000/07/06 05:48:11 tgl Exp $
+ *     $Header: /cvsroot/pgsql/src/backend/utils/adt/mac.c,v 1.17 2000/08/03 23:07:46 tgl Exp $
  */
 
 #include "postgres.h"
 
 #include "utils/builtins.h"
-
+#include "utils/inet.h"
 
 /*
- * macaddr is a pass-by-reference datatype.
+ * XXX this table of manufacturers is long out of date, and should never
+ * have been wired into the code in the first place.
  */
-#define PG_GETARG_MACADDR_P(n)  ((macaddr *) PG_GETARG_POINTER(n))
-#define PG_RETURN_MACADDR_P(x)  return PointerGetDatum(x)
-
 
 typedef struct manufacturer
 {
@@ -145,18 +143,18 @@ static manufacturer manufacturers[] = {
  */
 
 #define hibits(addr) \
-  ((unsigned long)((addr->a<<16)|(addr->b<<8)|(addr->c)))
+  ((unsigned long)(((addr)->a<<16)|((addr)->b<<8)|((addr)->c)))
 
 #define lobits(addr) \
-  ((unsigned long)((addr->d<<16)|(addr->e<<8)|(addr->f)))
+  ((unsigned long)(((addr)->d<<16)|((addr)->e<<8)|((addr)->f)))
 
 /*
  *     MAC address reader.  Accepts several common notations.
  */
-
-macaddr    *
-macaddr_in(char *str)
+Datum
+macaddr_in(PG_FUNCTION_ARGS)
 {
+       char       *str = PG_GETARG_CSTRING(0);
        int                     a,
                                b,
                                c,
@@ -201,21 +199,18 @@ macaddr_in(char *str)
        result->e = e;
        result->f = f;
 
-       return (result);
+       PG_RETURN_MACADDR_P(result);
 }
 
 /*
  *     MAC address output function.  Fixed format.
  */
-
-char *
-macaddr_out(macaddr *addr)
+Datum
+macaddr_out(PG_FUNCTION_ARGS)
 {
+       macaddr    *addr = PG_GETARG_MACADDR_P(0);
        char       *result;
 
-       if (addr == NULL)
-               return (NULL);
-
        result = (char *) palloc(32);
 
        if ((hibits(addr) > 0) || (lobits(addr) > 0))
@@ -225,84 +220,95 @@ macaddr_out(macaddr *addr)
        }
        else
        {
-               result[0] = 0;                  /* special case for missing address */
+               result[0] = '\0';               /* special case for missing address */
        }
-       return (result);
+
+       PG_RETURN_CSTRING(result);
 }
 
 /*
- *     Boolean tests.
+ *     Comparison function for sorting:
  */
 
-bool
-macaddr_lt(macaddr *a1, macaddr *a2)
+static int32
+macaddr_cmp_internal(macaddr *a1, macaddr *a2)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
-       return ((hibits(a1) < hibits(a2)) ||
-                       ((hibits(a1) == hibits(a2)) && lobits(a1) < lobits(a2)));
+       if (hibits(a1) < hibits(a2))
+               return -1;
+       else if (hibits(a1) > hibits(a2))
+               return 1;
+       else if (lobits(a1) < lobits(a2))
+               return -1;
+       else if (lobits(a1) > lobits(a2))
+               return 1;
+       else
+               return 0;
 }
 
-bool
-macaddr_le(macaddr *a1, macaddr *a2)
+Datum
+macaddr_cmp(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
-       return ((hibits(a1) < hibits(a2)) ||
-                       ((hibits(a1) == hibits(a2)) && lobits(a1) <= lobits(a2)));
+       macaddr    *a1 = PG_GETARG_MACADDR_P(0);
+       macaddr    *a2 = PG_GETARG_MACADDR_P(1);
+
+       PG_RETURN_INT32(macaddr_cmp_internal(a1, a2));
 }
 
-bool
-macaddr_eq(macaddr *a1, macaddr *a2)
+/*
+ *     Boolean comparisons.
+ */
+Datum
+macaddr_lt(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
-       return ((hibits(a1) == hibits(a2)) && (lobits(a1) == lobits(a2)));
+       macaddr    *a1 = PG_GETARG_MACADDR_P(0);
+       macaddr    *a2 = PG_GETARG_MACADDR_P(1);
+
+       PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) < 0);
 }
 
-bool
-macaddr_ge(macaddr *a1, macaddr *a2)
+Datum
+macaddr_le(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
-       return ((hibits(a1) > hibits(a2)) ||
-                       ((hibits(a1) == hibits(a2)) && lobits(a1) >= lobits(a2)));
+       macaddr    *a1 = PG_GETARG_MACADDR_P(0);
+       macaddr    *a2 = PG_GETARG_MACADDR_P(1);
+
+       PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) <= 0);
 }
 
-bool
-macaddr_gt(macaddr *a1, macaddr *a2)
+Datum
+macaddr_eq(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
-       return ((hibits(a1) > hibits(a2)) ||
-                       ((hibits(a1) == hibits(a2)) && lobits(a1) > lobits(a2)));
+       macaddr    *a1 = PG_GETARG_MACADDR_P(0);
+       macaddr    *a2 = PG_GETARG_MACADDR_P(1);
+
+       PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) == 0);
 }
 
-bool
-macaddr_ne(macaddr *a1, macaddr *a2)
+Datum
+macaddr_ge(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
-       return ((hibits(a1) != hibits(a2)) || (lobits(a1) != lobits(a2)));
+       macaddr    *a1 = PG_GETARG_MACADDR_P(0);
+       macaddr    *a2 = PG_GETARG_MACADDR_P(1);
+
+       PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) >= 0);
 }
 
-/*
- *     Comparison function for sorting:
- */
+Datum
+macaddr_gt(PG_FUNCTION_ARGS)
+{
+       macaddr    *a1 = PG_GETARG_MACADDR_P(0);
+       macaddr    *a2 = PG_GETARG_MACADDR_P(1);
+
+       PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) > 0);
+}
 
-int4
-macaddr_cmp(macaddr *a1, macaddr *a2)
+Datum
+macaddr_ne(PG_FUNCTION_ARGS)
 {
-       if (hibits(a1) < hibits(a2))
-               return -1;
-       else if (hibits(a1) > hibits(a2))
-               return 1;
-       else if (lobits(a1) < lobits(a2))
-               return -1;
-       else if (lobits(a1) > lobits(a2))
-               return 1;
-       else
-               return 0;
+       macaddr    *a1 = PG_GETARG_MACADDR_P(0);
+       macaddr    *a2 = PG_GETARG_MACADDR_P(1);
+
+       PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) != 0);
 }
 
 /*
index eb489d9cd71127f357d55f82fdf5c7a91e386fde..9765444eace67fbb464312c827ff2632fd9b149f 100644 (file)
@@ -3,7 +3,7 @@
  *     is for IP V4 CIDR notation, but prepared for V6: just
  *     add the necessary bits where the comments indicate.
  *
- *     $Header: /cvsroot/pgsql/src/backend/utils/adt/network.c,v 1.23 2000/07/06 05:48:11 tgl Exp $
+ *     $Header: /cvsroot/pgsql/src/backend/utils/adt/network.c,v 1.24 2000/08/03 23:07:46 tgl Exp $
  *
  *     Jon Postel RIP 16 Oct 1998
  */
 #include <arpa/inet.h>
 
 #include "utils/builtins.h"
-
-/*
- * inet is a pass-by-reference datatype.  It's not toastable, and we
- * don't try to hide the pass-by-refness, so these macros are simple.
- */
-#define PG_GETARG_INET_P(n)  ((inet *) PG_GETARG_POINTER(n))
-#define PG_RETURN_INET_P(x)  return PointerGetDatum(x)
+#include "utils/inet.h"
 
 
 static int     v4bitncmp(unsigned int a1, unsigned int a2, int bits);
+static int32 network_cmp_internal(inet *a1, inet *a2);
 
 /*
  *     Access macros.  Add IPV6 support.
@@ -54,12 +49,7 @@ network_in(char *src, int type)
        int                     bits;
        inet       *dst;
 
-       if (!src)
-               return NULL;
-
-       dst = palloc(VARHDRSZ + sizeof(inet_struct));
-       if (dst == NULL)
-               elog(ERROR, "unable to allocate memory in network_in()");
+       dst = (inet *) palloc(VARHDRSZ + sizeof(inet_struct));
 
        /* First, try for an IP V4 address: */
        ip_family(dst) = AF_INET;
@@ -74,32 +64,37 @@ network_in(char *src, int type)
                + ip_addrsize(dst);
        ip_bits(dst) = bits;
        ip_type(dst) = type;
+
        return dst;
 }
 
 /* INET address reader.  */
-inet *
-inet_in(char *src)
+Datum
+inet_in(PG_FUNCTION_ARGS)
 {
-       return network_in(src, 0);
+       char       *src = PG_GETARG_CSTRING(0);
+
+       PG_RETURN_INET_P(network_in(src, 0));
 }
 
 /* CIDR address reader.  */
-inet *
-cidr_in(char *src)
+Datum
+cidr_in(PG_FUNCTION_ARGS)
 {
-       return network_in(src, 1);
+       char       *src = PG_GETARG_CSTRING(0);
+
+       PG_RETURN_INET_P(network_in(src, 1));
 }
 
 /*
  *     INET address output function.
  */
-
-char *
-inet_out(inet *src)
+Datum
+inet_out(PG_FUNCTION_ARGS)
 {
-       char       *dst,
-                               tmp[sizeof("255.255.255.255/32")];
+       inet       *src = PG_GETARG_INET_P(0);
+       char            tmp[sizeof("255.255.255.255/32")];
+       char       *dst;
 
        if (ip_family(src) == AF_INET)
        {
@@ -118,211 +113,201 @@ inet_out(inet *src)
                /* Go for an IPV6 address here, before faulting out: */
                elog(ERROR, "unknown address family (%d)", ip_family(src));
 
-       dst = palloc(strlen(tmp) + 1);
-       if (dst == NULL)
-               elog(ERROR, "unable to allocate memory in inet_out()");
-
-       strcpy(dst, tmp);
-       return dst;
+       PG_RETURN_CSTRING(pstrdup(tmp));
 }
 
 
-/* just a stub */
-char *
-cidr_out(inet *src)
+/* share code with INET case */
+Datum
+cidr_out(PG_FUNCTION_ARGS)
 {
-       return inet_out(src);
+       return inet_out(fcinfo);
 }
 
+
 /*
- *     Boolean tests for magnitude.  Add V4/V6 testing!
+ *     Basic comparison function for sorting and inet/cidr comparisons.
+ *
+ * XXX this ignores bits to the right of the mask.  That's probably
+ * correct for CIDR, almost certainly wrong for INET.  We need to have
+ * two sets of comparator routines, not just one.  Note that suggests
+ * that CIDR and INET should not be considered binary-equivalent by
+ * the parser?
  */
 
-bool
-network_lt(inet *a1, inet *a2)
+static int32
+network_cmp_internal(inet *a1, inet *a2)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
-       if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
+       if (ip_family(a1) == AF_INET && ip_family(a2) == AF_INET)
        {
-               int                     order = v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a2));
+               int             order = v4bitncmp(ip_v4addr(a1), ip_v4addr(a2),
+                                                                 Min(ip_bits(a1), ip_bits(a2)));
 
-               return ((order < 0) || ((order == 0) && (ip_bits(a1) < ip_bits(a2))));
+               if (order != 0)
+                       return order;
+               return ((int32) ip_bits(a1)) - ((int32) ip_bits(a2));
        }
        else
        {
                /* Go for an IPV6 address here, before faulting out: */
                elog(ERROR, "cannot compare address families %d and %d",
                         ip_family(a1), ip_family(a2));
-               return FALSE;
+               return 0;                               /* keep compiler quiet */
        }
 }
 
-bool
-network_le(inet *a1, inet *a2)
+Datum
+network_cmp(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
-       return (network_lt(a1, a2) || network_eq(a1, a2));
+       inet       *a1 = PG_GETARG_INET_P(0);
+       inet       *a2 = PG_GETARG_INET_P(1);
+
+       PG_RETURN_INT32(network_cmp_internal(a1, a2));
 }
 
-bool
-network_eq(inet *a1, inet *a2)
+/*
+ *     Boolean ordering tests.
+ */
+Datum
+network_lt(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
-       if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
-       {
-               return ((ip_bits(a1) == ip_bits(a2))
-                && (v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a1)) == 0));
-       }
-       else
-       {
-               /* Go for an IPV6 address here, before faulting out: */
-               elog(ERROR, "cannot compare address families %d and %d",
-                        ip_family(a1), ip_family(a2));
-               return FALSE;
-       }
+       inet       *a1 = PG_GETARG_INET_P(0);
+       inet       *a2 = PG_GETARG_INET_P(1);
+
+       PG_RETURN_BOOL(network_cmp_internal(a1, a2) < 0);
 }
 
-bool
-network_ge(inet *a1, inet *a2)
+Datum
+network_le(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
-       return (network_gt(a1, a2) || network_eq(a1, a2));
+       inet       *a1 = PG_GETARG_INET_P(0);
+       inet       *a2 = PG_GETARG_INET_P(1);
+
+       PG_RETURN_BOOL(network_cmp_internal(a1, a2) <= 0);
 }
 
-bool
-network_gt(inet *a1, inet *a2)
+Datum
+network_eq(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
-       if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
-       {
-               int                     order = v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a2));
+       inet       *a1 = PG_GETARG_INET_P(0);
+       inet       *a2 = PG_GETARG_INET_P(1);
 
-               return ((order > 0) || ((order == 0) && (ip_bits(a1) > ip_bits(a2))));
-       }
-       else
-       {
-               /* Go for an IPV6 address here, before faulting out: */
-               elog(ERROR, "cannot compare address families %d and %d",
-                        ip_family(a1), ip_family(a2));
-               return FALSE;
-       }
+       PG_RETURN_BOOL(network_cmp_internal(a1, a2) == 0);
+}
+
+Datum
+network_ge(PG_FUNCTION_ARGS)
+{
+       inet       *a1 = PG_GETARG_INET_P(0);
+       inet       *a2 = PG_GETARG_INET_P(1);
+
+       PG_RETURN_BOOL(network_cmp_internal(a1, a2) >= 0);
 }
 
-bool
-network_ne(inet *a1, inet *a2)
+Datum
+network_gt(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
-       return (!network_eq(a1, a2));
+       inet       *a1 = PG_GETARG_INET_P(0);
+       inet       *a2 = PG_GETARG_INET_P(1);
+
+       PG_RETURN_BOOL(network_cmp_internal(a1, a2) > 0);
 }
 
-bool
-network_sub(inet *a1, inet *a2)
+Datum
+network_ne(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
+       inet       *a1 = PG_GETARG_INET_P(0);
+       inet       *a2 = PG_GETARG_INET_P(1);
+
+       PG_RETURN_BOOL(network_cmp_internal(a1, a2) != 0);
+}
+
+/*
+ *     Boolean network-inclusion tests.
+ */
+Datum
+network_sub(PG_FUNCTION_ARGS)
+{
+       inet       *a1 = PG_GETARG_INET_P(0);
+       inet       *a2 = PG_GETARG_INET_P(1);
 
        if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
        {
-               return ((ip_bits(a1) > ip_bits(a2))
-                && (v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a2)) == 0));
+               PG_RETURN_BOOL(ip_bits(a1) > ip_bits(a2)
+                       && v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a2)) == 0);
        }
        else
        {
                /* Go for an IPV6 address here, before faulting out: */
                elog(ERROR, "cannot compare address families %d and %d",
                         ip_family(a1), ip_family(a2));
-               return FALSE;
+               PG_RETURN_BOOL(false);
        }
 }
 
-bool
-network_subeq(inet *a1, inet *a2)
+Datum
+network_subeq(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
+       inet       *a1 = PG_GETARG_INET_P(0);
+       inet       *a2 = PG_GETARG_INET_P(1);
 
        if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
        {
-               return ((ip_bits(a1) >= ip_bits(a2))
-                && (v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a2)) == 0));
+               PG_RETURN_BOOL(ip_bits(a1) >= ip_bits(a2)
+                       && v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a2)) == 0);
        }
        else
        {
                /* Go for an IPV6 address here, before faulting out: */
                elog(ERROR, "cannot compare address families %d and %d",
                         ip_family(a1), ip_family(a2));
-               return FALSE;
+               PG_RETURN_BOOL(false);
        }
 }
 
-bool
-network_sup(inet *a1, inet *a2)
+Datum
+network_sup(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
+       inet       *a1 = PG_GETARG_INET_P(0);
+       inet       *a2 = PG_GETARG_INET_P(1);
 
        if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
        {
-               return ((ip_bits(a1) < ip_bits(a2))
-                && (v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a1)) == 0));
+               PG_RETURN_BOOL(ip_bits(a1) < ip_bits(a2)
+                       && v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a1)) == 0);
        }
        else
        {
                /* Go for an IPV6 address here, before faulting out: */
                elog(ERROR, "cannot compare address families %d and %d",
                         ip_family(a1), ip_family(a2));
-               return FALSE;
+               PG_RETURN_BOOL(false);
        }
 }
 
-bool
-network_supeq(inet *a1, inet *a2)
+Datum
+network_supeq(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(a1) || !PointerIsValid(a2))
-               return FALSE;
+       inet       *a1 = PG_GETARG_INET_P(0);
+       inet       *a2 = PG_GETARG_INET_P(1);
 
        if ((ip_family(a1) == AF_INET) && (ip_family(a2) == AF_INET))
        {
-               return ((ip_bits(a1) <= ip_bits(a2))
-                && (v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a1)) == 0));
+               PG_RETURN_BOOL(ip_bits(a1) <= ip_bits(a2)
+                       && v4bitncmp(ip_v4addr(a1), ip_v4addr(a2), ip_bits(a1)) == 0);
        }
        else
        {
                /* Go for an IPV6 address here, before faulting out: */
                elog(ERROR, "cannot compare address families %d and %d",
                         ip_family(a1), ip_family(a2));
-               return FALSE;
+               PG_RETURN_BOOL(false);
        }
 }
 
 /*
- *     Comparison function for sorting.  Add V4/V6 testing!
+ * Extract data from a network datatype.
  */
-
-int4
-network_cmp(inet *a1, inet *a2)
-{
-       if (ntohl(ip_v4addr(a1)) < ntohl(ip_v4addr(a2)))
-               return (-1);
-
-       if (ntohl(ip_v4addr(a1)) > ntohl(ip_v4addr(a2)))
-               return (1);
-
-       if (ip_bits(a1) < ip_bits(a2))
-               return (-1);
-
-       if (ip_bits(a1) > ip_bits(a2))
-               return (1);
-
-       return 0;
-}
-
 Datum
 network_host(PG_FUNCTION_ARGS)
 {
@@ -357,13 +342,12 @@ network_host(PG_FUNCTION_ARGS)
        PG_RETURN_TEXT_P(ret);
 }
 
-int4
-network_masklen(inet *ip)
+Datum
+network_masklen(PG_FUNCTION_ARGS)
 {
-       if (!PointerIsValid(ip))
-               return 0;
+       inet       *ip = PG_GETARG_INET_P(0);
 
-       return ip_bits(ip);
+       PG_RETURN_INT32(ip_bits(ip));
 }
 
 Datum
index 8556c83f53edd15709e1312d371ae45572b17286..9919f1509be3a42033cd594d529a7aea143f51e5 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_proc.h,v 1.156 2000/08/03 16:34:31 tgl Exp $
+ * $Id: pg_proc.h,v 1.157 2000/08/03 23:07:46 tgl Exp $
  *
  * NOTES
  *       The script catalog/genbki.sh reads this file and generates .bki
@@ -2174,68 +2174,68 @@ DATA(insert OID = 1688 (  varbitsubstr          PGUID 11 f t t t 2 f 1562 "1562 1562" 10
 DESCR("bitwise field");
 
 /* for mac type support */
-DATA(insert OID = 436 (  macaddr_in                    PGUID 11 f t t t 1 f 829 "0" 100 0 0 100        macaddr_in - ));
+DATA(insert OID = 436 (  macaddr_in                    PGUID 12 f t t t 1 f 829 "0" 100 0 0 100        macaddr_in - ));
 DESCR("(internal)");
-DATA(insert OID = 437 (  macaddr_out           PGUID 11 f t t t 1 f 23 "0" 100 0 0 100  macaddr_out - ));
+DATA(insert OID = 437 (  macaddr_out           PGUID 12 f t t t 1 f 23 "0" 100 0 0 100  macaddr_out - ));
 DESCR("(internal)");
 
-DATA(insert OID = 830 (  macaddr_eq               PGUID 11 f t t t 2 f 16 "829 829" 100 0 0 100        macaddr_eq - ));
+DATA(insert OID = 830 (  macaddr_eq               PGUID 12 f t t t 2 f 16 "829 829" 100 0 0 100        macaddr_eq - ));
 DESCR("equal");
-DATA(insert OID = 831 (  macaddr_lt               PGUID 11 f t t t 2 f 16 "829 829" 100 0 0 100        macaddr_lt - ));
+DATA(insert OID = 831 (  macaddr_lt               PGUID 12 f t t t 2 f 16 "829 829" 100 0 0 100        macaddr_lt - ));
 DESCR("less-than");
-DATA(insert OID = 832 (  macaddr_le               PGUID 11 f t t t 2 f 16 "829 829" 100 0 0 100        macaddr_le - ));
+DATA(insert OID = 832 (  macaddr_le               PGUID 12 f t t t 2 f 16 "829 829" 100 0 0 100        macaddr_le - ));
 DESCR("less-than-or-equal");
-DATA(insert OID = 833 (  macaddr_gt               PGUID 11 f t t t 2 f 16 "829 829" 100 0 0 100        macaddr_gt - ));
+DATA(insert OID = 833 (  macaddr_gt               PGUID 12 f t t t 2 f 16 "829 829" 100 0 0 100        macaddr_gt - ));
 DESCR("greater-than");
-DATA(insert OID = 834 (  macaddr_ge               PGUID 11 f t t t 2 f 16 "829 829" 100 0 0 100        macaddr_ge - ));
+DATA(insert OID = 834 (  macaddr_ge               PGUID 12 f t t t 2 f 16 "829 829" 100 0 0 100        macaddr_ge - ));
 DESCR("greater-than-or-equal");
-DATA(insert OID = 835 (  macaddr_ne               PGUID 11 f t t t 2 f 16 "829 829" 100 0 0 100        macaddr_ne - ));
+DATA(insert OID = 835 (  macaddr_ne               PGUID 12 f t t t 2 f 16 "829 829" 100 0 0 100        macaddr_ne - ));
 DESCR("not equal");
-DATA(insert OID = 836 (  macaddr_cmp      PGUID 11 f t t t 2 f 23 "829 829" 100 0 0 100        macaddr_cmp - ));
+DATA(insert OID = 836 (  macaddr_cmp      PGUID 12 f t t t 2 f 23 "829 829" 100 0 0 100        macaddr_cmp - ));
 DESCR("less-equal-greater");
 DATA(insert OID = 837 (  macaddr_manuf    PGUID 12 f t t t 1 f 25 "829" 100 0 0 100    macaddr_manuf - ));
 DESCR("MAC manufacturer");
 
 /* for inet type support */
-DATA(insert OID = 910 (  inet_in                       PGUID 11 f t t t 1 f 869 "0" 100 0 0 100        inet_in - ));
+DATA(insert OID = 910 (  inet_in                       PGUID 12 f t t t 1 f 869 "0" 100 0 0 100        inet_in - ));
 DESCR("(internal)");
-DATA(insert OID = 911 (  inet_out                      PGUID 11 f t t t 1 f 23 "0" 100 0 0 100  inet_out - ));
+DATA(insert OID = 911 (  inet_out                      PGUID 12 f t t t 1 f 23 "0" 100 0 0 100  inet_out - ));
 DESCR("(internal)");
 
 /* for cidr type support */
-DATA(insert OID = 1267 (  cidr_in                      PGUID 11 f t t t 1 f 650 "0" 100 0 0 100        cidr_in - ));
+DATA(insert OID = 1267 (  cidr_in                      PGUID 12 f t t t 1 f 650 "0" 100 0 0 100        cidr_in - ));
 DESCR("(internal)");
-DATA(insert OID = 1427 (  cidr_out                     PGUID 11 f t t t 1 f 23 "0" 100 0 0 100  cidr_out - ));
+DATA(insert OID = 1427 (  cidr_out                     PGUID 12 f t t t 1 f 23 "0" 100 0 0 100  cidr_out - ));
 DESCR("(internal)");
 
 /* these are used for both inet and cidr */
-DATA(insert OID = 920 (  network_eq               PGUID 11 f t t t 2 f 16 "869 869" 100 0 0 100        network_eq - ));
+DATA(insert OID = 920 (  network_eq               PGUID 12 f t t t 2 f 16 "869 869" 100 0 0 100        network_eq - ));
 DESCR("equal");
-DATA(insert OID = 921 (  network_lt               PGUID 11 f t t t 2 f 16 "869 869" 100 0 0 100        network_lt - ));
+DATA(insert OID = 921 (  network_lt               PGUID 12 f t t t 2 f 16 "869 869" 100 0 0 100        network_lt - ));
 DESCR("less-than");
-DATA(insert OID = 922 (  network_le               PGUID 11 f t t t 2 f 16 "869 869" 100 0 0 100        network_le - ));
+DATA(insert OID = 922 (  network_le               PGUID 12 f t t t 2 f 16 "869 869" 100 0 0 100        network_le - ));
 DESCR("less-than-or-equal");
-DATA(insert OID = 923 (  network_gt               PGUID 11 f t t t 2 f 16 "869 869" 100 0 0 100        network_gt - ));
+DATA(insert OID = 923 (  network_gt               PGUID 12 f t t t 2 f 16 "869 869" 100 0 0 100        network_gt - ));
 DESCR("greater-than");
-DATA(insert OID = 924 (  network_ge               PGUID 11 f t t t 2 f 16 "869 869" 100 0 0 100        network_ge - ));
+DATA(insert OID = 924 (  network_ge               PGUID 12 f t t t 2 f 16 "869 869" 100 0 0 100        network_ge - ));
 DESCR("greater-than-or-equal");
-DATA(insert OID = 925 (  network_ne               PGUID 11 f t t t 2 f 16 "869 869" 100 0 0 100        network_ne - ));
+DATA(insert OID = 925 (  network_ne               PGUID 12 f t t t 2 f 16 "869 869" 100 0 0 100        network_ne - ));
 DESCR("not equal");
-DATA(insert OID = 926 (  network_cmp              PGUID 11 f t t t 2 f 23 "869 869" 100 0 0 100        network_cmp - ));
+DATA(insert OID = 926 (  network_cmp              PGUID 12 f t t t 2 f 23 "869 869" 100 0 0 100        network_cmp - ));
 DESCR("less-equal-greater");
-DATA(insert OID = 927 (  network_sub              PGUID 11 f t t t 2 f 16 "869 869" 100 0 0 100        network_sub - ));
+DATA(insert OID = 927 (  network_sub              PGUID 12 f t t t 2 f 16 "869 869" 100 0 0 100        network_sub - ));
 DESCR("is-subnet");
-DATA(insert OID = 928 (  network_subeq            PGUID 11 f t t t 2 f 16 "869 869" 100 0 0 100        network_subeq - ));
+DATA(insert OID = 928 (  network_subeq            PGUID 12 f t t t 2 f 16 "869 869" 100 0 0 100        network_subeq - ));
 DESCR("is-subnet-or-equal");
-DATA(insert OID = 929 (  network_sup              PGUID 11 f t t t 2 f 16 "869 869" 100 0 0 100        network_sup - ));
+DATA(insert OID = 929 (  network_sup              PGUID 12 f t t t 2 f 16 "869 869" 100 0 0 100        network_sup - ));
 DESCR("is-supernet");
-DATA(insert OID = 930 (  network_supeq            PGUID 11 f t t t 2 f 16 "869 869" 100 0 0 100        network_supeq - ));
+DATA(insert OID = 930 (  network_supeq            PGUID 12 f t t t 2 f 16 "869 869" 100 0 0 100        network_supeq - ));
 DESCR("is-supernet-or-equal");
 
 /* inet/cidr versions */
 DATA(insert OID = 696 (  netmask                               PGUID 12 f t t t 1 f 25 "869" 100 0 0 100  network_netmask - ));
 DESCR("netmask of address");
-DATA(insert OID = 697 (  masklen                               PGUID 11 f t t t 1 f 23 "869" 100 0 0 100  network_masklen - ));
+DATA(insert OID = 697 (  masklen                               PGUID 12 f t t t 1 f 23 "869" 100 0 0 100  network_masklen - ));
 DESCR("netmask length");
 DATA(insert OID = 698 (  broadcast                             PGUID 12 f t t t 1 f 25 "869" 100 0 0 100  network_broadcast - ));
 DESCR("broadcast address");
index bb483164130ef26242d9cc408d4d3bff79d3b76a..4fa7481f042ec711570b348b7a2f5dcb6f78d67d 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: builtins.h,v 1.129 2000/08/03 16:34:50 tgl Exp $
+ * $Id: builtins.h,v 1.130 2000/08/03 23:07:51 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -16,7 +16,6 @@
 
 #include "nodes/relation.h"            /* for amcostestimate parameters */
 #include "storage/itemptr.h"
-#include "utils/inet.h"
 #include "utils/numeric.h"
 
 /*
@@ -436,7 +435,6 @@ extern Datum textlike(PG_FUNCTION_ARGS);
 extern Datum textnlike(PG_FUNCTION_ARGS);
 
 /* oracle_compat.c */
-
 extern Datum lower(PG_FUNCTION_ARGS);
 extern Datum upper(PG_FUNCTION_ARGS);
 extern Datum initcap(PG_FUNCTION_ARGS);
@@ -450,48 +448,48 @@ extern Datum ichar(PG_FUNCTION_ARGS);
 extern Datum repeat(PG_FUNCTION_ARGS);
 extern Datum ascii(PG_FUNCTION_ARGS);
 
-/* acl.c */
-
 /* inet_net_ntop.c */
-extern char *inet_net_ntop(int af, const void *src, int bits, char *dst, size_t size);
-extern char *inet_cidr_ntop(int af, const void *src, int bits, char *dst, size_t size);
+extern char *inet_net_ntop(int af, const void *src, int bits,
+                                                  char *dst, size_t size);
+extern char *inet_cidr_ntop(int af, const void *src, int bits,
+                                                       char *dst, size_t size);
 
 /* inet_net_pton.c */
-extern int     inet_net_pton(int af, const char *src, void *dst, size_t size);
+extern int     inet_net_pton(int af, const char *src,
+                                                 void *dst, size_t size);
 
 /* network.c */
-extern inet *inet_in(char *str);
-extern char *inet_out(inet *addr);
-extern inet *cidr_in(char *str);
-extern char *cidr_out(inet *addr);
-extern bool network_lt(inet *a1, inet *a2);
-extern bool network_le(inet *a1, inet *a2);
-extern bool network_eq(inet *a1, inet *a2);
-extern bool network_ge(inet *a1, inet *a2);
-extern bool network_gt(inet *a1, inet *a2);
-extern bool network_ne(inet *a1, inet *a2);
-extern bool network_sub(inet *a1, inet *a2);
-extern bool network_subeq(inet *a1, inet *a2);
-extern bool network_sup(inet *a1, inet *a2);
-extern bool network_supeq(inet *a1, inet *a2);
-extern int4 network_cmp(inet *a1, inet *a2);
-
+extern Datum inet_in(PG_FUNCTION_ARGS);
+extern Datum inet_out(PG_FUNCTION_ARGS);
+extern Datum cidr_in(PG_FUNCTION_ARGS);
+extern Datum cidr_out(PG_FUNCTION_ARGS);
+extern Datum network_cmp(PG_FUNCTION_ARGS);
+extern Datum network_lt(PG_FUNCTION_ARGS);
+extern Datum network_le(PG_FUNCTION_ARGS);
+extern Datum network_eq(PG_FUNCTION_ARGS);
+extern Datum network_ge(PG_FUNCTION_ARGS);
+extern Datum network_gt(PG_FUNCTION_ARGS);
+extern Datum network_ne(PG_FUNCTION_ARGS);
+extern Datum network_sub(PG_FUNCTION_ARGS);
+extern Datum network_subeq(PG_FUNCTION_ARGS);
+extern Datum network_sup(PG_FUNCTION_ARGS);
+extern Datum network_supeq(PG_FUNCTION_ARGS);
 extern Datum network_network(PG_FUNCTION_ARGS);
 extern Datum network_netmask(PG_FUNCTION_ARGS);
-extern int4 network_masklen(inet *addr);
+extern Datum network_masklen(PG_FUNCTION_ARGS);
 extern Datum network_broadcast(PG_FUNCTION_ARGS);
 extern Datum network_host(PG_FUNCTION_ARGS);
 
 /* mac.c */
-extern macaddr *macaddr_in(char *str);
-extern char *macaddr_out(macaddr *addr);
-extern bool macaddr_lt(macaddr *a1, macaddr *a2);
-extern bool macaddr_le(macaddr *a1, macaddr *a2);
-extern bool macaddr_eq(macaddr *a1, macaddr *a2);
-extern bool macaddr_ge(macaddr *a1, macaddr *a2);
-extern bool macaddr_gt(macaddr *a1, macaddr *a2);
-extern bool macaddr_ne(macaddr *a1, macaddr *a2);
-extern int4 macaddr_cmp(macaddr *a1, macaddr *a2);
+extern Datum macaddr_in(PG_FUNCTION_ARGS);
+extern Datum macaddr_out(PG_FUNCTION_ARGS);
+extern Datum macaddr_cmp(PG_FUNCTION_ARGS);
+extern Datum macaddr_lt(PG_FUNCTION_ARGS);
+extern Datum macaddr_le(PG_FUNCTION_ARGS);
+extern Datum macaddr_eq(PG_FUNCTION_ARGS);
+extern Datum macaddr_ge(PG_FUNCTION_ARGS);
+extern Datum macaddr_gt(PG_FUNCTION_ARGS);
+extern Datum macaddr_ne(PG_FUNCTION_ARGS);
 extern Datum macaddr_manuf(PG_FUNCTION_ARGS);
 
 /* numeric.c */
index 075d66aa6b3f20a2b259f3eb92c23c22e8c2b8d9..5b39801f9c1544828688535857eb3ae8e2f6402b 100644 (file)
@@ -7,17 +7,17 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: inet.h,v 1.7 2000/07/06 05:48:31 tgl Exp $
+ * $Id: inet.h,v 1.8 2000/08/03 23:07:51 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
-#ifndef MAC_H
-#define MAC_H
+#ifndef INET_H
+#define INET_H
 
 /*
- *     This is the internal storage format for IP addresses:
+ *     This is the internal storage format for IP addresses
+ *     (both INET and CIDR datatypes):
  */
-
 typedef struct
 {
        unsigned char family;
@@ -30,8 +30,17 @@ typedef struct
        }                       addr;
 } inet_struct;
 
+/*
+ * Both INET and CIDR addresses are represented within Postgres as varlena
+ * objects, ie, there is a varlena header (basically a length word) in front
+ * of the struct type depicted above.
+ *
+ * Although these types are variable-length, the maximum length
+ * is pretty short, so we make no provision for TOASTing them.
+ */
 typedef struct varlena inet;
 
+
 /*
  *     This is the internal storage format for MAC addresses:
  */
@@ -45,4 +54,18 @@ typedef struct macaddr
        unsigned char f;
 } macaddr;
 
-#endif  /* MAC_H */
+/*
+ * fmgr interface macros
+ */
+#define DatumGetInetP(X)    ((inet *) DatumGetPointer(X))
+#define InetPGetDatum(X)    PointerGetDatum(X)
+#define PG_GETARG_INET_P(n) DatumGetInetP(PG_GETARG_DATUM(n))
+#define PG_RETURN_INET_P(x) return InetPGetDatum(x)
+/* macaddr is a fixed-length pass-by-reference datatype */
+#define DatumGetMacaddrP(X)    ((macaddr *) DatumGetPointer(X))
+#define MacaddrPGetDatum(X)    PointerGetDatum(X)
+#define PG_GETARG_MACADDR_P(n) DatumGetMacaddrP(PG_GETARG_DATUM(n))
+#define PG_RETURN_MACADDR_P(x) return MacaddrPGetDatum(x)
+
+
+#endif  /* INET_H */
index 35bfd77809dca50cc620beb4006c438587534ec3..6822ae3895451518a54eaede78bef8a59b500365 100644 (file)
@@ -128,7 +128,7 @@ SELECT '' AS ten, i, c,
      | 192.168.1.226/24 | 192.168.1/24 | f  | t  | t  | t  | f  | f  | f  | t   | f   | t
      | 192.168.1.226    | 192.168.1/24 | f  | f  | f  | t  | t  | t  | t  | t   | f   | f
      | 10.1.2.3/8       | 10/8         | f  | t  | t  | t  | f  | f  | f  | t   | f   | t
-     | 10.1.2.3/8       | 10.0.0.0/32  | f  | f  | f  | t  | t  | t  | f  | f   | t   | t
+     | 10.1.2.3/8       | 10.0.0.0/32  | t  | t  | f  | f  | f  | t  | f  | f   | t   | t
      | 10.1.2.3         | 10.1.2.3/32  | f  | t  | t  | t  | f  | f  | f  | t   | f   | t
      | 10.1.2.3/24      | 10.1.2/24    | f  | t  | t  | t  | f  | f  | f  | t   | f   | t
      | 10.1.2.3/16      | 10.1/16      | f  | t  | t  | t  | f  | f  | f  | t   | f   | t