@@ -241,6 +241,59 @@ hashmacaddr(PG_FUNCTION_ARGS)
241241 return hash_any ((unsigned char * ) key , sizeof (macaddr ));
242242}
243243
244+ /*
245+ * Arithmetic functions: bitwise NOT, AND, OR.
246+ */
247+ Datum
248+ macaddr_not (PG_FUNCTION_ARGS )
249+ {
250+ macaddr * addr = PG_GETARG_MACADDR_P (0 );
251+ macaddr * result ;
252+
253+ result = (macaddr * ) palloc (sizeof (macaddr ));
254+ result -> a = ~addr -> a ;
255+ result -> b = ~addr -> b ;
256+ result -> c = ~addr -> c ;
257+ result -> d = ~addr -> d ;
258+ result -> e = ~addr -> e ;
259+ result -> f = ~addr -> f ;
260+ PG_RETURN_MACADDR_P (result );
261+ }
262+
263+ Datum
264+ macaddr_and (PG_FUNCTION_ARGS )
265+ {
266+ macaddr * addr1 = PG_GETARG_MACADDR_P (0 );
267+ macaddr * addr2 = PG_GETARG_MACADDR_P (1 );
268+ macaddr * result ;
269+
270+ result = (macaddr * ) palloc (sizeof (macaddr ));
271+ result -> a = addr1 -> a & addr2 -> a ;
272+ result -> b = addr1 -> b & addr2 -> b ;
273+ result -> c = addr1 -> c & addr2 -> c ;
274+ result -> d = addr1 -> d & addr2 -> d ;
275+ result -> e = addr1 -> e & addr2 -> e ;
276+ result -> f = addr1 -> f & addr2 -> f ;
277+ PG_RETURN_MACADDR_P (result );
278+ }
279+
280+ Datum
281+ macaddr_or (PG_FUNCTION_ARGS )
282+ {
283+ macaddr * addr1 = PG_GETARG_MACADDR_P (0 );
284+ macaddr * addr2 = PG_GETARG_MACADDR_P (1 );
285+ macaddr * result ;
286+
287+ result = (macaddr * ) palloc (sizeof (macaddr ));
288+ result -> a = addr1 -> a | addr2 -> a ;
289+ result -> b = addr1 -> b | addr2 -> b ;
290+ result -> c = addr1 -> c | addr2 -> c ;
291+ result -> d = addr1 -> d | addr2 -> d ;
292+ result -> e = addr1 -> e | addr2 -> e ;
293+ result -> f = addr1 -> f | addr2 -> f ;
294+ PG_RETURN_MACADDR_P (result );
295+ }
296+
244297/*
245298 * Truncation function to allow comparing mac manufacturers.
246299 * From suggestion by Alex Pilosov <alex@pilosoft.com>
0 commit comments