PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
mac.c File Reference
#include "postgres.h"
#include "access/hash.h"
#include "lib/hyperloglog.h"
#include "libpq/pqformat.h"
#include "port/pg_bswap.h"
#include "utils/builtins.h"
#include "utils/guc.h"
#include "utils/inet.h"
#include "utils/sortsupport.h"
Include dependency graph for mac.c:

Go to the source code of this file.

Data Structures

struct  macaddr_sortsupport_state
 

Macros

#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)))
 

Functions

static int macaddr_cmp_internal (macaddr *a1, macaddr *a2)
 
static int macaddr_fast_cmp (Datum x, Datum y, SortSupport ssup)
 
static int macaddr_cmp_abbrev (Datum x, Datum y, SortSupport ssup)
 
static bool macaddr_abbrev_abort (int memtupcount, SortSupport ssup)
 
static Datum macaddr_abbrev_convert (Datum original, SortSupport ssup)
 
Datum macaddr_in (PG_FUNCTION_ARGS)
 
Datum macaddr_out (PG_FUNCTION_ARGS)
 
Datum macaddr_recv (PG_FUNCTION_ARGS)
 
Datum macaddr_send (PG_FUNCTION_ARGS)
 
Datum macaddr_cmp (PG_FUNCTION_ARGS)
 
Datum macaddr_lt (PG_FUNCTION_ARGS)
 
Datum macaddr_le (PG_FUNCTION_ARGS)
 
Datum macaddr_eq (PG_FUNCTION_ARGS)
 
Datum macaddr_ge (PG_FUNCTION_ARGS)
 
Datum macaddr_gt (PG_FUNCTION_ARGS)
 
Datum macaddr_ne (PG_FUNCTION_ARGS)
 
Datum hashmacaddr (PG_FUNCTION_ARGS)
 
Datum hashmacaddrextended (PG_FUNCTION_ARGS)
 
Datum macaddr_not (PG_FUNCTION_ARGS)
 
Datum macaddr_and (PG_FUNCTION_ARGS)
 
Datum macaddr_or (PG_FUNCTION_ARGS)
 
Datum macaddr_trunc (PG_FUNCTION_ARGS)
 
Datum macaddr_sortsupport (PG_FUNCTION_ARGS)
 

Macro Definition Documentation

#define hibits (   addr)    ((unsigned long)(((addr)->a<<16)|((addr)->b<<8)|((addr)->c)))

Definition at line 30 of file mac.c.

Referenced by macaddr_cmp_internal().

#define lobits (   addr)    ((unsigned long)(((addr)->d<<16)|((addr)->e<<8)|((addr)->f)))

Definition at line 33 of file mac.c.

Referenced by macaddr_cmp_internal().

Function Documentation

Datum hashmacaddr ( PG_FUNCTION_ARGS  )

Definition at line 267 of file mac.c.

References hash_any(), and PG_GETARG_MACADDR_P.

268 {
269  macaddr *key = PG_GETARG_MACADDR_P(0);
270 
271  return hash_any((unsigned char *) key, sizeof(macaddr));
272 }
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
Datum hash_any(register const unsigned char *k, register int keylen)
Definition: hashfunc.c:428
Definition: inet.h:94
Datum hashmacaddrextended ( PG_FUNCTION_ARGS  )

Definition at line 275 of file mac.c.

References hash_any_extended(), PG_GETARG_INT64, and PG_GETARG_MACADDR_P.

276 {
277  macaddr *key = PG_GETARG_MACADDR_P(0);
278 
279  return hash_any_extended((unsigned char *) key, sizeof(macaddr),
280  PG_GETARG_INT64(1));
281 }
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
Definition: inet.h:94
#define PG_GETARG_INT64(n)
Definition: fmgr.h:247
Datum hash_any_extended(register const unsigned char *k, register int keylen, uint64 seed)
Definition: hashfunc.c:634
static bool macaddr_abbrev_abort ( int  memtupcount,
SortSupport  ssup 
)
static

