1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-17 06:41:09 +03:00

Add bitwise AND, OR, and NOT operators for macaddr data type.

Brendan Jurd, reviewed by Fujii Masao
This commit is contained in:
Robert Haas
2012-01-19 15:23:04 -05:00
parent 4f42b546fd
commit cc53a1e7cc
8 changed files with 122 additions and 2 deletions

View File

@ -241,6 +241,59 @@ hashmacaddr(PG_FUNCTION_ARGS)
return hash_any((unsigned char *) key, sizeof(macaddr));
}
/*
* Arithmetic functions: bitwise NOT, AND, OR.
*/
Datum
macaddr_not(PG_FUNCTION_ARGS)
{
macaddr *addr = PG_GETARG_MACADDR_P(0);
macaddr *result;
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;
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 *result;
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;
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 *result;
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;
PG_RETURN_MACADDR_P(result);
}
/*
* Truncation function to allow comparing mac manufacturers.
* From suggestion by Alex Pilosov <alex@pilosoft.com>