mac_eui64_support_1.patch
application/octet-stream
Filename: mac_eui64_support_1.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| contrib/btree_gin/btree_gin.c | 12 | 4 |
| contrib/btree_gist/btree_macaddr.c | 12 | 12 |
| src/backend/utils/adt/mac6.c | 321 | 0 |
| src/backend/utils/adt/mac.c | 269 | 99 |
| src/backend/utils/adt/Makefile | 1 | 1 |
| src/backend/utils/adt/network.c | 20 | 2 |
| src/backend/utils/adt/selfuncs.c | 1 | 0 |
| src/include/catalog/pg_amop.h | 21 | 3 |
| src/include/catalog/pg_amproc.h | 8 | 1 |
| src/include/catalog/pg_cast.h | 5 | 0 |
| src/include/catalog/pg_opclass.h | 6 | 3 |
| src/include/catalog/pg_operator.h | 30 | 9 |
| src/include/catalog/pg_opfamily.h | 6 | 3 |
| src/include/catalog/pg_proc.h | 47 | 18 |
| src/include/catalog/pg_type.h | 8 | 3 |
| src/include/utils/builtins.h | 19 | 0 |
| src/include/utils/inet.h | 31 | 3 |
| src/test/regress/expected/macaddr.out | 111 | 27 |
| src/test/regress/expected/opr_sanity.out | 12 | 6 |
| src/test/regress/sql/macaddr.sql | 17 | 0 |
diff --git a/contrib/btree_gin/btree_gin.c b/contrib/btree_gin/btree_gin.c
index 030b610..a76060f 100644
--- a/contrib/btree_gin/btree_gin.c
+++ b/contrib/btree_gin/btree_gin.c
@@ -313,14 +313,22 @@ leftmostvalue_interval(void)
GIN_SUPPORT(interval, false, leftmostvalue_interval, interval_cmp)
static Datum
-leftmostvalue_macaddr(void)
+leftmostvalue_macaddr6(void)
{
- macaddr *v = palloc0(sizeof(macaddr));
+ macaddr6 *v = palloc0(sizeof(macaddr6));
+
+ return Macaddr6PGetDatum(v);
+}
+
+GIN_SUPPORT(macaddr6, false, leftmostvalue_macaddr6, macaddr6_cmp)
- return MacaddrPGetDatum(v);
+static Datum
+leftmostvalue_macaddr(void)
+{
+ return DirectFunctionCall1(macaddr_in, CStringGetDatum("00-00-00-00-00-00"));
}
-GIN_SUPPORT(macaddr, false, leftmostvalue_macaddr, macaddr_cmp)
+GIN_SUPPORT(macaddr, true, leftmostvalue_macaddr, macaddr_cmp)
static Datum
leftmostvalue_inet(void)
diff --git a/contrib/btree_gist/btree_macaddr.c b/contrib/btree_gist/btree_macaddr.c
index 87d96c0..c074e95 100644
--- a/contrib/btree_gist/btree_macaddr.c
+++ b/contrib/btree_gist/btree_macaddr.c
@@ -10,8 +10,8 @@
typedef struct
{
- macaddr lower;
- macaddr upper;
+ macaddr6 lower;
+ macaddr6 upper;
char pad[4]; /* make struct size = sizeof(gbtreekey16) */
} macKEY;
@@ -30,30 +30,30 @@ PG_FUNCTION_INFO_V1(gbt_macad_same);
static bool
gbt_macadgt(const void *a, const void *b)
{
- return DatumGetBool(DirectFunctionCall2(macaddr_gt, PointerGetDatum(a), PointerGetDatum(b)));
+ return DatumGetBool(DirectFunctionCall2(macaddr6_gt, PointerGetDatum(a), PointerGetDatum(b)));
}
static bool
gbt_macadge(const void *a, const void *b)
{
- return DatumGetBool(DirectFunctionCall2(macaddr_ge, PointerGetDatum(a), PointerGetDatum(b)));
+ return DatumGetBool(DirectFunctionCall2(macaddr6_ge, PointerGetDatum(a), PointerGetDatum(b)));
}
static bool
gbt_macadeq(const void *a, const void *b)
{
- return DatumGetBool(DirectFunctionCall2(macaddr_eq, PointerGetDatum(a), PointerGetDatum(b)));
+ return DatumGetBool(DirectFunctionCall2(macaddr6_eq, PointerGetDatum(a), PointerGetDatum(b)));
}
static bool
gbt_macadle(const void *a, const void *b)
{
- return DatumGetBool(DirectFunctionCall2(macaddr_le, PointerGetDatum(a), PointerGetDatum(b)));
+ return DatumGetBool(DirectFunctionCall2(macaddr6_le, PointerGetDatum(a), PointerGetDatum(b)));
}
static bool
gbt_macadlt(const void *a, const void *b)
{
- return DatumGetBool(DirectFunctionCall2(macaddr_lt, PointerGetDatum(a), PointerGetDatum(b)));
+ return DatumGetBool(DirectFunctionCall2(macaddr6_lt, PointerGetDatum(a), PointerGetDatum(b)));
}
@@ -64,9 +64,9 @@ gbt_macadkey_cmp(const void *a, const void *b)
macKEY *ib = (macKEY *) (((const Nsrt *) b)->t);
int res;
- res = DatumGetInt32(DirectFunctionCall2(macaddr_cmp, MacaddrPGetDatum(&ia->lower), MacaddrPGetDatum(&ib->lower)));
+ res = DatumGetInt32(DirectFunctionCall2(macaddr6_cmp, Macaddr6PGetDatum(&ia->lower), Macaddr6PGetDatum(&ib->lower)));
if (res == 0)
- return DatumGetInt32(DirectFunctionCall2(macaddr_cmp, MacaddrPGetDatum(&ia->upper), MacaddrPGetDatum(&ib->upper)));
+ return DatumGetInt32(DirectFunctionCall2(macaddr6_cmp, Macaddr6PGetDatum(&ia->upper), Macaddr6PGetDatum(&ib->upper)));
return res;
}
@@ -75,7 +75,7 @@ gbt_macadkey_cmp(const void *a, const void *b)
static const gbtree_ninfo tinfo =
{
gbt_t_macad,
- sizeof(macaddr),
+ sizeof(macaddr6),
16, /* sizeof(gbtreekey16) */
gbt_macadgt,
gbt_macadge,
@@ -94,7 +94,7 @@ static const gbtree_ninfo tinfo =
static uint64
-mac_2_uint64(macaddr *m)
+mac_2_uint64(macaddr6 *m)
{
unsigned char *mi = (unsigned char *) m;
uint64 res = 0;
@@ -127,7 +127,7 @@ Datum
gbt_macad_consistent(PG_FUNCTION_ARGS)
{
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
- macaddr *query = (macaddr *) PG_GETARG_POINTER(1);
+ macaddr6 *query = (macaddr6 *) PG_GETARG_POINTER(1);
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
/* Oid subtype = PG_GETARG_OID(3); */
diff --git a/src/backend/utils/adt/Makefile b/src/backend/utils/adt/Makefile
index 0f51275..840a1ee 100644
--- a/src/backend/utils/adt/Makefile
+++ b/src/backend/utils/adt/Makefile
@@ -16,7 +16,7 @@ OBJS = acl.o amutils.o arrayfuncs.o array_expanded.o array_selfuncs.o \
float.o format_type.o formatting.o genfile.o \
geo_ops.o geo_selfuncs.o geo_spgist.o inet_cidr_ntop.o inet_net_pton.o \
int.o int8.o json.o jsonb.o jsonb_gin.o jsonb_op.o jsonb_util.o \
- jsonfuncs.o like.o lockfuncs.o mac.o misc.o nabstime.o name.o \
+ jsonfuncs.o like.o lockfuncs.o mac6.o mac.o misc.o nabstime.o name.o \
network.o network_gist.o network_selfuncs.o network_spgist.o \
numeric.o numutils.o oid.o oracle_compat.o \
orderedsetaggs.o pg_locale.o pg_lsn.o pg_upgrade_support.o \
diff --git a/src/backend/utils/adt/mac.c b/src/backend/utils/adt/mac.c
index 509315a..b1ffa1a 100644
--- a/src/backend/utils/adt/mac.c
+++ b/src/backend/utils/adt/mac.c
@@ -1,5 +1,8 @@
/*
- * PostgreSQL type definitions for MAC addresses.
+ * PostgreSQL type definitions for MAC addresses
+ * Support both EUI-48 and EUI-64.
+ *
+ * The entire code is written as treating OUI field size as 24 bits
*
* src/backend/utils/adt/mac.c
*/
@@ -11,19 +14,21 @@
#include "utils/builtins.h"
#include "utils/inet.h"
-
/*
* Utility macros used for sorting and comparing:
*/
#define hibits(addr) \
- ((unsigned long)(((addr)->a<<16)|((addr)->b<<8)|((addr)->c)))
+ ((unsigned long)(((addr)->data[0]<<24)|((addr)->data[1]<<16)|((addr)->data[2]<<8)))
#define lobits(addr) \
- ((unsigned long)(((addr)->d<<16)|((addr)->e<<8)|((addr)->f)))
+ ((unsigned long)(((addr)->data[3]<<16)|((addr)->data[4]<<8)|((addr)->data[5])))
+
+#define lobits_extra(addr) \
+ ((unsigned long)((addr)->data[6]<<8)|((addr)->data[7]))
/*
- * MAC address reader. Accepts several common notations.
+ * MAC address (EUI-48 and EUI-64) reader. Accepts several common notations.
*/
Datum
@@ -31,58 +36,114 @@ macaddr_in(PG_FUNCTION_ARGS)
{
char *str = PG_GETARG_CSTRING(0);
macaddr *result;
+ mac_struct *addr;
int a,
b,
c,
d,
e,
- f;
+ f,
+ g = 0,
+ h = 0;
char junk[2];
int count;
+ bool eight_byte_address = false;
- /* %1s matches iff there is trailing non-whitespace garbage */
+ /* %1s matches iff there is trailing non-whitespace garbage */
count = sscanf(str, "%x:%x:%x:%x:%x:%x%1s",
&a, &b, &c, &d, &e, &f, junk);
if (count != 6)
count = sscanf(str, "%x-%x-%x-%x-%x-%x%1s",
- &a, &b, &c, &d, &e, &f, junk);
+ &a, &b, &c, &d, &e, &f, junk);
if (count != 6)
count = sscanf(str, "%2x%2x%2x:%2x%2x%2x%1s",
- &a, &b, &c, &d, &e, &f, junk);
+ &a, &b, &c, &d, &e, &f, junk);
if (count != 6)
count = sscanf(str, "%2x%2x%2x-%2x%2x%2x%1s",
- &a, &b, &c, &d, &e, &f, junk);
+ &a, &b, &c, &d, &e, &f, junk);
if (count != 6)
count = sscanf(str, "%2x%2x.%2x%2x.%2x%2x%1s",
- &a, &b, &c, &d, &e, &f, junk);
+ &a, &b, &c, &d, &e, &f, junk);
if (count != 6)
count = sscanf(str, "%2x%2x-%2x%2x-%2x%2x%1s",
- &a, &b, &c, &d, &e, &f, junk);
+ &a, &b, &c, &d, &e, &f, junk);
if (count != 6)
count = sscanf(str, "%2x%2x%2x%2x%2x%2x%1s",
- &a, &b, &c, &d, &e, &f, junk);
+ &a, &b, &c, &d, &e, &f, junk);
+
if (count != 6)
- ereport(ERROR,
- (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
- errmsg("invalid input syntax for type macaddr: \"%s\"", str)));
+ {
+ /* May be a 8-byte MAC address */
+ eight_byte_address = true;
+
+ count = sscanf(str, "%x:%x:%x:%x:%x:%x:%x:%x%1s",
+ &a, &b, &c, &d, &e, &f, &g, &h, junk);
+ if (count != 8)
+ count = sscanf(str, "%x-%x-%x-%x-%x-%x-%x-%x%1s",
+ &a, &b, &c, &d, &e, &f, &g, &h, junk);
+ if (count != 8)
+ count = sscanf(str, "%2x%2x%2x:%2x%2x%2x%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, &g, &h, junk);
+ if (count != 8)
+ count = sscanf(str, "%2x%2x%2x-%2x%2x%2x%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, &g, &h, junk);
+ if (count != 8)
+ count = sscanf(str, "%2x%2x.%2x%2x.%2x%2x.%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, &g, &h, junk);
+ if (count != 8)
+ count = sscanf(str, "%2x%2x-%2x%2x-%2x%2x-%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, &g, &h, junk);
+ if (count != 8)
+ count = sscanf(str, "%2x%2x%2x%2x%2x%2x%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, &g, &h, junk);
+ if (count != 8)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type macaddr: \"%s\"", str)));
+ }
+ }
if ((a < 0) || (a > 255) || (b < 0) || (b > 255) ||
(c < 0) || (c > 255) || (d < 0) || (d > 255) ||
- (e < 0) || (e > 255) || (f < 0) || (f > 255))
+ (e < 0) || (e > 255) || (f < 0) || (f > 255) ||
+ (g < 0) || (g > 255) || (h < 0) || (h > 255))
ereport(ERROR,
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
- errmsg("invalid octet value in \"macaddr\" value: \"%s\"", str)));
-
- result = (macaddr *) palloc(sizeof(macaddr));
+ errmsg("invalid octet value in \"macaddr\" value: \"%s\"", str)));
- result->a = a;
- result->b = b;
- result->c = c;
- result->d = d;
- result->e = e;
- result->f = f;
+ if ((a == 0) && (b == 0) && (c == 0) && (d == 0)
+ && (e == 0) && (f == 0) && (g == 0) && (h == 0))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("invalid \"macaddr\" Address: \"%s\"", str),
+ errhint ("00-00-00-00-00-00-00-00 address is a reserved address")));
+ if ((a == 255) && (b == 255) && (c == 255) && (d == 255)
+ && (e == 255) && (f == 255) && (g == 255) && (h == 255))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("invalid \"macaddr\" Address: \"%s\"", str),
+ errhint ("FF-FF-FF-FF-FF-FF-FF-FF address is a reserved address")));
+
+ result = (macaddr *) palloc0(sizeof(macaddr));
+ addr = MACADDR(result);
+
+ addr->data[0] = a;
+ addr->data[1] = b;
+ addr->data[2] = c;
+ addr->data[3] = d;
+ addr->data[4] = e;
+ addr->data[5] = f;
+
+ if (eight_byte_address)
+ {
+ addr->data[6] = g;
+ addr->data[7] = h;
+ }
+
+ SET_MACADDR_VARSIZE(result, count);
PG_RETURN_MACADDR_P(result);
}
@@ -93,19 +154,26 @@ macaddr_in(PG_FUNCTION_ARGS)
Datum
macaddr_out(PG_FUNCTION_ARGS)
{
- macaddr *addr = PG_GETARG_MACADDR_P(0);
+ macaddr *addr = PG_GETARG_MACADDR_PP(0);
char *result;
result = (char *) palloc(32);
- snprintf(result, 32, "%02x:%02x:%02x:%02x:%02x:%02x",
- addr->a, addr->b, addr->c, addr->d, addr->e, addr->f);
+ if (MACADDR_SIZE(addr) == 8)
+ snprintf(result, 32, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
+ MACADDR(addr)->data[0], MACADDR(addr)->data[1], MACADDR(addr)->data[2],
+ MACADDR(addr)->data[3], MACADDR(addr)->data[4], MACADDR(addr)->data[5],
+ MACADDR(addr)->data[6], MACADDR(addr)->data[7]);
+ else
+ snprintf(result, 32, "%02x:%02x:%02x:%02x:%02x:%02x",
+ MACADDR(addr)->data[0], MACADDR(addr)->data[1], MACADDR(addr)->data[2],
+ MACADDR(addr)->data[3], MACADDR(addr)->data[4], MACADDR(addr)->data[5]);
PG_RETURN_CSTRING(result);
}
/*
- * macaddr_recv - converts external binary format to macaddr
+ * macaddr_recv - converts external binary format(EUI-48 and EUI-64) to macaddr
*
* The external representation is just the six bytes, MSB first.
*/
@@ -115,34 +183,48 @@ macaddr_recv(PG_FUNCTION_ARGS)
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
macaddr *addr;
- addr = (macaddr *) palloc(sizeof(macaddr));
+ addr = (macaddr *) palloc0(sizeof(macaddr));
+
+ MACADDR(addr)->data[0] = pq_getmsgbyte(buf);
+ MACADDR(addr)->data[1] = pq_getmsgbyte(buf);
+ MACADDR(addr)->data[2] = pq_getmsgbyte(buf);
+ MACADDR(addr)->data[3] = pq_getmsgbyte(buf);
+ MACADDR(addr)->data[4] = pq_getmsgbyte(buf);
+ MACADDR(addr)->data[5] = pq_getmsgbyte(buf);
- addr->a = pq_getmsgbyte(buf);
- addr->b = pq_getmsgbyte(buf);
- addr->c = pq_getmsgbyte(buf);
- addr->d = pq_getmsgbyte(buf);
- addr->e = pq_getmsgbyte(buf);
- addr->f = pq_getmsgbyte(buf);
+ if (buf->len == 8)
+ {
+ MACADDR(addr)->data[6] = pq_getmsgbyte(buf);
+ MACADDR(addr)->data[7] = pq_getmsgbyte(buf);
+ }
+ SET_MACADDR_VARSIZE(addr, buf->len);
PG_RETURN_MACADDR_P(addr);
}
/*
- * macaddr_send - converts macaddr to binary format
+ * macaddr_send - converts macaddr(EUI-48 and EUI-64) to binary format
*/
Datum
macaddr_send(PG_FUNCTION_ARGS)
{
- macaddr *addr = PG_GETARG_MACADDR_P(0);
+ macaddr *addr = PG_GETARG_MACADDR_PP(0);
StringInfoData buf;
pq_begintypsend(&buf);
- pq_sendbyte(&buf, addr->a);
- pq_sendbyte(&buf, addr->b);
- pq_sendbyte(&buf, addr->c);
- pq_sendbyte(&buf, addr->d);
- pq_sendbyte(&buf, addr->e);
- pq_sendbyte(&buf, addr->f);
+ pq_sendbyte(&buf, MACADDR(addr)->data[0]);
+ pq_sendbyte(&buf, MACADDR(addr)->data[1]);
+ pq_sendbyte(&buf, MACADDR(addr)->data[2]);
+ pq_sendbyte(&buf, MACADDR(addr)->data[3]);
+ pq_sendbyte(&buf, MACADDR(addr)->data[4]);
+ pq_sendbyte(&buf, MACADDR(addr)->data[5]);
+
+ if (MACADDR_SIZE(addr) == 8)
+ {
+ pq_sendbyte(&buf, MACADDR(addr)->data[6]);
+ pq_sendbyte(&buf, MACADDR(addr)->data[7]);
+ }
+
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
@@ -154,23 +236,40 @@ macaddr_send(PG_FUNCTION_ARGS)
static int32
macaddr_cmp_internal(macaddr *a1, macaddr *a2)
{
- if (hibits(a1) < hibits(a2))
+ int size1 = MACADDR_SIZE(a1);
+ int size2 = MACADDR_SIZE(a2);
+
+ if (hibits(MACADDR(a1)) < hibits(MACADDR(a2)))
return -1;
- else if (hibits(a1) > hibits(a2))
+ else if (hibits(MACADDR(a1)) > hibits(MACADDR(a2)))
return 1;
- else if (lobits(a1) < lobits(a2))
+ else if (lobits(MACADDR(a1)) < lobits(MACADDR(a2)))
return -1;
- else if (lobits(a1) > lobits(a2))
+ else if (lobits(MACADDR(a1)) > lobits(MACADDR(a2)))
return 1;
else
+ {
+ if (size1 == 8 && size2 == 8)
+ {
+ if (lobits_extra(MACADDR(a1)) < lobits_extra(MACADDR(a2)))
+ return -1;
+ else if (lobits_extra(MACADDR(a1)) > lobits_extra(MACADDR(a2)))
+ return 1;
+ }
+ else if (size1 == 8)
+ return 1;
+ else if (size2 == 8)
+ return -1;
+
return 0;
+ }
}
Datum
macaddr_cmp(PG_FUNCTION_ARGS)
{
- macaddr *a1 = PG_GETARG_MACADDR_P(0);
- macaddr *a2 = PG_GETARG_MACADDR_P(1);
+ macaddr *a1 = PG_GETARG_MACADDR_PP(0);
+ macaddr *a2 = PG_GETARG_MACADDR_PP(1);
PG_RETURN_INT32(macaddr_cmp_internal(a1, a2));
}
@@ -182,8 +281,8 @@ macaddr_cmp(PG_FUNCTION_ARGS)
Datum
macaddr_lt(PG_FUNCTION_ARGS)
{
- macaddr *a1 = PG_GETARG_MACADDR_P(0);
- macaddr *a2 = PG_GETARG_MACADDR_P(1);
+ macaddr *a1 = PG_GETARG_MACADDR_PP(0);
+ macaddr *a2 = PG_GETARG_MACADDR_PP(1);
PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) < 0);
}
@@ -191,8 +290,8 @@ macaddr_lt(PG_FUNCTION_ARGS)
Datum
macaddr_le(PG_FUNCTION_ARGS)
{
- macaddr *a1 = PG_GETARG_MACADDR_P(0);
- macaddr *a2 = PG_GETARG_MACADDR_P(1);
+ macaddr *a1 = PG_GETARG_MACADDR_PP(0);
+ macaddr *a2 = PG_GETARG_MACADDR_PP(1);
PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) <= 0);
}
@@ -200,8 +299,8 @@ macaddr_le(PG_FUNCTION_ARGS)
Datum
macaddr_eq(PG_FUNCTION_ARGS)
{
- macaddr *a1 = PG_GETARG_MACADDR_P(0);
- macaddr *a2 = PG_GETARG_MACADDR_P(1);
+ macaddr *a1 = PG_GETARG_MACADDR_PP(0);
+ macaddr *a2 = PG_GETARG_MACADDR_PP(1);
PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) == 0);
}
@@ -209,8 +308,8 @@ macaddr_eq(PG_FUNCTION_ARGS)
Datum
macaddr_ge(PG_FUNCTION_ARGS)
{
- macaddr *a1 = PG_GETARG_MACADDR_P(0);
- macaddr *a2 = PG_GETARG_MACADDR_P(1);
+ macaddr *a1 = PG_GETARG_MACADDR_PP(0);
+ macaddr *a2 = PG_GETARG_MACADDR_PP(1);
PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) >= 0);
}
@@ -218,8 +317,8 @@ macaddr_ge(PG_FUNCTION_ARGS)
Datum
macaddr_gt(PG_FUNCTION_ARGS)
{
- macaddr *a1 = PG_GETARG_MACADDR_P(0);
- macaddr *a2 = PG_GETARG_MACADDR_P(1);
+ macaddr *a1 = PG_GETARG_MACADDR_PP(0);
+ macaddr *a2 = PG_GETARG_MACADDR_PP(1);
PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) > 0);
}
@@ -227,8 +326,8 @@ macaddr_gt(PG_FUNCTION_ARGS)
Datum
macaddr_ne(PG_FUNCTION_ARGS)
{
- macaddr *a1 = PG_GETARG_MACADDR_P(0);
- macaddr *a2 = PG_GETARG_MACADDR_P(1);
+ macaddr *a1 = PG_GETARG_MACADDR_PP(0);
+ macaddr *a2 = PG_GETARG_MACADDR_PP(1);
PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) != 0);
}
@@ -239,9 +338,9 @@ macaddr_ne(PG_FUNCTION_ARGS)
Datum
hashmacaddr(PG_FUNCTION_ARGS)
{
- macaddr *key = PG_GETARG_MACADDR_P(0);
+ macaddr *key = PG_GETARG_MACADDR_PP(0);
- return hash_any((unsigned char *) key, sizeof(macaddr));
+ return hash_any((unsigned char *) MACADDR(key), MACADDR_SIZE(key));
}
/*
@@ -250,50 +349,95 @@ hashmacaddr(PG_FUNCTION_ARGS)
Datum
macaddr_not(PG_FUNCTION_ARGS)
{
- macaddr *addr = PG_GETARG_MACADDR_P(0);
+ macaddr *addr = PG_GETARG_MACADDR_PP(0);
macaddr *result;
+ int size1 = MACADDR_SIZE(addr);
+ int size2 = MACADDR_SIZE(addr);
- result = (macaddr *) palloc(sizeof(macaddr));
- result->a = ~addr->a;
- result->b = ~addr->b;
- result->c = ~addr->c;
- result->d = ~addr->d;
- result->e = ~addr->e;
- result->f = ~addr->f;
+ if (size1 != size2)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("Different length input addresses")));
+
+ result = (macaddr *) palloc0(sizeof(macaddr));
+ MACADDR(result)->data[0] = ~MACADDR(addr)->data[0];
+ MACADDR(result)->data[1] = ~MACADDR(addr)->data[1];
+ MACADDR(result)->data[2] = ~MACADDR(addr)->data[2];
+ MACADDR(result)->data[3] = ~MACADDR(addr)->data[3];
+ MACADDR(result)->data[4] = ~MACADDR(addr)->data[4];
+ MACADDR(result)->data[5] = ~MACADDR(addr)->data[5];
+
+ if (size1 == 8)
+ {
+ MACADDR(result)->data[6] = ~MACADDR(addr)->data[6];
+ MACADDR(result)->data[7] = ~MACADDR(addr)->data[7];
+ }
+
+ SET_MACADDR_VARSIZE(result, size1);
PG_RETURN_MACADDR_P(result);
}
Datum
macaddr_and(PG_FUNCTION_ARGS)
{
- macaddr *addr1 = PG_GETARG_MACADDR_P(0);
- macaddr *addr2 = PG_GETARG_MACADDR_P(1);
+ macaddr *addr1 = PG_GETARG_MACADDR_PP(0);
+ macaddr *addr2 = PG_GETARG_MACADDR_PP(1);
macaddr *result;
+ int size1 = MACADDR_SIZE(addr1);
+ int size2 = MACADDR_SIZE(addr1);
- result = (macaddr *) palloc(sizeof(macaddr));
- result->a = addr1->a & addr2->a;
- result->b = addr1->b & addr2->b;
- result->c = addr1->c & addr2->c;
- result->d = addr1->d & addr2->d;
- result->e = addr1->e & addr2->e;
- result->f = addr1->f & addr2->f;
+ if (size1 != size2)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("Different length input addresses")));
+
+ result = (macaddr *) palloc0(sizeof(macaddr));
+ MACADDR(result)->data[0] = MACADDR(addr1)->data[0] & MACADDR(addr2)->data[0];
+ MACADDR(result)->data[1] = MACADDR(addr1)->data[1] & MACADDR(addr2)->data[1];
+ MACADDR(result)->data[2] = MACADDR(addr1)->data[2] & MACADDR(addr2)->data[2];
+ MACADDR(result)->data[3] = MACADDR(addr1)->data[3] & MACADDR(addr2)->data[3];
+ MACADDR(result)->data[4] = MACADDR(addr1)->data[4] & MACADDR(addr2)->data[4];
+ MACADDR(result)->data[5] = MACADDR(addr1)->data[5] & MACADDR(addr2)->data[5];
+
+ if (size1 == 8)
+ {
+ MACADDR(result)->data[6] = MACADDR(addr1)->data[6] & MACADDR(addr2)->data[6];
+ MACADDR(result)->data[7] = MACADDR(addr1)->data[7] & MACADDR(addr2)->data[7];
+ }
+
+ SET_MACADDR_VARSIZE(result, size1);
PG_RETURN_MACADDR_P(result);
}
Datum
macaddr_or(PG_FUNCTION_ARGS)
{
- macaddr *addr1 = PG_GETARG_MACADDR_P(0);
- macaddr *addr2 = PG_GETARG_MACADDR_P(1);
+ macaddr *addr1 = PG_GETARG_MACADDR_PP(0);
+ macaddr *addr2 = PG_GETARG_MACADDR_PP(1);
macaddr *result;
+ int size1 = MACADDR_SIZE(addr1);
+ int size2 = MACADDR_SIZE(addr1);
- result = (macaddr *) palloc(sizeof(macaddr));
- result->a = addr1->a | addr2->a;
- result->b = addr1->b | addr2->b;
- result->c = addr1->c | addr2->c;
- result->d = addr1->d | addr2->d;
- result->e = addr1->e | addr2->e;
- result->f = addr1->f | addr2->f;
+ if (size1 != size2)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("Different length input addresses")));
+
+ result = (macaddr *) palloc0(sizeof(macaddr));
+ MACADDR(result)->data[0] = MACADDR(addr1)->data[0] | MACADDR(addr2)->data[0];
+ MACADDR(result)->data[1] = MACADDR(addr1)->data[1] | MACADDR(addr2)->data[1];
+ MACADDR(result)->data[2] = MACADDR(addr1)->data[2] | MACADDR(addr2)->data[2];
+ MACADDR(result)->data[3] = MACADDR(addr1)->data[3] | MACADDR(addr2)->data[3];
+ MACADDR(result)->data[4] = MACADDR(addr1)->data[4] | MACADDR(addr2)->data[4];
+ MACADDR(result)->data[5] = MACADDR(addr1)->data[5] | MACADDR(addr2)->data[5];
+
+ if (size1 == 8)
+ {
+ MACADDR(result)->data[6] = MACADDR(addr1)->data[6] | MACADDR(addr2)->data[6];
+ MACADDR(result)->data[7] = MACADDR(addr1)->data[7] | MACADDR(addr2)->data[7];
+ }
+
+ SET_MACADDR_VARSIZE(result, size1);
PG_RETURN_MACADDR_P(result);
}
@@ -304,17 +448,43 @@ macaddr_or(PG_FUNCTION_ARGS)
Datum
macaddr_trunc(PG_FUNCTION_ARGS)
{
- macaddr *addr = PG_GETARG_MACADDR_P(0);
+ macaddr *addr = PG_GETARG_MACADDR_PP(0);
macaddr *result;
+ int size = MACADDR_SIZE(addr);
- result = (macaddr *) palloc(sizeof(macaddr));
+ result = (macaddr *) palloc0(sizeof(macaddr));
- result->a = addr->a;
- result->b = addr->b;
- result->c = addr->c;
- result->d = 0;
- result->e = 0;
- result->f = 0;
+ MACADDR(result)->data[0] = MACADDR(addr)->data[0];
+ MACADDR(result)->data[1] = MACADDR(addr)->data[1];
+ MACADDR(result)->data[2] = MACADDR(addr)->data[2];
+ MACADDR(result)->data[3] = 0;
+ MACADDR(result)->data[4] = 0;
+ MACADDR(result)->data[5] = 0;
+ MACADDR(result)->data[6] = 0;
+ MACADDR(result)->data[7] = 0;
+ SET_MACADDR_VARSIZE(result, size);
PG_RETURN_MACADDR_P(result);
}
+
+Datum
+mac6tomac(PG_FUNCTION_ARGS)
+{
+ macaddr6 *addr6 = PG_GETARG_MACADDR6_P(0);
+ macaddr *result;
+
+ result = (macaddr *) palloc0(sizeof(macaddr));
+
+ MACADDR(result)->data[0] = addr6->a;
+ MACADDR(result)->data[1] = addr6->b;
+ MACADDR(result)->data[2] = addr6->c;
+ MACADDR(result)->data[3] = 0xFF;
+ MACADDR(result)->data[4] = 0xFE;
+ MACADDR(result)->data[5] = addr6->d;
+ MACADDR(result)->data[6] = addr6->e;
+ MACADDR(result)->data[7] = addr6->f;
+
+ SET_MACADDR_VARSIZE(result, 8);
+ PG_RETURN_MACADDR_P(result);
+}
+
diff --git a/src/backend/utils/adt/mac6.c b/src/backend/utils/adt/mac6.c
new file mode 100644
index 0000000..670ca4b
--- /dev/null
+++ b/src/backend/utils/adt/mac6.c
@@ -0,0 +1,321 @@
+/*
+ * PostgreSQL type definitions for MAC addresses.
+ * Supports only 6-byte MAC addresses
+ *
+ * src/backend/utils/adt/mac.c
+ */
+
+#include "postgres.h"
+
+#include "access/hash.h"
+#include "libpq/pqformat.h"
+#include "utils/builtins.h"
+#include "utils/inet.h"
+
+
+/*
+ * Utility macros used for sorting and comparing:
+ */
+
+#define hibits(addr) \
+ ((unsigned long)(((addr)->a<<16)|((addr)->b<<8)|((addr)->c)))
+
+#define lobits(addr) \
+ ((unsigned long)(((addr)->d<<16)|((addr)->e<<8)|((addr)->f)))
+
+/*
+ * MAC address reader. Accepts several common notations.
+ */
+
+Datum
+macaddr6_in(PG_FUNCTION_ARGS)
+{
+ char *str = PG_GETARG_CSTRING(0);
+ macaddr6 *result;
+ int a,
+ b,
+ c,
+ d,
+ e,
+ f;
+ char junk[2];
+ int count;
+
+ /* %1s matches iff there is trailing non-whitespace garbage */
+
+ count = sscanf(str, "%x:%x:%x:%x:%x:%x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ count = sscanf(str, "%x-%x-%x-%x-%x-%x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ count = sscanf(str, "%2x%2x%2x:%2x%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ count = sscanf(str, "%2x%2x%2x-%2x%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ count = sscanf(str, "%2x%2x.%2x%2x.%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ count = sscanf(str, "%2x%2x-%2x%2x-%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ count = sscanf(str, "%2x%2x%2x%2x%2x%2x%1s",
+ &a, &b, &c, &d, &e, &f, junk);
+ if (count != 6)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type macaddr6: \"%s\"", str)));
+
+ if ((a < 0) || (a > 255) || (b < 0) || (b > 255) ||
+ (c < 0) || (c > 255) || (d < 0) || (d > 255) ||
+ (e < 0) || (e > 255) || (f < 0) || (f > 255))
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("invalid octet value in \"macaddr6\" value: \"%s\"", str)));
+
+ result = (macaddr6 *) palloc(sizeof(macaddr6));
+
+ result->a = a;
+ result->b = b;
+ result->c = c;
+ result->d = d;
+ result->e = e;
+ result->f = f;
+
+ PG_RETURN_MACADDR6_P(result);
+}
+
+/*
+ * MAC address output function. Fixed format.
+ */
+
+Datum
+macaddr6_out(PG_FUNCTION_ARGS)
+{
+ macaddr6 *addr = PG_GETARG_MACADDR6_P(0);
+ char *result;
+
+ result = (char *) palloc(32);
+
+ snprintf(result, 32, "%02x:%02x:%02x:%02x:%02x:%02x",
+ addr->a, addr->b, addr->c, addr->d, addr->e, addr->f);
+
+ PG_RETURN_CSTRING(result);
+}
+
+/*
+ * macaddr6_recv - converts external binary format to macaddr6
+ *
+ * The external representation is just the six bytes, MSB first.
+ */
+Datum
+macaddr6_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
+ macaddr6 *addr;
+
+ addr = (macaddr6 *) palloc(sizeof(macaddr6));
+
+ addr->a = pq_getmsgbyte(buf);
+ addr->b = pq_getmsgbyte(buf);
+ addr->c = pq_getmsgbyte(buf);
+ addr->d = pq_getmsgbyte(buf);
+ addr->e = pq_getmsgbyte(buf);
+ addr->f = pq_getmsgbyte(buf);
+
+ PG_RETURN_MACADDR6_P(addr);
+}
+
+/*
+ * macaddr6_send - converts macaddr6 to binary format
+ */
+Datum
+macaddr6_send(PG_FUNCTION_ARGS)
+{
+ macaddr6 *addr = PG_GETARG_MACADDR6_P(0);
+ StringInfoData buf;
+
+ pq_begintypsend(&buf);
+ pq_sendbyte(&buf, addr->a);
+ pq_sendbyte(&buf, addr->b);
+ pq_sendbyte(&buf, addr->c);
+ pq_sendbyte(&buf, addr->d);
+ pq_sendbyte(&buf, addr->e);
+ pq_sendbyte(&buf, addr->f);
+ PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+
+/*
+ * Comparison function for sorting:
+ */
+
+static int32
+macaddr6_cmp_internal(macaddr6 *a1, macaddr6 *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;
+}
+
+Datum
+macaddr6_cmp(PG_FUNCTION_ARGS)
+{
+ macaddr6 *a1 = PG_GETARG_MACADDR6_P(0);
+ macaddr6 *a2 = PG_GETARG_MACADDR6_P(1);
+
+ PG_RETURN_INT32(macaddr6_cmp_internal(a1, a2));
+}
+
+/*
+ * Boolean comparisons.
+ */
+
+Datum
+macaddr6_lt(PG_FUNCTION_ARGS)
+{
+ macaddr6 *a1 = PG_GETARG_MACADDR6_P(0);
+ macaddr6 *a2 = PG_GETARG_MACADDR6_P(1);
+
+ PG_RETURN_BOOL(macaddr6_cmp_internal(a1, a2) < 0);
+}
+
+Datum
+macaddr6_le(PG_FUNCTION_ARGS)
+{
+ macaddr6 *a1 = PG_GETARG_MACADDR6_P(0);
+ macaddr6 *a2 = PG_GETARG_MACADDR6_P(1);
+
+ PG_RETURN_BOOL(macaddr6_cmp_internal(a1, a2) <= 0);
+}
+
+Datum
+macaddr6_eq(PG_FUNCTION_ARGS)
+{
+ macaddr6 *a1 = PG_GETARG_MACADDR6_P(0);
+ macaddr6 *a2 = PG_GETARG_MACADDR6_P(1);
+
+ PG_RETURN_BOOL(macaddr6_cmp_internal(a1, a2) == 0);
+}
+
+Datum
+macaddr6_ge(PG_FUNCTION_ARGS)
+{
+ macaddr6 *a1 = PG_GETARG_MACADDR6_P(0);
+ macaddr6 *a2 = PG_GETARG_MACADDR6_P(1);
+
+ PG_RETURN_BOOL(macaddr6_cmp_internal(a1, a2) >= 0);
+}
+
+Datum
+macaddr6_gt(PG_FUNCTION_ARGS)
+{
+ macaddr6 *a1 = PG_GETARG_MACADDR6_P(0);
+ macaddr6 *a2 = PG_GETARG_MACADDR6_P(1);
+
+ PG_RETURN_BOOL(macaddr6_cmp_internal(a1, a2) > 0);
+}
+
+Datum
+macaddr6_ne(PG_FUNCTION_ARGS)
+{
+ macaddr6 *a1 = PG_GETARG_MACADDR6_P(0);
+ macaddr6 *a2 = PG_GETARG_MACADDR6_P(1);
+
+ PG_RETURN_BOOL(macaddr6_cmp_internal(a1, a2) != 0);
+}
+
+/*
+ * Support function for hash indexes on macaddr6.
+ */
+Datum
+hashmacaddr6(PG_FUNCTION_ARGS)
+{
+ macaddr6 *key = PG_GETARG_MACADDR6_P(0);
+
+ return hash_any((unsigned char *) key, sizeof(macaddr6));
+}
+
+/*
+ * Arithmetic functions: bitwise NOT, AND, OR.
+ */
+Datum
+macaddr6_not(PG_FUNCTION_ARGS)
+{
+ macaddr6 *addr = PG_GETARG_MACADDR6_P(0);
+ macaddr6 *result;
+
+ result = (macaddr6 *) palloc(sizeof(macaddr6));
+ result->a = ~addr->a;
+ result->b = ~addr->b;
+ result->c = ~addr->c;
+ result->d = ~addr->d;
+ result->e = ~addr->e;
+ result->f = ~addr->f;
+ PG_RETURN_MACADDR6_P(result);
+}
+
+Datum
+macaddr6_and(PG_FUNCTION_ARGS)
+{
+ macaddr6 *addr1 = PG_GETARG_MACADDR6_P(0);
+ macaddr6 *addr2 = PG_GETARG_MACADDR6_P(1);
+ macaddr6 *result;
+
+ result = (macaddr6 *) palloc(sizeof(macaddr6));
+ result->a = addr1->a & addr2->a;
+ result->b = addr1->b & addr2->b;
+ result->c = addr1->c & addr2->c;
+ result->d = addr1->d & addr2->d;
+ result->e = addr1->e & addr2->e;
+ result->f = addr1->f & addr2->f;
+ PG_RETURN_MACADDR6_P(result);
+}
+
+Datum
+macaddr6_or(PG_FUNCTION_ARGS)
+{
+ macaddr6 *addr1 = PG_GETARG_MACADDR6_P(0);
+ macaddr6 *addr2 = PG_GETARG_MACADDR6_P(1);
+ macaddr6 *result;
+
+ result = (macaddr6 *) palloc(sizeof(macaddr6));
+ result->a = addr1->a | addr2->a;
+ result->b = addr1->b | addr2->b;
+ result->c = addr1->c | addr2->c;
+ result->d = addr1->d | addr2->d;
+ result->e = addr1->e | addr2->e;
+ result->f = addr1->f | addr2->f;
+ PG_RETURN_MACADDR6_P(result);
+}
+
+/*
+ * Truncation function to allow comparing mac manufacturers.
+ * From suggestion by Alex Pilosov <alex@pilosoft.com>
+ */
+Datum
+macaddr6_trunc(PG_FUNCTION_ARGS)
+{
+ macaddr6 *addr = PG_GETARG_MACADDR6_P(0);
+ macaddr6 *result;
+
+ result = (macaddr6 *) palloc(sizeof(macaddr6));
+
+ result->a = addr->a;
+ result->b = addr->b;
+ result->c = addr->c;
+ result->d = 0;
+ result->e = 0;
+ result->f = 0;
+
+ PG_RETURN_MACADDR6_P(result);
+}
diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c
index dbc557e..bde433b 100644
--- a/src/backend/utils/adt/network.c
+++ b/src/backend/utils/adt/network.c
@@ -924,9 +924,9 @@ convert_network_to_scalar(Datum value, Oid typid)
break;
}
- case MACADDROID:
+ case MACADDR6OID:
{
- macaddr *mac = DatumGetMacaddrP(value);
+ macaddr6 *mac = DatumGetMacaddr6P(value);
double res;
res = (mac->a << 16) | (mac->b << 8) | (mac->c);
@@ -934,6 +934,24 @@ convert_network_to_scalar(Datum value, Oid typid)
res += (mac->d << 16) | (mac->e << 8) | (mac->f);
return res;
}
+ case MACADDROID:
+ {
+ macaddr *mac = DatumGetMacaddrPP(value);
+ double res;
+ int size = MACADDR_SIZE(mac);
+
+ res = (MACADDR(mac)->data[0] << 16) | (MACADDR(mac)->data[1] << 8) | (MACADDR(mac)->data[2]);
+ res *= 256 * 256 * 256;
+ res += (MACADDR(mac)->data[3] << 16) | (MACADDR(mac)->data[4] << 8) | (MACADDR(mac)->data[5]);
+
+ if (size == 8)
+ {
+ res *= 256 * 256;
+ res += (MACADDR(mac)->data[6] << 8) | (MACADDR(mac)->data[7]);
+ }
+
+ return res;
+ }
}
/*
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 56943f2..46aa41e 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -3783,6 +3783,7 @@ convert_to_scalar(Datum value, Oid valuetypid, double *scaledvalue,
*/
case INETOID:
case CIDROID:
+ case MACADDR6OID:
case MACADDROID:
*scaledvalue = convert_network_to_scalar(value, valuetypid);
*scaledlobound = convert_network_to_scalar(lobound, boundstypid);
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index e4c3515..8b37dca 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -363,7 +363,7 @@ DATA(insert ( 1982 1186 1186 4 s 1335 403 0 ));
DATA(insert ( 1982 1186 1186 5 s 1334 403 0 ));
/*
- * btree macaddr
+ * btree macaddr6
*/
DATA(insert ( 1984 829 829 1 s 1222 403 0 ));
@@ -373,6 +373,16 @@ DATA(insert ( 1984 829 829 4 s 1225 403 0 ));
DATA(insert ( 1984 829 829 5 s 1224 403 0 ));
/*
+ * btree macaddr
+ */
+
+DATA(insert ( 3371 774 774 1 s 3364 403 0 ));
+DATA(insert ( 3371 774 774 2 s 3365 403 0 ));
+DATA(insert ( 3371 774 774 3 s 3362 403 0 ));
+DATA(insert ( 3371 774 774 4 s 3367 403 0 ));
+DATA(insert ( 3371 774 774 5 s 3366 403 0 ));
+
+/*
* btree network
*/
@@ -551,8 +561,10 @@ DATA(insert ( 1977 20 21 1 s 1868 405 0 ));
DATA(insert ( 1977 20 23 1 s 416 405 0 ));
/* interval_ops */
DATA(insert ( 1983 1186 1186 1 s 1330 405 0 ));
-/* macaddr_ops */
+/* macaddr6_ops */
DATA(insert ( 1985 829 829 1 s 1220 405 0 ));
+/* macaddr_ops */
+DATA(insert ( 3372 774 774 1 s 3362 405 0 ));
/* name_ops */
DATA(insert ( 1987 19 19 1 s 93 405 0 ));
/* oid_ops */
@@ -993,12 +1005,18 @@ DATA(insert ( 4073 703 703 2 s 570 3580 0 ));
DATA(insert ( 4073 703 703 3 s 566 3580 0 ));
DATA(insert ( 4073 703 703 4 s 571 3580 0 ));
DATA(insert ( 4073 703 703 5 s 569 3580 0 ));
-/* minmax macaddr */
+/* minmax macaddr6 */
DATA(insert ( 4074 829 829 1 s 1222 3580 0 ));
DATA(insert ( 4074 829 829 2 s 1223 3580 0 ));
DATA(insert ( 4074 829 829 3 s 1220 3580 0 ));
DATA(insert ( 4074 829 829 4 s 1225 3580 0 ));
DATA(insert ( 4074 829 829 5 s 1224 3580 0 ));
+/* minmax macaddr */
+DATA(insert ( 5002 774 774 1 s 3364 3580 0 ));
+DATA(insert ( 5002 774 774 2 s 3365 3580 0 ));
+DATA(insert ( 5002 774 774 3 s 3362 3580 0 ));
+DATA(insert ( 5002 774 774 4 s 3367 3580 0 ));
+DATA(insert ( 5002 774 774 5 s 3366 3580 0 ));
/* minmax inet */
DATA(insert ( 4075 869 869 1 s 1203 3580 0 ));
DATA(insert ( 4075 869 869 2 s 1204 3580 0 ));
diff --git a/src/include/catalog/pg_amproc.h b/src/include/catalog/pg_amproc.h
index f01a5b4..4bbe394 100644
--- a/src/include/catalog/pg_amproc.h
+++ b/src/include/catalog/pg_amproc.h
@@ -142,6 +142,7 @@ DATA(insert ( 2968 2950 2950 2 3300 ));
DATA(insert ( 2994 2249 2249 1 2987 ));
DATA(insert ( 3194 2249 2249 1 3187 ));
DATA(insert ( 3253 3220 3220 1 3251 ));
+DATA(insert ( 3371 774 774 1 3358 ));
DATA(insert ( 3522 3500 3500 1 3514 ));
DATA(insert ( 3626 3614 3614 1 3622 ));
DATA(insert ( 3683 3615 3615 1 3668 ));
@@ -182,6 +183,7 @@ DATA(insert ( 2231 1042 1042 1 1080 ));
DATA(insert ( 2235 1033 1033 1 329 ));
DATA(insert ( 2969 2950 2950 1 2963 ));
DATA(insert ( 3254 3220 3220 1 3252 ));
+DATA(insert ( 3372 774 774 1 328 ));
DATA(insert ( 3523 3500 3500 1 3515 ));
DATA(insert ( 3903 3831 3831 1 3902 ));
DATA(insert ( 4034 3802 3802 1 4045 ));
@@ -409,11 +411,16 @@ DATA(insert ( 4073 703 703 1 3383 ));
DATA(insert ( 4073 703 703 2 3384 ));
DATA(insert ( 4073 703 703 3 3385 ));
DATA(insert ( 4073 703 703 4 3386 ));
-/* minmax macaddr */
+/* minmax macaddr6 */
DATA(insert ( 4074 829 829 1 3383 ));
DATA(insert ( 4074 829 829 2 3384 ));
DATA(insert ( 4074 829 829 3 3385 ));
DATA(insert ( 4074 829 829 4 3386 ));
+/* minmax macaddr */
+DATA(insert ( 5002 774 774 1 3383 ));
+DATA(insert ( 5002 774 774 2 3384 ));
+DATA(insert ( 5002 774 774 3 3385 ));
+DATA(insert ( 5002 774 774 4 3386 ));
/* minmax inet */
DATA(insert ( 4075 869 869 1 3383 ));
DATA(insert ( 4075 869 869 2 3384 ));
diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h
index 04d11c0..74b4977 100644
--- a/src/include/catalog/pg_cast.h
+++ b/src/include/catalog/pg_cast.h
@@ -304,6 +304,11 @@ DATA(insert ( 718 603 1480 e f ));
DATA(insert ( 718 604 1544 e f ));
/*
+ * MAC address category
+ */
+DATA(insert ( 829 774 3373 i f ));
+
+/*
* INET category
*/
DATA(insert ( 650 869 0 i b ));
diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h
index ade8da3..a454a41 100644
--- a/src/include/catalog/pg_opclass.h
+++ b/src/include/catalog/pg_opclass.h
@@ -125,8 +125,10 @@ DATA(insert OID = 3124 ( 403 int8_ops PGNSP PGUID 1976 20 t 0 ));
DATA(insert ( 405 int8_ops PGNSP PGUID 1977 20 t 0 ));
DATA(insert ( 403 interval_ops PGNSP PGUID 1982 1186 t 0 ));
DATA(insert ( 405 interval_ops PGNSP PGUID 1983 1186 t 0 ));
-DATA(insert ( 403 macaddr_ops PGNSP PGUID 1984 829 t 0 ));
-DATA(insert ( 405 macaddr_ops PGNSP PGUID 1985 829 t 0 ));
+DATA(insert ( 403 macaddr6_ops PGNSP PGUID 1984 829 t 0 ));
+DATA(insert ( 405 macaddr6_ops PGNSP PGUID 1985 829 t 0 ));
+DATA(insert ( 403 macaddr_ops PGNSP PGUID 3371 774 t 0 ));
+DATA(insert ( 405 macaddr_ops PGNSP PGUID 3372 774 t 0 ));
/*
* Here's an ugly little hack to save space in the system catalog indexes.
* btree doesn't ordinarily allow a storage type different from input type;
@@ -223,7 +225,8 @@ DATA(insert ( 3580 float4_minmax_ops PGNSP PGUID 4070 700 t 700 ));
DATA(insert ( 3580 float8_minmax_ops PGNSP PGUID 4070 701 t 701 ));
DATA(insert ( 3580 abstime_minmax_ops PGNSP PGUID 4072 702 t 702 ));
DATA(insert ( 3580 reltime_minmax_ops PGNSP PGUID 4073 703 t 703 ));
-DATA(insert ( 3580 macaddr_minmax_ops PGNSP PGUID 4074 829 t 829 ));
+DATA(insert ( 3580 macaddr6_minmax_ops PGNSP PGUID 4074 829 t 829 ));
+DATA(insert ( 3580 macaddr_minmax_ops PGNSP PGUID 5002 774 t 774 ));
DATA(insert ( 3580 inet_minmax_ops PGNSP PGUID 4075 869 f 869 ));
DATA(insert ( 3580 inet_inclusion_ops PGNSP PGUID 4102 869 t 869 ));
DATA(insert ( 3580 bpchar_minmax_ops PGNSP PGUID 4076 1042 t 1042 ));
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index 26fa618..f551079 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -1113,25 +1113,46 @@ DESCR("equal");
DATA(insert OID = 1617 ( "#" PGNSP PGUID b f f 628 628 600 1617 0 line_interpt - - ));
DESCR("intersection point");
+/* MAC6 type */
+DATA(insert OID = 1220 ( "=" PGNSP PGUID b t t 829 829 16 1220 1221 macaddr6_eq eqsel eqjoinsel ));
+DESCR("equal");
+DATA(insert OID = 1221 ( "<>" PGNSP PGUID b f f 829 829 16 1221 1220 macaddr6_ne neqsel neqjoinsel ));
+DESCR("not equal");
+DATA(insert OID = 1222 ( "<" PGNSP PGUID b f f 829 829 16 1224 1225 macaddr6_lt scalarltsel scalarltjoinsel ));
+DESCR("less than");
+DATA(insert OID = 1223 ( "<=" PGNSP PGUID b f f 829 829 16 1225 1224 macaddr6_le scalarltsel scalarltjoinsel ));
+DESCR("less than or equal");
+DATA(insert OID = 1224 ( ">" PGNSP PGUID b f f 829 829 16 1222 1223 macaddr6_gt scalargtsel scalargtjoinsel ));
+DESCR("greater than");
+DATA(insert OID = 1225 ( ">=" PGNSP PGUID b f f 829 829 16 1223 1222 macaddr6_ge scalargtsel scalargtjoinsel ));
+DESCR("greater than or equal");
+
+DATA(insert OID = 3147 ( "~" PGNSP PGUID l f f 0 829 829 0 0 macaddr6_not - - ));
+DESCR("bitwise not");
+DATA(insert OID = 3148 ( "&" PGNSP PGUID b f f 829 829 829 0 0 macaddr6_and - - ));
+DESCR("bitwise and");
+DATA(insert OID = 3149 ( "|" PGNSP PGUID b f f 829 829 829 0 0 macaddr6_or - - ));
+DESCR("bitwise or");
+
/* MAC type */
-DATA(insert OID = 1220 ( "=" PGNSP PGUID b t t 829 829 16 1220 1221 macaddr_eq eqsel eqjoinsel ));
+DATA(insert OID = 3362 ( "=" PGNSP PGUID b t t 774 774 16 3362 3363 macaddr_eq eqsel eqjoinsel ));
DESCR("equal");
-DATA(insert OID = 1221 ( "<>" PGNSP PGUID b f f 829 829 16 1221 1220 macaddr_ne neqsel neqjoinsel ));
+DATA(insert OID = 3363 ( "<>" PGNSP PGUID b f f 774 774 16 3363 3362 macaddr_ne neqsel neqjoinsel ));
DESCR("not equal");
-DATA(insert OID = 1222 ( "<" PGNSP PGUID b f f 829 829 16 1224 1225 macaddr_lt scalarltsel scalarltjoinsel ));
+DATA(insert OID = 3364 ( "<" PGNSP PGUID b f f 774 774 16 3366 3367 macaddr_lt scalarltsel scalarltjoinsel ));
DESCR("less than");
-DATA(insert OID = 1223 ( "<=" PGNSP PGUID b f f 829 829 16 1225 1224 macaddr_le scalarltsel scalarltjoinsel ));
+DATA(insert OID = 3365 ( "<=" PGNSP PGUID b f f 774 774 16 3367 3366 macaddr_le scalarltsel scalarltjoinsel ));
DESCR("less than or equal");
-DATA(insert OID = 1224 ( ">" PGNSP PGUID b f f 829 829 16 1222 1223 macaddr_gt scalargtsel scalargtjoinsel ));
+DATA(insert OID = 3366 ( ">" PGNSP PGUID b f f 774 774 16 3364 3365 macaddr_gt scalargtsel scalargtjoinsel ));
DESCR("greater than");
-DATA(insert OID = 1225 ( ">=" PGNSP PGUID b f f 829 829 16 1223 1222 macaddr_ge scalargtsel scalargtjoinsel ));
+DATA(insert OID = 3367 ( ">=" PGNSP PGUID b f f 774 774 16 3365 3364 macaddr_ge scalargtsel scalargtjoinsel ));
DESCR("greater than or equal");
-DATA(insert OID = 3147 ( "~" PGNSP PGUID l f f 0 829 829 0 0 macaddr_not - - ));
+DATA(insert OID = 3368 ( "~" PGNSP PGUID l f f 0 774 774 0 0 macaddr_not - - ));
DESCR("bitwise not");
-DATA(insert OID = 3148 ( "&" PGNSP PGUID b f f 829 829 829 0 0 macaddr_and - - ));
+DATA(insert OID = 3369 ( "&" PGNSP PGUID b f f 774 774 774 0 0 macaddr_and - - ));
DESCR("bitwise and");
-DATA(insert OID = 3149 ( "|" PGNSP PGUID b f f 829 829 829 0 0 macaddr_or - - ));
+DATA(insert OID = 3370 ( "|" PGNSP PGUID b f f 774 774 774 0 0 macaddr_or - - ));
DESCR("bitwise or");
/* INET type (these also support CIDR via implicit cast) */
diff --git a/src/include/catalog/pg_opfamily.h b/src/include/catalog/pg_opfamily.h
index 7ba23e5..bc7df09 100644
--- a/src/include/catalog/pg_opfamily.h
+++ b/src/include/catalog/pg_opfamily.h
@@ -85,8 +85,10 @@ DATA(insert OID = 1976 ( 403 integer_ops PGNSP PGUID ));
DATA(insert OID = 1977 ( 405 integer_ops PGNSP PGUID ));
DATA(insert OID = 1982 ( 403 interval_ops PGNSP PGUID ));
DATA(insert OID = 1983 ( 405 interval_ops PGNSP PGUID ));
-DATA(insert OID = 1984 ( 403 macaddr_ops PGNSP PGUID ));
-DATA(insert OID = 1985 ( 405 macaddr_ops PGNSP PGUID ));
+DATA(insert OID = 1984 ( 403 macaddr6_ops PGNSP PGUID ));
+DATA(insert OID = 1985 ( 405 macaddr6_ops PGNSP PGUID ));
+DATA(insert OID = 3371 ( 403 macaddr_ops PGNSP PGUID ));
+DATA(insert OID = 3372 ( 405 macaddr_ops PGNSP PGUID ));
DATA(insert OID = 1986 ( 403 name_ops PGNSP PGUID ));
#define NAME_BTREE_FAM_OID 1986
DATA(insert OID = 1987 ( 405 name_ops PGNSP PGUID ));
@@ -170,7 +172,8 @@ DATA(insert OID = 4069 ( 3580 tid_minmax_ops PGNSP PGUID ));
DATA(insert OID = 4070 ( 3580 float_minmax_ops PGNSP PGUID ));
DATA(insert OID = 4072 ( 3580 abstime_minmax_ops PGNSP PGUID ));
DATA(insert OID = 4073 ( 3580 reltime_minmax_ops PGNSP PGUID ));
-DATA(insert OID = 4074 ( 3580 macaddr_minmax_ops PGNSP PGUID ));
+DATA(insert OID = 4074 ( 3580 macaddr6_minmax_ops PGNSP PGUID ));
+DATA(insert OID = 5002 ( 3580 macaddr_minmax_ops PGNSP PGUID ));
DATA(insert OID = 4075 ( 3580 network_minmax_ops PGNSP PGUID ));
DATA(insert OID = 4102 ( 3580 network_inclusion_ops PGNSP PGUID ));
DATA(insert OID = 4076 ( 3580 bpchar_minmax_ops PGNSP PGUID ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 17ec71d..99e97f1 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -686,12 +686,14 @@ DATA(insert OID = 457 ( hashoidvector PGNSP PGUID 12 1 0 0 0 f f f f t f i s
DESCR("hash");
DATA(insert OID = 329 ( hash_aclitem PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "1033" _null_ _null_ _null_ _null_ _null_ hash_aclitem _null_ _null_ _null_ ));
DESCR("hash");
-DATA(insert OID = 399 ( hashmacaddr PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "829" _null_ _null_ _null_ _null_ _null_ hashmacaddr _null_ _null_ _null_ ));
+DATA(insert OID = 399 ( hashmacaddr6 PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "829" _null_ _null_ _null_ _null_ _null_ hashmacaddr6 _null_ _null_ _null_ ));
DESCR("hash");
DATA(insert OID = 422 ( hashinet PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "869" _null_ _null_ _null_ _null_ _null_ hashinet _null_ _null_ _null_ ));
DESCR("hash");
DATA(insert OID = 432 ( hash_numeric PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "1700" _null_ _null_ _null_ _null_ _null_ hash_numeric _null_ _null_ _null_ ));
DESCR("hash");
+DATA(insert OID = 328 ( hashmacaddr PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 23 "774" _null_ _null_ _null_ _null_ _null_ hashmacaddr _null_ _null_ _null_ ));
+DESCR("hash");
DATA(insert OID = 438 ( num_nulls PGNSP PGUID 12 1 0 2276 0 f f f f f f i s 1 0 23 "2276" "{2276}" "{v}" _null_ _null_ _null_ pg_num_nulls _null_ _null_ _null_ ));
DESCR("count the number of NULL arguments");
@@ -2090,26 +2092,49 @@ DESCR("get bit");
DATA(insert OID = 3033 ( set_bit PGNSP PGUID 12 1 0 0 0 f f f f t f i s 3 0 1560 "1560 23 23" _null_ _null_ _null_ _null_ _null_ bitsetbit _null_ _null_ _null_ ));
DESCR("set bit");
-/* for mac type support */
-DATA(insert OID = 436 ( macaddr_in PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 829 "2275" _null_ _null_ _null_ _null_ _null_ macaddr_in _null_ _null_ _null_ ));
+/* for macaddr6 type support */
+DATA(insert OID = 436 ( macaddr6_in PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 829 "2275" _null_ _null_ _null_ _null_ _null_ macaddr6_in _null_ _null_ _null_ ));
DESCR("I/O");
-DATA(insert OID = 437 ( macaddr_out PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2275 "829" _null_ _null_ _null_ _null_ _null_ macaddr_out _null_ _null_ _null_ ));
+DATA(insert OID = 437 ( macaddr6_out PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2275 "829" _null_ _null_ _null_ _null_ _null_ macaddr6_out _null_ _null_ _null_ ));
DESCR("I/O");
-DATA(insert OID = 753 ( trunc PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 829 "829" _null_ _null_ _null_ _null_ _null_ macaddr_trunc _null_ _null_ _null_ ));
-DESCR("MAC manufacturer fields");
+DATA(insert OID = 753 ( trunc PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 829 "829" _null_ _null_ _null_ _null_ _null_ macaddr6_trunc _null_ _null_ _null_ ));
+DESCR("MACADDR6 manufacturer fields");
-DATA(insert OID = 830 ( macaddr_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_eq _null_ _null_ _null_ ));
-DATA(insert OID = 831 ( macaddr_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_lt _null_ _null_ _null_ ));
-DATA(insert OID = 832 ( macaddr_le PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_le _null_ _null_ _null_ ));
-DATA(insert OID = 833 ( macaddr_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_gt _null_ _null_ _null_ ));
-DATA(insert OID = 834 ( macaddr_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_ge _null_ _null_ _null_ ));
-DATA(insert OID = 835 ( macaddr_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_ne _null_ _null_ _null_ ));
-DATA(insert OID = 836 ( macaddr_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 23 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_cmp _null_ _null_ _null_ ));
+DATA(insert OID = 830 ( macaddr6_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr6_eq _null_ _null_ _null_ ));
+DATA(insert OID = 831 ( macaddr6_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr6_lt _null_ _null_ _null_ ));
+DATA(insert OID = 832 ( macaddr6_le PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr6_le _null_ _null_ _null_ ));
+DATA(insert OID = 833 ( macaddr6_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr6_gt _null_ _null_ _null_ ));
+DATA(insert OID = 834 ( macaddr6_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr6_ge _null_ _null_ _null_ ));
+DATA(insert OID = 835 ( macaddr6_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr6_ne _null_ _null_ _null_ ));
+DATA(insert OID = 836 ( macaddr6_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 23 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr6_cmp _null_ _null_ _null_ ));
DESCR("less-equal-greater");
-DATA(insert OID = 3144 ( macaddr_not PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 829 "829" _null_ _null_ _null_ _null_ _null_ macaddr_not _null_ _null_ _null_ ));
-DATA(insert OID = 3145 ( macaddr_and PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 829 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_and _null_ _null_ _null_ ));
-DATA(insert OID = 3146 ( macaddr_or PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 829 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_or _null_ _null_ _null_ ));
+DATA(insert OID = 3144 ( macaddr6_not PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 829 "829" _null_ _null_ _null_ _null_ _null_ macaddr6_not _null_ _null_ _null_ ));
+DATA(insert OID = 3145 ( macaddr6_and PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 829 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr6_and _null_ _null_ _null_ ));
+DATA(insert OID = 3146 ( macaddr6_or PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 829 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr6_or _null_ _null_ _null_ ));
+
+/* for macaddr type support */
+DATA(insert OID = 3349 ( macaddr_in PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "2275" _null_ _null_ _null_ _null_ _null_ macaddr_in _null_ _null_ _null_ ));
+DESCR("I/O");
+DATA(insert OID = 3350 ( macaddr_out PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2275 "774" _null_ _null_ _null_ _null_ _null_ macaddr_out _null_ _null_ _null_ ));
+DESCR("I/O");
+
+DATA(insert OID = 3351 ( trunc PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "774" _null_ _null_ _null_ _null_ _null_ macaddr_trunc _null_ _null_ _null_ ));
+DESCR("MACADDR manufacturer fields");
+
+DATA(insert OID = 3352 ( macaddr_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr_eq _null_ _null_ _null_ ));
+DATA(insert OID = 3353 ( macaddr_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr_lt _null_ _null_ _null_ ));
+DATA(insert OID = 3354 ( macaddr_le PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr_le _null_ _null_ _null_ ));
+DATA(insert OID = 3355 ( macaddr_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr_gt _null_ _null_ _null_ ));
+DATA(insert OID = 3356 ( macaddr_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr_ge _null_ _null_ _null_ ));
+DATA(insert OID = 3357 ( macaddr_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i s 2 0 16 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr_ne _null_ _null_ _null_ ));
+DATA(insert OID = 3358 ( macaddr_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 23 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr_cmp _null_ _null_ _null_ ));
+DESCR("less-equal-greater");
+DATA(insert OID = 3359 ( macaddr_not PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "774" _null_ _null_ _null_ _null_ _null_ macaddr_not _null_ _null_ _null_ ));
+DATA(insert OID = 3360 ( macaddr_and PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 774 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr_and _null_ _null_ _null_ ));
+DATA(insert OID = 3361 ( macaddr_or PGNSP PGUID 12 1 0 0 0 f f f f t f i s 2 0 774 "774 774" _null_ _null_ _null_ _null_ _null_ macaddr_or _null_ _null_ _null_ ));
+DATA(insert OID = 3373 ( macaddr PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "829" _null_ _null_ _null_ _null_ _null_ mac6tomac _null_ _null_ _null_ ));
+DESCR("convert macaddr6 to macaddr");
/* for inet type support */
DATA(insert OID = 910 ( inet_in PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 869 "2275" _null_ _null_ _null_ _null_ _null_ inet_in _null_ _null_ _null_ ));
@@ -4016,9 +4041,9 @@ DATA(insert OID = 2492 ( cash_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i s
DESCR("I/O");
DATA(insert OID = 2493 ( cash_send PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 17 "790" _null_ _null_ _null_ _null_ _null_ cash_send _null_ _null_ _null_ ));
DESCR("I/O");
-DATA(insert OID = 2494 ( macaddr_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 829 "2281" _null_ _null_ _null_ _null_ _null_ macaddr_recv _null_ _null_ _null_ ));
+DATA(insert OID = 2494 ( macaddr6_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 829 "2281" _null_ _null_ _null_ _null_ _null_ macaddr6_recv _null_ _null_ _null_ ));
DESCR("I/O");
-DATA(insert OID = 2495 ( macaddr_send PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 17 "829" _null_ _null_ _null_ _null_ _null_ macaddr_send _null_ _null_ _null_ ));
+DATA(insert OID = 2495 ( macaddr6_send PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 17 "829" _null_ _null_ _null_ _null_ _null_ macaddr6_send _null_ _null_ _null_ ));
DESCR("I/O");
DATA(insert OID = 2496 ( inet_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 869 "2281" _null_ _null_ _null_ _null_ _null_ inet_recv _null_ _null_ _null_ ));
DESCR("I/O");
@@ -4040,6 +4065,10 @@ DATA(insert OID = 3120 ( void_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i s
DESCR("I/O");
DATA(insert OID = 3121 ( void_send PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 17 "2278" _null_ _null_ _null_ _null_ _null_ void_send _null_ _null_ _null_ ));
DESCR("I/O");
+DATA(insert OID = 3344 ( macaddr_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 774 "2281" _null_ _null_ _null_ _null_ _null_ macaddr_recv _null_ _null_ _null_ ));
+DESCR("I/O");
+DATA(insert OID = 3345 ( macaddr_send PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 17 "774" _null_ _null_ _null_ _null_ _null_ macaddr_send _null_ _null_ _null_ ));
+DESCR("I/O");
/* System-view support functions with pretty-print option */
DATA(insert OID = 2504 ( pg_get_ruledef PGNSP PGUID 12 1 0 0 0 f f f f t f s s 2 0 25 "26 16" _null_ _null_ _null_ _null_ _null_ pg_get_ruledef_ext _null_ _null_ _null_ ));
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 162239c..5faadaa 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -432,18 +432,22 @@ DESCR("monetary amounts, $d,ddd.cc");
DATA(insert OID = 791 ( _money PGNSP PGUID -1 f b A f t \054 0 790 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));
/* OIDS 800 - 899 */
-DATA(insert OID = 829 ( macaddr PGNSP PGUID 6 f b U f t \054 0 0 1040 macaddr_in macaddr_out macaddr_recv macaddr_send - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));
+DATA(insert OID = 829 ( macaddr6 PGNSP PGUID 6 f b U f t \054 0 0 1040 macaddr6_in macaddr6_out macaddr6_recv macaddr6_send - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));
DESCR("XX:XX:XX:XX:XX:XX, MAC address");
-#define MACADDROID 829
+#define MACADDR6OID 829
DATA(insert OID = 869 ( inet PGNSP PGUID -1 f b I t t \054 0 0 1041 inet_in inet_out inet_recv inet_send - - - i m f 0 -1 0 0 _null_ _null_ _null_ ));
DESCR("IP address/netmask, host address, netmask optional");
#define INETOID 869
DATA(insert OID = 650 ( cidr PGNSP PGUID -1 f b I f t \054 0 0 651 cidr_in cidr_out cidr_recv cidr_send - - - i m f 0 -1 0 0 _null_ _null_ _null_ ));
DESCR("network IP address/netmask, network address");
#define CIDROID 650
+DATA(insert OID = 774 ( macaddr PGNSP PGUID -1 f b U f t \054 0 0 775 macaddr_in macaddr_out macaddr_recv macaddr_send - - - i m f 0 -1 0 0 _null_ _null_ _null_ ));
+DESCR("XX:XX:XX:XX:XX:XX:XX:XX, MAC address");
+#define MACADDROID 972
/* OIDS 900 - 999 */
+
/* OIDS 1000 - 1099 */
DATA(insert OID = 1000 ( _bool PGNSP PGUID -1 f b A f t \054 0 16 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
DATA(insert OID = 1001 ( _bytea PGNSP PGUID -1 f b A f t \054 0 17 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
@@ -481,7 +485,8 @@ DATA(insert OID = 1033 ( aclitem PGNSP PGUID 12 f b U f t \054 0 0 1034 aclite
DESCR("access control list");
#define ACLITEMOID 1033
DATA(insert OID = 1034 ( _aclitem PGNSP PGUID -1 f b A f t \054 0 1033 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
-DATA(insert OID = 1040 ( _macaddr PGNSP PGUID -1 f b A f t \054 0 829 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
+DATA(insert OID = 1040 ( _macaddr6 PGNSP PGUID -1 f b A f t \054 0 829 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
+DATA(insert OID = 775 ( _macaddr PGNSP PGUID -1 f b A f t \054 0 774 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
DATA(insert OID = 1041 ( _inet PGNSP PGUID -1 f b A f t \054 0 869 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
DATA(insert OID = 651 ( _cidr PGNSP PGUID -1 f b A f t \054 0 650 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
DATA(insert OID = 1263 ( _cstring PGNSP PGUID -1 f b A f t \054 0 2275 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 90f5132..39849c3 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -1020,6 +1020,25 @@ extern Datum macaddr_and(PG_FUNCTION_ARGS);
extern Datum macaddr_or(PG_FUNCTION_ARGS);
extern Datum macaddr_trunc(PG_FUNCTION_ARGS);
extern Datum hashmacaddr(PG_FUNCTION_ARGS);
+extern Datum mac6tomac(PG_FUNCTION_ARGS);
+
+/* mac6.c */
+extern Datum macaddr6_in(PG_FUNCTION_ARGS);
+extern Datum macaddr6_out(PG_FUNCTION_ARGS);
+extern Datum macaddr6_recv(PG_FUNCTION_ARGS);
+extern Datum macaddr6_send(PG_FUNCTION_ARGS);
+extern Datum macaddr6_cmp(PG_FUNCTION_ARGS);
+extern Datum macaddr6_lt(PG_FUNCTION_ARGS);
+extern Datum macaddr6_le(PG_FUNCTION_ARGS);
+extern Datum macaddr6_eq(PG_FUNCTION_ARGS);
+extern Datum macaddr6_ge(PG_FUNCTION_ARGS);
+extern Datum macaddr6_gt(PG_FUNCTION_ARGS);
+extern Datum macaddr6_ne(PG_FUNCTION_ARGS);
+extern Datum macaddr6_not(PG_FUNCTION_ARGS);
+extern Datum macaddr6_and(PG_FUNCTION_ARGS);
+extern Datum macaddr6_or(PG_FUNCTION_ARGS);
+extern Datum macaddr6_trunc(PG_FUNCTION_ARGS);
+extern Datum hashmacaddr6(PG_FUNCTION_ARGS);
/* numeric.c */
extern Datum numeric_in(PG_FUNCTION_ARGS);
diff --git a/src/include/utils/inet.h b/src/include/utils/inet.h
index 9fd954d..b203e51 100644
--- a/src/include/utils/inet.h
+++ b/src/include/utils/inet.h
@@ -91,7 +91,7 @@ typedef struct
/*
* This is the internal storage format for MAC addresses:
*/
-typedef struct macaddr
+typedef struct macaddr6
{
unsigned char a;
unsigned char b;
@@ -99,6 +99,20 @@ typedef struct macaddr
unsigned char d;
unsigned char e;
unsigned char f;
+} macaddr6;
+
+typedef struct mac_struct
+{
+ unsigned char data[8]; /* Max storage of 8 byte MAC address */
+}mac_struct;
+
+/*
+ * This is the internal storage format for MAC addresses (EUI-48 & EUI-64):
+ */
+typedef struct macaddr
+{
+ char vl_len_[4]; /* Do not touch this field directly! */
+ mac_struct addr;
} macaddr;
/*
@@ -110,12 +124,26 @@ typedef struct macaddr
#define PG_GETARG_INET_P(n) DatumGetInetP(PG_GETARG_DATUM(n))
#define PG_GETARG_INET_PP(n) DatumGetInetPP(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))
+
+/* macaddr6 is a fixed-length pass-by-reference datatype */
+#define DatumGetMacaddr6P(X) ((macaddr6 *) DatumGetPointer(X))
+#define Macaddr6PGetDatum(X) PointerGetDatum(X)
+#define PG_GETARG_MACADDR6_P(n) DatumGetMacaddr6P(PG_GETARG_DATUM(n))
+#define PG_RETURN_MACADDR6_P(x) return Macaddr6PGetDatum(x)
+
+/* macaddr is a variable length datatype */
+#define DatumGetMacaddrP(X) ((macaddr *) PG_DETOAST_DATUM(X))
+#define DatumGetMacaddrPP(X) ((macaddr *) PG_DETOAST_DATUM_PACKED(X))
#define MacaddrPGetDatum(X) PointerGetDatum(X)
#define PG_GETARG_MACADDR_P(n) DatumGetMacaddrP(PG_GETARG_DATUM(n))
+#define PG_GETARG_MACADDR_PP(n) DatumGetMacaddrPP(PG_GETARG_DATUM(n))
#define PG_RETURN_MACADDR_P(x) return MacaddrPGetDatum(x)
+/* macaddr supported macros */
+#define SET_MACADDR_VARSIZE(dst, size) SET_VARSIZE((dst), VARHDRSZ + (size))
+#define MACADDR(ptr) ((mac_struct *)VARDATA_ANY(ptr))
+#define MACADDR_SIZE(ptr) (VARSIZE_ANY_EXHDR(ptr))
+
/*
* Support functions in network.c
*/
diff --git a/src/test/regress/expected/macaddr.out b/src/test/regress/expected/macaddr.out
index e84ff5f..63ad959 100644
--- a/src/test/regress/expected/macaddr.out
+++ b/src/test/regress/expected/macaddr.out
@@ -22,9 +22,15 @@ INSERT INTO macaddr_data VALUES (11, '08:00:2b:01:02:02');
INSERT INTO macaddr_data VALUES (12, '08:00:2a:01:02:03');
INSERT INTO macaddr_data VALUES (13, '08:00:2c:01:02:03');
INSERT INTO macaddr_data VALUES (14, '08:00:2a:01:02:04');
+INSERT INTO macaddr_data VALUES (15, '08:00:2b:01:02:03:04:05');
+INSERT INTO macaddr_data VALUES (16, '08-00-2b-01-02-03-04-05');
+INSERT INTO macaddr_data VALUES (17, '08002b:0102030405');
+INSERT INTO macaddr_data VALUES (18, '08002b-0102030405');
+INSERT INTO macaddr_data VALUES (19, '0800.2b01.0203.0405');
+INSERT INTO macaddr_data VALUES (20, '08002b0102030405');
SELECT * FROM macaddr_data;
- a | b
-----+-------------------
+ a | b
+----+-------------------------
1 | 08:00:2b:01:02:03
2 | 08:00:2b:01:02:03
3 | 08:00:2b:01:02:03
@@ -37,27 +43,39 @@ SELECT * FROM macaddr_data;
12 | 08:00:2a:01:02:03
13 | 08:00:2c:01:02:03
14 | 08:00:2a:01:02:04
-(12 rows)
+ 15 | 08:00:2b:01:02:03:04:05
+ 16 | 08:00:2b:01:02:03:04:05
+ 17 | 08:00:2b:01:02:03:04:05
+ 18 | 08:00:2b:01:02:03:04:05
+ 19 | 08:00:2b:01:02:03:04:05
+ 20 | 08:00:2b:01:02:03:04:05
+(18 rows)
CREATE INDEX macaddr_data_btree ON macaddr_data USING btree (b);
CREATE INDEX macaddr_data_hash ON macaddr_data USING hash (b);
WARNING: hash indexes are not WAL-logged and their use is discouraged
SELECT a, b, trunc(b) FROM macaddr_data ORDER BY 2, 1;
- a | b | trunc
-----+-------------------+-------------------
- 12 | 08:00:2a:01:02:03 | 08:00:2a:00:00:00
- 14 | 08:00:2a:01:02:04 | 08:00:2a:00:00:00
- 11 | 08:00:2b:01:02:02 | 08:00:2b:00:00:00
- 1 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
- 2 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
- 3 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
- 4 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
- 5 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
- 6 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
- 7 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
- 10 | 08:00:2b:01:02:04 | 08:00:2b:00:00:00
- 13 | 08:00:2c:01:02:03 | 08:00:2c:00:00:00
-(12 rows)
+ a | b | trunc
+----+-------------------------+-------------------------
+ 12 | 08:00:2a:01:02:03 | 08:00:2a:00:00:00
+ 14 | 08:00:2a:01:02:04 | 08:00:2a:00:00:00
+ 11 | 08:00:2b:01:02:02 | 08:00:2b:00:00:00
+ 1 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
+ 2 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
+ 3 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
+ 4 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
+ 5 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
+ 6 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
+ 7 | 08:00:2b:01:02:03 | 08:00:2b:00:00:00
+ 15 | 08:00:2b:01:02:03:04:05 | 08:00:2b:00:00:00:00:00
+ 16 | 08:00:2b:01:02:03:04:05 | 08:00:2b:00:00:00:00:00
+ 17 | 08:00:2b:01:02:03:04:05 | 08:00:2b:00:00:00:00:00
+ 18 | 08:00:2b:01:02:03:04:05 | 08:00:2b:00:00:00:00:00
+ 19 | 08:00:2b:01:02:03:04:05 | 08:00:2b:00:00:00:00:00
+ 20 | 08:00:2b:01:02:03:04:05 | 08:00:2b:00:00:00:00:00
+ 10 | 08:00:2b:01:02:04 | 08:00:2b:00:00:00
+ 13 | 08:00:2c:01:02:03 | 08:00:2c:00:00:00
+(18 rows)
SELECT b < '08:00:2b:01:02:04' FROM macaddr_data WHERE a = 1; -- true
?column?
@@ -107,9 +125,57 @@ SELECT b <> '08:00:2b:01:02:03' FROM macaddr_data WHERE a = 1; -- false
f
(1 row)
+SELECT b < '08:00:2b:01:02:03:04:06' FROM macaddr_data WHERE a = 15; -- true
+ ?column?
+----------
+ t
+(1 row)
+
+SELECT b > '08:00:2b:01:02:03:04:06' FROM macaddr_data WHERE a = 15; -- false
+ ?column?
+----------
+ f
+(1 row)
+
+SELECT b > '08:00:2b:01:02:03:04:05' FROM macaddr_data WHERE a = 15; -- false
+ ?column?
+----------
+ f
+(1 row)
+
+SELECT b <= '08:00:2b:01:02:03:04:06' FROM macaddr_data WHERE a = 15; -- true
+ ?column?
+----------
+ t
+(1 row)
+
+SELECT b >= '08:00:2b:01:02:03:04:06' FROM macaddr_data WHERE a = 15; -- false
+ ?column?
+----------
+ f
+(1 row)
+
+SELECT b = '08:00:2b:01:02:03:04:05' FROM macaddr_data WHERE a = 15; -- true
+ ?column?
+----------
+ t
+(1 row)
+
+SELECT b <> '08:00:2b:01:02:03:04:06' FROM macaddr_data WHERE a = 15; -- true
+ ?column?
+----------
+ t
+(1 row)
+
+SELECT b <> '08:00:2b:01:02:03:04:05' FROM macaddr_data WHERE a = 15; -- false
+ ?column?
+----------
+ f
+(1 row)
+
SELECT ~b FROM macaddr_data;
- ?column?
--------------------
+ ?column?
+-------------------------
f7:ff:d4:fe:fd:fc
f7:ff:d4:fe:fd:fc
f7:ff:d4:fe:fd:fc
@@ -122,11 +188,17 @@ SELECT ~b FROM macaddr_data;
f7:ff:d5:fe:fd:fc
f7:ff:d3:fe:fd:fc
f7:ff:d5:fe:fd:fb
-(12 rows)
+ f7:ff:d4:fe:fd:fc:fb:fa
+ f7:ff:d4:fe:fd:fc:fb:fa
+ f7:ff:d4:fe:fd:fc:fb:fa
+ f7:ff:d4:fe:fd:fc:fb:fa
+ f7:ff:d4:fe:fd:fc:fb:fa
+ f7:ff:d4:fe:fd:fc:fb:fa
+(18 rows)
SELECT b & '00:00:00:ff:ff:ff' FROM macaddr_data;
- ?column?
--------------------
+ ?column?
+-------------------------
00:00:00:01:02:03
00:00:00:01:02:03
00:00:00:01:02:03
@@ -139,11 +211,17 @@ SELECT b & '00:00:00:ff:ff:ff' FROM macaddr_data;
00:00:00:01:02:03
00:00:00:01:02:03
00:00:00:01:02:04
-(12 rows)
+ 00:00:00:01:02:03:00:00
+ 00:00:00:01:02:03:00:00
+ 00:00:00:01:02:03:00:00
+ 00:00:00:01:02:03:00:00
+ 00:00:00:01:02:03:00:00
+ 00:00:00:01:02:03:00:00
+(18 rows)
SELECT b | '01:02:03:04:05:06' FROM macaddr_data;
- ?column?
--------------------
+ ?column?
+-------------------------
09:02:2b:05:07:07
09:02:2b:05:07:07
09:02:2b:05:07:07
@@ -156,6 +234,12 @@ SELECT b | '01:02:03:04:05:06' FROM macaddr_data;
09:02:2b:05:07:07
09:02:2f:05:07:07
09:02:2b:05:07:06
-(12 rows)
+ 09:02:2b:05:07:07:04:05
+ 09:02:2b:05:07:07:04:05
+ 09:02:2b:05:07:07:04:05
+ 09:02:2b:05:07:07:04:05
+ 09:02:2b:05:07:07:04:05
+ 09:02:2b:05:07:07:04:05
+(18 rows)
DROP TABLE macaddr_data;
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 0bcec13..16e79a8 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -561,12 +561,12 @@ tintervallt(tinterval,tinterval)
tintervalgt(tinterval,tinterval)
tintervalle(tinterval,tinterval)
tintervalge(tinterval,tinterval)
-macaddr_eq(macaddr,macaddr)
-macaddr_lt(macaddr,macaddr)
-macaddr_le(macaddr,macaddr)
-macaddr_gt(macaddr,macaddr)
-macaddr_ge(macaddr,macaddr)
-macaddr_ne(macaddr,macaddr)
+macaddr6_eq(macaddr6,macaddr6)
+macaddr6_lt(macaddr6,macaddr6)
+macaddr6_le(macaddr6,macaddr6)
+macaddr6_gt(macaddr6,macaddr6)
+macaddr6_ge(macaddr6,macaddr6)
+macaddr6_ne(macaddr6,macaddr6)
int48eq(integer,bigint)
int48ne(integer,bigint)
int48lt(integer,bigint)
@@ -685,6 +685,12 @@ uuid_gt(uuid,uuid)
uuid_ne(uuid,uuid)
xidneq(xid,xid)
xidneqint4(xid,integer)
+macaddr_eq(macaddr,macaddr)
+macaddr_lt(macaddr,macaddr)
+macaddr_le(macaddr,macaddr)
+macaddr_gt(macaddr,macaddr)
+macaddr_ge(macaddr,macaddr)
+macaddr_ne(macaddr,macaddr)
-- restore normal output mode
\a\t
-- List of functions used by libpq's fe-lobj.c
diff --git a/src/test/regress/sql/macaddr.sql b/src/test/regress/sql/macaddr.sql
index 7bad8f5..173c978 100644
--- a/src/test/regress/sql/macaddr.sql
+++ b/src/test/regress/sql/macaddr.sql
@@ -20,6 +20,14 @@ INSERT INTO macaddr_data VALUES (12, '08:00:2a:01:02:03');
INSERT INTO macaddr_data VALUES (13, '08:00:2c:01:02:03');
INSERT INTO macaddr_data VALUES (14, '08:00:2a:01:02:04');
+INSERT INTO macaddr_data VALUES (15, '08:00:2b:01:02:03:04:05');
+INSERT INTO macaddr_data VALUES (16, '08-00-2b-01-02-03-04-05');
+INSERT INTO macaddr_data VALUES (17, '08002b:0102030405');
+INSERT INTO macaddr_data VALUES (18, '08002b-0102030405');
+INSERT INTO macaddr_data VALUES (19, '0800.2b01.0203.0405');
+INSERT INTO macaddr_data VALUES (20, '08002b0102030405');
+
+
SELECT * FROM macaddr_data;
CREATE INDEX macaddr_data_btree ON macaddr_data USING btree (b);
@@ -36,6 +44,15 @@ SELECT b = '08:00:2b:01:02:03' FROM macaddr_data WHERE a = 1; -- true
SELECT b <> '08:00:2b:01:02:04' FROM macaddr_data WHERE a = 1; -- true
SELECT b <> '08:00:2b:01:02:03' FROM macaddr_data WHERE a = 1; -- false
+SELECT b < '08:00:2b:01:02:03:04:06' FROM macaddr_data WHERE a = 15; -- true
+SELECT b > '08:00:2b:01:02:03:04:06' FROM macaddr_data WHERE a = 15; -- false
+SELECT b > '08:00:2b:01:02:03:04:05' FROM macaddr_data WHERE a = 15; -- false
+SELECT b <= '08:00:2b:01:02:03:04:06' FROM macaddr_data WHERE a = 15; -- true
+SELECT b >= '08:00:2b:01:02:03:04:06' FROM macaddr_data WHERE a = 15; -- false
+SELECT b = '08:00:2b:01:02:03:04:05' FROM macaddr_data WHERE a = 15; -- true
+SELECT b <> '08:00:2b:01:02:03:04:06' FROM macaddr_data WHERE a = 15; -- true
+SELECT b <> '08:00:2b:01:02:03:04:05' FROM macaddr_data WHERE a = 15; -- false
+
SELECT ~b FROM macaddr_data;
SELECT b & '00:00:00:ff:ff:ff' FROM macaddr_data;
SELECT b | '01:02:03:04:05:06' FROM macaddr_data;