Definition at line 431 of file mac.c.

References macaddr_sortsupport_state::abbr_card, elog, estimateHyperLogLog(), macaddr_sortsupport_state::estimating, macaddr_sortsupport_state::input_count, INT64_FORMAT, LOG, SortSupportData::ssup_extra, and trace_sort.

Referenced by macaddr_sortsupport().

432 {
434  double abbr_card;
435 
436  if (memtupcount < 10000 || uss->input_count < 10000 || !uss->estimating)
437  return false;
438 
439  abbr_card = estimateHyperLogLog(&uss->abbr_card);
440 
441  /*
442  * If we have >100k distinct values, then even if we were sorting many
443  * billion rows we'd likely still break even, and the penalty of undoing
444  * that many rows of abbrevs would probably not be worth it. At this point
445  * we stop counting because we know that we're now fully committed.
446  */
447  if (abbr_card > 100000.0)
448  {
449 #ifdef TRACE_SORT
450  if (trace_sort)
451  elog(LOG,
452  "macaddr_abbrev: estimation ends at cardinality %f"
453  " after " INT64_FORMAT " values (%d rows)",
454  abbr_card, uss->input_count, memtupcount);
455 #endif
456  uss->estimating = false;
457  return false;
458  }
459 
460  /*
461  * Target minimum cardinality is 1 per ~2k of non-null inputs. 0.5 row
462  * fudge factor allows us to abort earlier on genuinely pathological data
463  * where we've had exactly one abbreviated value in the first 2k
464  * (non-null) rows.
465  */
466  if (abbr_card < uss->input_count / 2000.0 + 0.5)
467  {
468 #ifdef TRACE_SORT
469  if (trace_sort)
470  elog(LOG,
471  "macaddr_abbrev: aborting abbreviation at cardinality %f"
472  " below threshold %f after " INT64_FORMAT " values (%d rows)",
473  abbr_card, uss->input_count / 2000.0 + 0.5, uss->input_count,
474  memtupcount);
475 #endif
476  return true;
477  }
478 
479 #ifdef TRACE_SORT
480  if (trace_sort)
481  elog(LOG,
482  "macaddr_abbrev: cardinality %f after " INT64_FORMAT
483  " values (%d rows)", abbr_card, uss->input_count, memtupcount);
484 #endif
485 
486  return false;
487 }
#define LOG
Definition: elog.h:26
bool trace_sort
Definition: tuplesort.c:118
void * ssup_extra
Definition: sortsupport.h:87
hyperLogLogState abbr_card
Definition: mac.c:42
double estimateHyperLogLog(hyperLogLogState *cState)
Definition: hyperloglog.c:185
#define INT64_FORMAT
Definition: c.h:300
#define elog
Definition: elog.h:219
static Datum macaddr_abbrev_convert ( Datum  original,
SortSupport  ssup 
)
static

Definition at line 499 of file mac.c.

References macaddr_sortsupport_state::abbr_card, addHyperLogLog(), DatumBigEndianToNative, DatumGetMacaddrP, DatumGetUInt32, macaddr_sortsupport_state::estimating, hash_uint32(), macaddr_sortsupport_state::input_count, SIZEOF_DATUM, and SortSupportData::ssup_extra.

Referenced by macaddr_sortsupport().

