PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
uuid.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/sortsupport.h"
#include "utils/uuid.h"
Include dependency graph for uuid.c:

Go to the source code of this file.

Data Structures

struct  uuid_sortsupport_state
 

Functions

static void string_to_uuid (const char *source, pg_uuid_t *uuid)
 
static int uuid_internal_cmp (const pg_uuid_t *arg1, const pg_uuid_t *arg2)
 
static int uuid_fast_cmp (Datum x, Datum y, SortSupport ssup)
 
static int uuid_cmp_abbrev (Datum x, Datum y, SortSupport ssup)
 
static bool uuid_abbrev_abort (int memtupcount, SortSupport ssup)
 
static Datum uuid_abbrev_convert (Datum original, SortSupport ssup)
 
Datum uuid_in (PG_FUNCTION_ARGS)
 
Datum uuid_out (PG_FUNCTION_ARGS)
 
Datum uuid_recv (PG_FUNCTION_ARGS)
 
Datum uuid_send (PG_FUNCTION_ARGS)
 
Datum uuid_lt (PG_FUNCTION_ARGS)
 
Datum uuid_le (PG_FUNCTION_ARGS)
 
Datum uuid_eq (PG_FUNCTION_ARGS)
 
Datum uuid_ge (PG_FUNCTION_ARGS)
 
Datum uuid_gt (PG_FUNCTION_ARGS)
 
Datum uuid_ne (PG_FUNCTION_ARGS)
 
Datum uuid_cmp (PG_FUNCTION_ARGS)
 
Datum uuid_sortsupport (PG_FUNCTION_ARGS)
 
Datum uuid_hash (PG_FUNCTION_ARGS)
 

Function Documentation

static void string_to_uuid ( const char *  source,
pg_uuid_t uuid 
)
static

Definition at line 91 of file uuid.c.

References pg_uuid_t::data, ereport, errcode(), errmsg(), ERROR, i, NULL, syntax_error(), and UUID_LEN.

Referenced by uuid_in().

92 {
93  const char *src = source;
94  bool braces = false;
95  int i;
96 
97  if (src[0] == '{')
98  {
99  src++;
100  braces = true;
101  }
102 
103  for (i = 0; i < UUID_LEN; i++)
104  {
105  char str_buf[3];
106 
107  if (src[0] == '\0' || src[1] == '\0')
108  goto syntax_error;
109  memcpy(str_buf, src, 2);
110  if (!isxdigit((unsigned char) str_buf[0]) ||
111  !isxdigit((unsigned char) str_buf[1]))
112  goto syntax_error;
113 
114  str_buf[2] = '\0';
115  uuid->data[i] = (unsigned char) strtoul(str_buf, NULL, 16);
116  src += 2;
117  if (src[0] == '-' && (i % 2) == 1 && i < UUID_LEN - 1)
118  src++;
119  }
120 
121  if (braces)
122  {
123  if (*src != '}')
124  goto syntax_error;
125  src++;
126  }
127 
128  if (*src != '\0')
129  goto syntax_error;
130 
131  return;
132 
134  ereport(ERROR,
135  (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
136  errmsg("invalid input syntax for type %s: \"%s\"",
137  "uuid", source)));
138 }
unsigned char data[UUID_LEN]
Definition: uuid.h:22
void syntax_error(const char *source, int lineno, const char *line, const char *command, const char *msg, const char *more, int column)
Definition: pgbench.c:2920
int errcode(int sqlerrcode)
Definition: elog.c:575
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:122
#define UUID_LEN
Definition: uuid.h:18
#define NULL
Definition: c.h:229
int errmsg(const char *fmt,...)
Definition: elog.c:797
int i
static bool uuid_abbrev_abort ( int  memtupcount,
SortSupport  ssup 
)
static

Definition at line 302 of file uuid.c.

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

Referenced by uuid_sortsupport().

