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:
@ -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>
|
||||
|
Reference in New Issue
Block a user