500 {
502  macaddr *authoritative = DatumGetMacaddrP(original);
503  Datum res;
504 
505  /*
506  * On a 64-bit machine, zero out the 8-byte datum and copy the 6 bytes of
507  * the MAC address in. There will be two bytes of zero padding on the end
508  * of the least significant bits.
509  */
510 #if SIZEOF_DATUM == 8
511  memset(&res, 0, SIZEOF_DATUM);
512  memcpy(&res, authoritative, sizeof(macaddr));
513 #else /* SIZEOF_DATUM != 8 */
514  memcpy(&res, authoritative, SIZEOF_DATUM);
515 #endif
516  uss->input_count += 1;
517 
518  /*
519  * Cardinality estimation. The estimate uses uint32, so on a 64-bit
520  * architecture, XOR the two 32-bit halves together to produce slightly
521  * more entropy. The two zeroed bytes won't have any practical impact on
522  * this operation.
523  */
524  if (uss->estimating)
525  {
526  uint32 tmp;
527 
528 #if SIZEOF_DATUM == 8
529  tmp = (uint32) res ^ (uint32) ((uint64) res >> 32);
530 #else /* SIZEOF_DATUM != 8 */
531  tmp = (uint32) res;
532 #endif
533 
535  }
536 
537  /*
538  * Byteswap on little-endian machines.
539  *
540  * This is needed so that macaddr_cmp_abbrev() (an unsigned integer 3-way
541  * comparator) works correctly on all platforms. Without this, the
542  * comparator would have to call memcmp() with a pair of pointers to the
543  * first byte of each abbreviated key, which is slower.
544  */
545  res = DatumBigEndianToNative(res);
546 
547  return res;
548 }
#define DatumGetUInt32(X)
Definition: postgres.h:492
#define DatumGetMacaddrP(X)
Definition: inet.h:131
#define DatumBigEndianToNative(x)
Definition: pg_bswap.h:149
unsigned int uint32
Definition: c.h:258
void * ssup_extra
Definition: sortsupport.h:87
Datum hash_uint32(uint32 k)
Definition: hashfunc.c:853
hyperLogLogState abbr_card
Definition: mac.c:42
uintptr_t Datum
Definition: postgres.h:372
void addHyperLogLog(hyperLogLogState *cState, uint32 hash)
Definition: hyperloglog.c:166
Definition: inet.h:94
#define SIZEOF_DATUM
Definition: postgres.h:374
Datum macaddr_and ( PG_FUNCTION_ARGS  )

Definition at line 303 of file mac.c.

References macaddr::a, macaddr::b, macaddr::c, macaddr::d, macaddr::e, macaddr::f, palloc(), PG_GETARG_MACADDR_P, and PG_RETURN_MACADDR_P.

304 {
305  macaddr *addr1 = PG_GETARG_MACADDR_P(0);
306  macaddr *addr2 = PG_GETARG_MACADDR_P(1);
307  macaddr *result;
308 
309  result = (macaddr *) palloc(sizeof(macaddr));
310  result->a = addr1->a & addr2->a;
311  result->b = addr1->b & addr2->b;
312  result->c = addr1->c & addr2->c;
313  result->d = addr1->d & addr2->d;
314  result->e = addr1->e & addr2->e;
315  result->f = addr1->f & addr2->f;
316  PG_RETURN_MACADDR_P(result);
317 }
unsigned char f
Definition: inet.h:101
#define PG_RETURN_MACADDR_P(x)
Definition: inet.h:134
unsigned char c
Definition: inet.h:98
unsigned char a
Definition: inet.h:96
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
unsigned char d
Definition: inet.h:99
unsigned char b
Definition: inet.h:97
unsigned char e
Definition: inet.h:100
Definition: inet.h:94
void * palloc(Size size)
Definition: mcxt.c:848
Datum macaddr_cmp ( PG_FUNCTION_ARGS  )

Definition at line 197 of file mac.c.

References a1, a2, macaddr_cmp_internal(), PG_GETARG_MACADDR_P, and PG_RETURN_INT32.

Referenced by gbt_macadkey_cmp().

198 {
201 
203 }
#define PG_RETURN_INT32(x)
Definition: fmgr.h:314
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
static FormData_pg_attribute a1
Definition: heap.c:144
Definition: inet.h:94
static FormData_pg_attribute a2
Definition: heap.c:150
static int macaddr_cmp_internal(macaddr *a1, macaddr *a2)
Definition: mac.c:182
static int macaddr_cmp_abbrev ( Datum  x,
Datum  y,
SortSupport  ssup 
)
static

Definition at line 414 of file mac.c.