303 {
304  uuid_sortsupport_state *uss = ssup->ssup_extra;
305  double abbr_card;
306 
307  if (memtupcount < 10000 || uss->input_count < 10000 || !uss->estimating)
308  return false;
309 
310  abbr_card = estimateHyperLogLog(&uss->abbr_card);
311 
312  /*
313  * If we have >100k distinct values, then even if we were sorting many
314  * billion rows we'd likely still break even, and the penalty of undoing
315  * that many rows of abbrevs would probably not be worth it. Stop even
316  * counting at that point.
317  */
318  if (abbr_card > 100000.0)
319  {
320 #ifdef TRACE_SORT
321  if (trace_sort)
322  elog(LOG,
323  "uuid_abbrev: estimation ends at cardinality %f"
324  " after " INT64_FORMAT " values (%d rows)",
325  abbr_card, uss->input_count, memtupcount);
326 #endif
327  uss->estimating = false;
328  return false;
329  }
330 
331  /*
332  * Target minimum cardinality is 1 per ~2k of non-null inputs. 0.5 row
333  * fudge factor allows us to abort earlier on genuinely pathological data
334  * where we've had exactly one abbreviated value in the first 2k
335  * (non-null) rows.
336  */
337  if (abbr_card < uss->input_count / 2000.0 + 0.5)
338  {
339 #ifdef TRACE_SORT
340  if (trace_sort)
341  elog(LOG,
342  "uuid_abbrev: aborting abbreviation at cardinality %f"
343  " below threshold %f after " INT64_FORMAT " values (%d rows)",
344  abbr_card, uss->input_count / 2000.0 + 0.5, uss->input_count,
345  memtupcount);
346 #endif
347  return true;
348  }
349 
350 #ifdef TRACE_SORT
351  if (trace_sort)
352  elog(LOG,
353  "uuid_abbrev: cardinality %f after " INT64_FORMAT
354  " values (%d rows)", abbr_card, uss->input_count, memtupcount);
355 #endif
356 
357  return false;
358 }
#define LOG
Definition: elog.h:26
bool trace_sort
Definition: tuplesort.c:155
void * ssup_extra
Definition: sortsupport.h:87
hyperLogLogState abbr_card
Definition: uuid.c:31
double estimateHyperLogLog(hyperLogLogState *cState)
Definition: hyperloglog.c:185
#define INT64_FORMAT
Definition: c.h:315
#define elog
Definition: elog.h:219
static Datum uuid_abbrev_convert ( Datum  original,
SortSupport  ssup 
)
static

Definition at line 368 of file uuid.c.

References uuid_sortsupport_state::abbr_card, addHyperLogLog(), pg_uuid_t::data, DatumBigEndianToNative, DatumGetUInt32, DatumGetUUIDP, uuid_sortsupport_state::estimating, hash_uint32(), uuid_sortsupport_state::input_count, and SortSupportData::ssup_extra.

Referenced by uuid_sortsupport().

369 {
370  uuid_sortsupport_state *uss = ssup->ssup_extra;
371  pg_uuid_t *authoritative = DatumGetUUIDP(original);
372  Datum res;
373 
374  memcpy(&res, authoritative->data, sizeof(Datum));
375  uss->input_count += 1;
376 
377  if (uss->estimating)
378  {
379  uint32 tmp;
380 
381 #if SIZEOF_DATUM == 8
382  tmp = (uint32) res ^ (uint32) ((uint64) res >> 32);
383 #else /* SIZEOF_DATUM != 8 */
384  tmp = (uint32) res;
385 #endif
386 
388  }
389 
390  /*
391  * Byteswap on little-endian machines.
392  *
393  * This is needed so that uuid_cmp_abbrev() (an unsigned integer 3-way
394  * comparator) works correctly on all platforms. If we didn't do this,
395  * the comparator would have to call memcmp() with a pair of pointers to
396  * the first byte of each abbreviated key, which is slower.
397  */
398  res = DatumBigEndianToNative(res);
399 
400  return res;
401 }
#define DatumGetUInt32(X)
Definition: postgres.h:492
unsigned char data[UUID_LEN]
Definition: uuid.h:22
#define DatumGetUUIDP(X)
Definition: uuid.h:28
#define DatumBigEndianToNative(x)
Definition: pg_bswap.h:65
unsigned int uint32
Definition: c.h:268
void * ssup_extra
Definition: sortsupport.h:87
Datum hash_uint32(uint32 k)
Definition: hashfunc.c:512
hyperLogLogState abbr_card
Definition: uuid.c:31
uintptr_t Datum
Definition: postgres.h:372
void addHyperLogLog(hyperLogLogState *cState, uint32 hash)
Definition: hyperloglog.c:166
Definition: uuid.h:20
Datum uuid_cmp ( PG_FUNCTION_ARGS  )

Definition at line 225 of file uuid.c.

References PG_GETARG_UUID_P, PG_RETURN_INT32, and uuid_internal_cmp().