Referenced by macaddr_sortsupport().

415 {
416  if (x > y)
417  return 1;
418  else if (x == y)
419  return 0;
420  else
421  return -1;
422 }
static int macaddr_cmp_internal ( macaddr a1,
macaddr a2 
)
static

Definition at line 182 of file mac.c.

References hibits, and lobits.

Referenced by macaddr_cmp(), macaddr_eq(), macaddr_fast_cmp(), macaddr_ge(), macaddr_gt(), macaddr_le(), macaddr_lt(), and macaddr_ne().

183 {
184  if (hibits(a1) < hibits(a2))
185  return -1;
186  else if (hibits(a1) > hibits(a2))
187  return 1;
188  else if (lobits(a1) < lobits(a2))
189  return -1;
190  else if (lobits(a1) > lobits(a2))
191  return 1;
192  else
193  return 0;
194 }
#define hibits(addr)
Definition: mac.c:30
#define lobits(addr)
Definition: mac.c:33
Datum macaddr_eq ( PG_FUNCTION_ARGS  )

Definition at line 228 of file mac.c.

References a1, a2, macaddr_cmp_internal(), PG_GETARG_MACADDR_P, and PG_RETURN_BOOL.

Referenced by gbt_macadeq().

229 {
232 
233  PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) == 0);
234 }
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:319
static FormData_pg_attribute a1
Definition: heap.c:144
Definition: inet.h:94
static FormData_pg_attribute a2
Definition: heap.c:150
static int macaddr_cmp_internal(macaddr *a1, macaddr *a2)
Definition: mac.c:182
static int macaddr_fast_cmp ( Datum  x,
Datum  y,
SortSupport  ssup 
)
static

Definition at line 400 of file mac.c.

References DatumGetMacaddrP, and macaddr_cmp_internal().

Referenced by macaddr_sortsupport().

401 {
402  macaddr *arg1 = DatumGetMacaddrP(x);
403  macaddr *arg2 = DatumGetMacaddrP(y);
404 
405  return macaddr_cmp_internal(arg1, arg2);
406 }
#define DatumGetMacaddrP(X)
Definition: inet.h:131
Definition: inet.h:94
static int macaddr_cmp_internal(macaddr *a1, macaddr *a2)
Definition: mac.c:182
Datum macaddr_ge ( PG_FUNCTION_ARGS  )

Definition at line 237 of file mac.c.

References a1, a2, macaddr_cmp_internal(), PG_GETARG_MACADDR_P, and PG_RETURN_BOOL.

Referenced by gbt_macadge().

238 {
241 
242  PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) >= 0);
243 }
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:319
static FormData_pg_attribute a1
Definition: heap.c:144
Definition: inet.h:94
static FormData_pg_attribute a2
Definition: heap.c:150
static int macaddr_cmp_internal(macaddr *a1, macaddr *a2)
Definition: mac.c:182
Datum macaddr_gt ( PG_FUNCTION_ARGS  )

Definition at line 246 of file mac.c.

References a1, a2, macaddr_cmp_internal(), PG_GETARG_MACADDR_P, and PG_RETURN_BOOL.

Referenced by gbt_macadgt().

247 {
250 
252 }
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:319
static FormData_pg_attribute a1
Definition: heap.c:144
Definition: inet.h:94
static FormData_pg_attribute a2
Definition: heap.c:150
static int macaddr_cmp_internal(macaddr *a1, macaddr *a2)
Definition: mac.c:182
Datum macaddr_in ( PG_FUNCTION_ARGS  )

Definition at line 56 of file mac.c.

References macaddr::a, macaddr::b, macaddr::c, macaddr::d, macaddr::e, ereport, errcode(), errmsg(), ERROR, macaddr::f, palloc(), PG_GETARG_CSTRING, and PG_RETURN_MACADDR_P.