226 {
227  pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
228  pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
229 
230  PG_RETURN_INT32(uuid_internal_cmp(arg1, arg2));
231 }
#define PG_GETARG_UUID_P(X)
Definition: uuid.h:29
#define PG_RETURN_INT32(x)
Definition: fmgr.h:314
static int uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2)
Definition: uuid.c:164
Definition: uuid.h:20
static int uuid_cmp_abbrev ( Datum  x,
Datum  y,
SortSupport  ssup 
)
static

Definition at line 285 of file uuid.c.

Referenced by uuid_sortsupport().

286 {
287  if (x > y)
288  return 1;
289  else if (x == y)
290  return 0;
291  else
292  return -1;
293 }
Datum uuid_eq ( PG_FUNCTION_ARGS  )

Definition at line 188 of file uuid.c.

References PG_GETARG_UUID_P, PG_RETURN_BOOL, and uuid_internal_cmp().

189 {
190  pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
191  pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
192 
193  PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) == 0);
194 }
#define PG_GETARG_UUID_P(X)
Definition: uuid.h:29
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:319
static int uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2)
Definition: uuid.c:164
Definition: uuid.h:20
static int uuid_fast_cmp ( Datum  x,
Datum  y,
SortSupport  ssup 
)
static

Definition at line 273 of file uuid.c.

References DatumGetUUIDP, and uuid_internal_cmp().

Referenced by uuid_sortsupport().

274 {
275  pg_uuid_t *arg1 = DatumGetUUIDP(x);
276  pg_uuid_t *arg2 = DatumGetUUIDP(y);
277 
278  return uuid_internal_cmp(arg1, arg2);
279 }
#define DatumGetUUIDP(X)
Definition: uuid.h:28
static int uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2)
Definition: uuid.c:164
Definition: uuid.h:20
Datum uuid_ge ( PG_FUNCTION_ARGS  )

Definition at line 197 of file uuid.c.

References PG_GETARG_UUID_P, PG_RETURN_BOOL, and uuid_internal_cmp().

198 {
199  pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
200  pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
201 
202  PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) >= 0);
203 }
#define PG_GETARG_UUID_P(X)
Definition: uuid.h:29
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:319
static int uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2)
Definition: uuid.c:164
Definition: uuid.h:20
Datum uuid_gt ( PG_FUNCTION_ARGS  )

Definition at line 206 of file uuid.c.

References PG_GETARG_UUID_P, PG_RETURN_BOOL, and uuid_internal_cmp().

207 {
208  pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
209  pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
210 
211  PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) > 0);
212 }
#define PG_GETARG_UUID_P(X)
Definition: uuid.h:29
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:319
static int uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2)
Definition: uuid.c:164
Definition: uuid.h:20
Datum uuid_hash ( PG_FUNCTION_ARGS  )

Definition at line 405 of file uuid.c.

References pg_uuid_t::data, hash_any(), PG_GETARG_UUID_P, and UUID_LEN.

406 {
407  pg_uuid_t *key = PG_GETARG_UUID_P(0);
408 
409  return hash_any(key->data, UUID_LEN);
410 }
#define PG_GETARG_UUID_P(X)
Definition: uuid.h:29
unsigned char data[UUID_LEN]
Definition: uuid.h:22
#define UUID_LEN
Definition: uuid.h:18
Datum hash_any(register const unsigned char *k, register int keylen)
Definition: hashfunc.c:307
Definition: uuid.h:20
Datum uuid_in ( PG_FUNCTION_ARGS  )

Definition at line 42 of file uuid.c.

References palloc(), PG_GETARG_CSTRING, PG_RETURN_UUID_P, and string_to_uuid().

Referenced by uuid_generate_internal().

43 {
44  char *uuid_str = PG_GETARG_CSTRING(0);
45  pg_uuid_t *uuid;
46 
47  uuid = (pg_uuid_t *) palloc(sizeof(*uuid));
48  string_to_uuid(uuid_str, uuid);
49  PG_RETURN_UUID_P(uuid);
50 }
static void string_to_uuid(const char *source, pg_uuid_t *uuid)
Definition: uuid.c:91
#define PG_RETURN_UUID_P(X)
Definition: uuid.h:27
Definition: uuid.h:20
void * palloc(Size size)
Definition: mcxt.c:849
#define PG_GETARG_CSTRING(n)
Definition: fmgr.h:242
static int uuid_internal_cmp ( const pg_uuid_t arg1,
const pg_uuid_t arg2 
)
static

Definition at line 164 of file uuid.c.

References pg_uuid_t::data, and UUID_LEN.