57 {
58  char *str = PG_GETARG_CSTRING(0);
59  macaddr *result;
60  int a,
61  b,
62  c,
63  d,
64  e,
65  f;
66  char junk[2];
67  int count;
68 
69  /* %1s matches iff there is trailing non-whitespace garbage */
70 
71  count = sscanf(str, "%x:%x:%x:%x:%x:%x%1s",
72  &a, &b, &c, &d, &e, &f, junk);
73  if (count != 6)
74  count = sscanf(str, "%x-%x-%x-%x-%x-%x%1s",
75  &a, &b, &c, &d, &e, &f, junk);
76  if (count != 6)
77  count = sscanf(str, "%2x%2x%2x:%2x%2x%2x%1s",
78  &a, &b, &c, &d, &e, &f, junk);
79  if (count != 6)
80  count = sscanf(str, "%2x%2x%2x-%2x%2x%2x%1s",
81  &a, &b, &c, &d, &e, &f, junk);
82  if (count != 6)
83  count = sscanf(str, "%2x%2x.%2x%2x.%2x%2x%1s",
84  &a, &b, &c, &d, &e, &f, junk);
85  if (count != 6)
86  count = sscanf(str, "%2x%2x-%2x%2x-%2x%2x%1s",
87  &a, &b, &c, &d, &e, &f, junk);
88  if (count != 6)
89  count = sscanf(str, "%2x%2x%2x%2x%2x%2x%1s",
90  &a, &b, &c, &d, &e, &f, junk);
91  if (count != 6)
92  ereport(ERROR,
93  (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
94  errmsg("invalid input syntax for type %s: \"%s\"", "macaddr",
95  str)));
96 
97  if ((a < 0) || (a > 255) || (b < 0) || (b > 255) ||
98  (c < 0) || (c > 255) || (d < 0) || (d > 255) ||
99  (e < 0) || (e > 255) || (f < 0) || (f > 255))
100  ereport(ERROR,
101  (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
102  errmsg("invalid octet value in \"macaddr\" value: \"%s\"", str)));
103 
104  result = (macaddr *) palloc(sizeof(macaddr));
105 
106  result->a = a;
107  result->b = b;
108  result->c = c;
109  result->d = d;
110  result->e = e;
111  result->f = f;
112 
113  PG_RETURN_MACADDR_P(result);
114 }
unsigned char f
Definition: inet.h:101
int errcode(int sqlerrcode)
Definition: elog.c:575
#define PG_RETURN_MACADDR_P(x)
Definition: inet.h:134
unsigned char c
Definition: inet.h:98
#define ERROR
Definition: elog.h:43
unsigned char a
Definition: inet.h:96
unsigned char d
Definition: inet.h:99
char * c
#define ereport(elevel, rest)
Definition: elog.h:122
unsigned char b
Definition: inet.h:97
unsigned char e
Definition: inet.h:100
Definition: inet.h:94
e
Definition: preproc-init.c:82
void * palloc(Size size)
Definition: mcxt.c:848
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define PG_GETARG_CSTRING(n)
Definition: fmgr.h:242
Datum macaddr_le ( PG_FUNCTION_ARGS  )

Definition at line 219 of file mac.c.

References a1, a2, macaddr_cmp_internal(), PG_GETARG_MACADDR_P, and PG_RETURN_BOOL.

Referenced by gbt_macadle().

220 {
223 
224  PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) <= 0);
225 }
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:319
static FormData_pg_attribute a1
Definition: heap.c:144
Definition: inet.h:94
static FormData_pg_attribute a2
Definition: heap.c:150
static int macaddr_cmp_internal(macaddr *a1, macaddr *a2)
Definition: mac.c:182
Datum macaddr_lt ( PG_FUNCTION_ARGS  )

Definition at line 210 of file mac.c.

References a1, a2, macaddr_cmp_internal(), PG_GETARG_MACADDR_P, and PG_RETURN_BOOL.

Referenced by gbt_macadlt().

211 {
214 
216 }
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:319
static FormData_pg_attribute a1
Definition: heap.c:144
Definition: inet.h:94
static FormData_pg_attribute a2
Definition: heap.c:150
static int macaddr_cmp_internal(macaddr *a1, macaddr *a2)
Definition: mac.c:182
Datum macaddr_ne ( PG_FUNCTION_ARGS  )

Definition at line 255 of file mac.c.

References a1, a2, macaddr_cmp_internal(), PG_GETARG_MACADDR_P, and PG_RETURN_BOOL.

256 {
259 
260  PG_RETURN_BOOL(macaddr_cmp_internal(a1, a2) != 0);
261 }
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:319
static FormData_pg_attribute a1
Definition: heap.c:144
Definition: inet.h:94
static FormData_pg_attribute a2
Definition: heap.c:150
static int macaddr_cmp_internal(macaddr *a1, macaddr *a2)
Definition: mac.c:182
Datum macaddr_not ( PG_FUNCTION_ARGS  )

Definition at line 287 of file mac.c.

References macaddr::a, macaddr::b, macaddr::c, macaddr::d, macaddr::e, macaddr::f, palloc(), PG_GETARG_MACADDR_P, and PG_RETURN_MACADDR_P.

288 {
289  macaddr *addr = PG_GETARG_MACADDR_P(0);
290  macaddr *result;
291 
292  result = (macaddr *) palloc(sizeof(macaddr));
293  result->a = ~addr->a;
294  result->b = ~addr->b;
295  result->c = ~addr->c;
296  result->d = ~addr->d;
297  result->e = ~addr->e;
298  result->f = ~addr->f;
299  PG_RETURN_MACADDR_P(result);
300 }
unsigned char f
Definition: inet.h:101
#define PG_RETURN_MACADDR_P(x)
Definition: inet.h:134
unsigned char c
Definition: inet.h:98
unsigned char a
Definition: inet.h:96
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
unsigned char d
Definition: inet.h:99
unsigned char b
Definition: inet.h:97
unsigned char e
Definition: inet.h:100
Definition: inet.h:94
void * palloc(Size size)
Definition: mcxt.c:848
Datum macaddr_or ( PG_FUNCTION_ARGS  )

Definition at line 320 of file mac.c.

References macaddr::a, macaddr::b, macaddr::c, macaddr::d, macaddr::e, macaddr::f, palloc(), PG_GETARG_MACADDR_P, and PG_RETURN_MACADDR_P.

321 {
322  macaddr *addr1 = PG_GETARG_MACADDR_P(0);
323  macaddr *addr2 = PG_GETARG_MACADDR_P(1);
324  macaddr *result;
325 
326  result = (macaddr *) palloc(sizeof(macaddr));
327  result->a = addr1->a | addr2->a;
328  result->b = addr1->b | addr2->b;
329  result->c = addr1->c | addr2->c;
330  result->d = addr1->d | addr2->d;
331  result->e = addr1->e | addr2->e;
332  result->f = addr1->f | addr2->f;
333  PG_RETURN_MACADDR_P(result);
334 }
unsigned char f
Definition: inet.h:101
#define PG_RETURN_MACADDR_P(x)
Definition: inet.h:134
unsigned char c
Definition: inet.h:98
unsigned char a
Definition: inet.h:96
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
unsigned char d
Definition: inet.h:99
unsigned char b
Definition: inet.h:97
unsigned char e
Definition: inet.h:100
Definition: inet.h:94
void * palloc(Size size)
Definition: mcxt.c:848
Datum macaddr_out ( PG_FUNCTION_ARGS  )

Definition at line 121 of file mac.c.

References macaddr::a, macaddr::b, macaddr::c, macaddr::d, macaddr::e, macaddr::f, palloc(), PG_GETARG_MACADDR_P, PG_RETURN_CSTRING, and snprintf().