Referenced by uuid_cmp(), uuid_eq(), uuid_fast_cmp(), uuid_ge(), uuid_gt(), uuid_le(), uuid_lt(), and uuid_ne().

165 {
166  return memcmp(arg1->data, arg2->data, UUID_LEN);
167 }
unsigned char data[UUID_LEN]
Definition: uuid.h:22
#define UUID_LEN
Definition: uuid.h:18
Datum uuid_le ( PG_FUNCTION_ARGS  )

Definition at line 179 of file uuid.c.

References PG_GETARG_UUID_P, PG_RETURN_BOOL, and uuid_internal_cmp().

180 {
181  pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
182  pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
183 
184  PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) <= 0);
185 }
#define PG_GETARG_UUID_P(X)
Definition: uuid.h:29
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:319
static int uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2)
Definition: uuid.c:164
Definition: uuid.h:20
Datum uuid_lt ( PG_FUNCTION_ARGS  )

Definition at line 170 of file uuid.c.

References PG_GETARG_UUID_P, PG_RETURN_BOOL, and uuid_internal_cmp().

171 {
172  pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
173  pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
174 
175  PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) < 0);
176 }
#define PG_GETARG_UUID_P(X)
Definition: uuid.h:29
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:319
static int uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2)
Definition: uuid.c:164
Definition: uuid.h:20
Datum uuid_ne ( PG_FUNCTION_ARGS  )

Definition at line 215 of file uuid.c.

References PG_GETARG_UUID_P, PG_RETURN_BOOL, and uuid_internal_cmp().

216 {
217  pg_uuid_t *arg1 = PG_GETARG_UUID_P(0);
218  pg_uuid_t *arg2 = PG_GETARG_UUID_P(1);
219 
220  PG_RETURN_BOOL(uuid_internal_cmp(arg1, arg2) != 0);
221 }
#define PG_GETARG_UUID_P(X)
Definition: uuid.h:29
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:319
static int uuid_internal_cmp(const pg_uuid_t *arg1, const pg_uuid_t *arg2)
Definition: uuid.c:164
Definition: uuid.h:20
Datum uuid_out ( PG_FUNCTION_ARGS  )

Definition at line 53 of file uuid.c.

References appendStringInfoChar(), buf, pg_uuid_t::data, StringInfoData::data, i, initStringInfo(), PG_GETARG_UUID_P, PG_RETURN_CSTRING, and UUID_LEN.

54 {
55  pg_uuid_t *uuid = PG_GETARG_UUID_P(0);
56  static const char hex_chars[] = "0123456789abcdef";
58  int i;
59 
60  initStringInfo(&buf);
61  for (i = 0; i < UUID_LEN; i++)
62  {
63  int hi;
64  int lo;
65 
66  /*
67  * We print uuid values as a string of 8, 4, 4, 4, and then 12
68  * hexadecimal characters, with each group is separated by a hyphen
69  * ("-"). Therefore, add the hyphens at the appropriate places here.
70  */
71  if (i == 4 || i == 6 || i == 8 || i == 10)
72  appendStringInfoChar(&buf, '-');
73 
74  hi = uuid->data[i] >> 4;
75  lo = uuid->data[i] & 0x0F;
76 
77  appendStringInfoChar(&buf, hex_chars[hi]);
78  appendStringInfoChar(&buf, hex_chars[lo]);
79  }
80 
82 }
#define PG_GETARG_UUID_P(X)
Definition: uuid.h:29
unsigned char data[UUID_LEN]
Definition: uuid.h:22
static char * buf
Definition: pg_test_fsync.c:66
void appendStringInfoChar(StringInfo str, char ch)
Definition: stringinfo.c:169
void initStringInfo(StringInfo str)
Definition: stringinfo.c:46
#define UUID_LEN
Definition: uuid.h:18
#define PG_RETURN_CSTRING(x)
Definition: fmgr.h:322
Definition: uuid.h:20
int i
Datum uuid_recv ( PG_FUNCTION_ARGS  )

Definition at line 141 of file uuid.c.

References buffer, pg_uuid_t::data, palloc(), PG_GETARG_POINTER, PG_RETURN_POINTER, pq_getmsgbytes(), and UUID_LEN.