122 {
123  macaddr *addr = PG_GETARG_MACADDR_P(0);
124  char *result;
125 
126  result = (char *) palloc(32);
127 
128  snprintf(result, 32, "%02x:%02x:%02x:%02x:%02x:%02x",
129  addr->a, addr->b, addr->c, addr->d, addr->e, addr->f);
130 
131  PG_RETURN_CSTRING(result);
132 }
unsigned char f
Definition: inet.h:101
int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3
unsigned char c
Definition: inet.h:98
unsigned char a
Definition: inet.h:96
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
unsigned char d
Definition: inet.h:99
unsigned char b
Definition: inet.h:97
unsigned char e
Definition: inet.h:100
#define PG_RETURN_CSTRING(x)
Definition: fmgr.h:322
Definition: inet.h:94
void * palloc(Size size)
Definition: mcxt.c:848
Datum macaddr_recv ( PG_FUNCTION_ARGS  )

Definition at line 140 of file mac.c.

References macaddr::a, macaddr::b, buf, macaddr::c, macaddr::d, macaddr::e, macaddr::f, palloc(), PG_GETARG_POINTER, PG_RETURN_MACADDR_P, and pq_getmsgbyte().

141 {
143  macaddr *addr;
144 
145  addr = (macaddr *) palloc(sizeof(macaddr));
146 
147  addr->a = pq_getmsgbyte(buf);
148  addr->b = pq_getmsgbyte(buf);
149  addr->c = pq_getmsgbyte(buf);
150  addr->d = pq_getmsgbyte(buf);
151  addr->e = pq_getmsgbyte(buf);
152  addr->f = pq_getmsgbyte(buf);
153 
154  PG_RETURN_MACADDR_P(addr);
155 }
unsigned char f
Definition: inet.h:101
StringInfoData * StringInfo
Definition: stringinfo.h:43
#define PG_GETARG_POINTER(n)
Definition: fmgr.h:241
#define PG_RETURN_MACADDR_P(x)
Definition: inet.h:134
unsigned char c
Definition: inet.h:98
unsigned char a
Definition: inet.h:96
unsigned char d
Definition: inet.h:99
static char * buf
Definition: pg_test_fsync.c:67
unsigned char b
Definition: inet.h:97
unsigned char e
Definition: inet.h:100
int pq_getmsgbyte(StringInfo msg)
Definition: pqformat.c:401
Definition: inet.h:94
void * palloc(Size size)
Definition: mcxt.c:848
Datum macaddr_send ( PG_FUNCTION_ARGS  )

Definition at line 161 of file mac.c.

References macaddr::a, macaddr::b, buf, macaddr::c, macaddr::d, macaddr::e, macaddr::f, PG_GETARG_MACADDR_P, PG_RETURN_BYTEA_P, pq_begintypsend(), pq_endtypsend(), and pq_sendbyte().

162 {
163  macaddr *addr = PG_GETARG_MACADDR_P(0);
165 
166  pq_begintypsend(&buf);
167  pq_sendbyte(&buf, addr->a);
168  pq_sendbyte(&buf, addr->b);
169  pq_sendbyte(&buf, addr->c);
170  pq_sendbyte(&buf, addr->d);
171  pq_sendbyte(&buf, addr->e);
172  pq_sendbyte(&buf, addr->f);
174 }
void pq_begintypsend(StringInfo buf)
Definition: pqformat.c:328
unsigned char f
Definition: inet.h:101
#define PG_RETURN_BYTEA_P(x)
Definition: fmgr.h:330
static void pq_sendbyte(StringInfo buf, int8 byt)
Definition: pqformat.h:164
bytea * pq_endtypsend(StringInfo buf)
Definition: pqformat.c:348
unsigned char c
Definition: inet.h:98
unsigned char a
Definition: inet.h:96
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
unsigned char d
Definition: inet.h:99
static char * buf
Definition: pg_test_fsync.c:67
unsigned char b
Definition: inet.h:97
unsigned char e
Definition: inet.h:100
Definition: inet.h:94
Datum macaddr_sortsupport ( PG_FUNCTION_ARGS  )

Definition at line 363 of file mac.c.