142 {
144  pg_uuid_t *uuid;
145 
146  uuid = (pg_uuid_t *) palloc(UUID_LEN);
147  memcpy(uuid->data, pq_getmsgbytes(buffer, UUID_LEN), UUID_LEN);
148  PG_RETURN_POINTER(uuid);
149 }
#define PG_RETURN_POINTER(x)
Definition: fmgr.h:321
unsigned char data[UUID_LEN]
Definition: uuid.h:22
StringInfoData * StringInfo
Definition: stringinfo.h:43
#define PG_GETARG_POINTER(n)
Definition: fmgr.h:241
const char * pq_getmsgbytes(StringInfo msg, int datalen)
Definition: pqformat.c:550
#define UUID_LEN
Definition: uuid.h:18
WalTimeSample buffer[LAG_TRACKER_BUFFER_SIZE]
Definition: walsender.c:214
Definition: uuid.h:20
void * palloc(Size size)
Definition: mcxt.c:849
Datum uuid_send ( PG_FUNCTION_ARGS  )

Definition at line 152 of file uuid.c.

References buffer, pg_uuid_t::data, PG_GETARG_UUID_P, PG_RETURN_BYTEA_P, pq_begintypsend(), pq_endtypsend(), pq_sendbytes(), and UUID_LEN.

153 {
154  pg_uuid_t *uuid = PG_GETARG_UUID_P(0);
156 
157  pq_begintypsend(&buffer);
158  pq_sendbytes(&buffer, (char *) uuid->data, UUID_LEN);
160 }
#define PG_GETARG_UUID_P(X)
Definition: uuid.h:29
unsigned char data[UUID_LEN]
Definition: uuid.h:22
void pq_begintypsend(StringInfo buf)
Definition: pqformat.c:359
#define PG_RETURN_BYTEA_P(x)
Definition: fmgr.h:329
bytea * pq_endtypsend(StringInfo buf)
Definition: pqformat.c:379
#define UUID_LEN
Definition: uuid.h:18
WalTimeSample buffer[LAG_TRACKER_BUFFER_SIZE]
Definition: walsender.c:214
Definition: uuid.h:20
void pq_sendbytes(StringInfo buf, const char *data, int datalen)
Definition: pqformat.c:115
Datum uuid_sortsupport ( PG_FUNCTION_ARGS  )

Definition at line 237 of file uuid.c.

References uuid_sortsupport_state::abbr_card, SortSupportData::abbrev_abort, SortSupportData::abbrev_converter, SortSupportData::abbrev_full_comparator, SortSupportData::abbreviate, SortSupportData::comparator, uuid_sortsupport_state::estimating, initHyperLogLog(), uuid_sortsupport_state::input_count, MemoryContextSwitchTo(), NULL, palloc(), PG_GETARG_POINTER, PG_RETURN_VOID, SortSupportData::ssup_cxt, SortSupportData::ssup_extra, uuid_abbrev_abort(), uuid_abbrev_convert(), uuid_cmp_abbrev(), and uuid_fast_cmp().

238 {
240 
241  ssup->comparator = uuid_fast_cmp;
242  ssup->ssup_extra = NULL;
243 
244  if (ssup->abbreviate)
245  {
247  MemoryContext oldcontext;
248 
249  oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
250 
251  uss = palloc(sizeof(uuid_sortsupport_state));
252  uss->input_count = 0;
253  uss->estimating = true;
254  initHyperLogLog(&uss->abbr_card, 10);
255 
256  ssup->ssup_extra = uss;
257 
258  ssup->comparator = uuid_cmp_abbrev;
262 
263  MemoryContextSwitchTo(oldcontext);
264  }
265 
266  PG_RETURN_VOID();
267 }
struct SortSupportData * SortSupport
Definition: sortsupport.h:58
int(* comparator)(Datum x, Datum y, SortSupport ssup)
Definition: sortsupport.h:107
static int uuid_cmp_abbrev(Datum x, Datum y, SortSupport ssup)
Definition: uuid.c:285
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
static Datum uuid_abbrev_convert(Datum original, SortSupport ssup)
Definition: uuid.c:368
MemoryContext ssup_cxt
Definition: sortsupport.h:66
static bool uuid_abbrev_abort(int memtupcount, SortSupport ssup)
Definition: uuid.c:302
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: uuid.c:31
#define PG_RETURN_VOID()
Definition: fmgr.h:309
#define NULL
Definition: c.h:229
void * palloc(Size size)
Definition: mcxt.c:849
bool(* abbrev_abort)(int memtupcount, SortSupport ssup)
Definition: sortsupport.h:183
static int uuid_fast_cmp(Datum x, Datum y, SortSupport ssup)
Definition: uuid.c:273
Datum(* abbrev_converter)(Datum original, SortSupport ssup)
Definition: sortsupport.h:173