References macaddr_sortsupport_state::abbr_card, SortSupportData::abbrev_abort, SortSupportData::abbrev_converter, SortSupportData::abbrev_full_comparator, SortSupportData::abbreviate, SortSupportData::comparator, macaddr_sortsupport_state::estimating, initHyperLogLog(), macaddr_sortsupport_state::input_count, macaddr_abbrev_abort(), macaddr_abbrev_convert(), macaddr_cmp_abbrev(), macaddr_fast_cmp(), MemoryContextSwitchTo(), palloc(), PG_GETARG_POINTER, PG_RETURN_VOID, SortSupportData::ssup_cxt, and SortSupportData::ssup_extra.

364 {
366 
368  ssup->ssup_extra = NULL;
369 
370  if (ssup->abbreviate)
371  {
373  MemoryContext oldcontext;
374 
375  oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
376 
377  uss = palloc(sizeof(macaddr_sortsupport_state));
378  uss->input_count = 0;
379  uss->estimating = true;
380  initHyperLogLog(&uss->abbr_card, 10);
381 
382  ssup->ssup_extra = uss;
383 
388 
389  MemoryContextSwitchTo(oldcontext);
390  }
391 
392  PG_RETURN_VOID();
393 }
struct SortSupportData * SortSupport
Definition: sortsupport.h:58
int(* comparator)(Datum x, Datum y, SortSupport ssup)
Definition: sortsupport.h:107
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:109
#define PG_GETARG_POINTER(n)
Definition: fmgr.h:241
void initHyperLogLog(hyperLogLogState *cState, uint8 bwidth)
Definition: hyperloglog.c:65
MemoryContext ssup_cxt
Definition: sortsupport.h:66
int(* abbrev_full_comparator)(Datum x, Datum y, SortSupport ssup)
Definition: sortsupport.h:192
void * ssup_extra
Definition: sortsupport.h:87
hyperLogLogState abbr_card
Definition: mac.c:42
static int macaddr_cmp_abbrev(Datum x, Datum y, SortSupport ssup)
Definition: mac.c:414
#define PG_RETURN_VOID()
Definition: fmgr.h:309
static int macaddr_fast_cmp(Datum x, Datum y, SortSupport ssup)
Definition: mac.c:400
void * palloc(Size size)
Definition: mcxt.c:848
bool(* abbrev_abort)(int memtupcount, SortSupport ssup)
Definition: sortsupport.h:183
Datum(* abbrev_converter)(Datum original, SortSupport ssup)
Definition: sortsupport.h:173
static bool macaddr_abbrev_abort(int memtupcount, SortSupport ssup)
Definition: mac.c:431
static Datum macaddr_abbrev_convert(Datum original, SortSupport ssup)
Definition: mac.c:499
Datum macaddr_trunc ( PG_FUNCTION_ARGS  )

Definition at line 341 of file mac.c.

References macaddr::a, macaddr::b, macaddr::c, macaddr::d, macaddr::e, macaddr::f, palloc(), PG_GETARG_MACADDR_P, and PG_RETURN_MACADDR_P.

342 {
343  macaddr *addr = PG_GETARG_MACADDR_P(0);
344  macaddr *result;
345 
346  result = (macaddr *) palloc(sizeof(macaddr));
347 
348  result->a = addr->a;
349  result->b = addr->b;
350  result->c = addr->c;
351  result->d = 0;
352  result->e = 0;
353  result->f = 0;
354 
355  PG_RETURN_MACADDR_P(result);
356 }
unsigned char f
Definition: inet.h:101
#define PG_RETURN_MACADDR_P(x)
Definition: inet.h:134
unsigned char c
Definition: inet.h:98
unsigned char a
Definition: inet.h:96
#define PG_GETARG_MACADDR_P(n)
Definition: inet.h:133
unsigned char d
Definition: inet.h:99
unsigned char b
Definition: inet.h:97
unsigned char e
Definition: inet.h:100
Definition: inet.h:94
void * palloc(Size size)
Definition: mcxt.c:848