PostgreSQL Source Code  git master
sortsupport.h File Reference
#include "access/attnum.h"
#include "utils/relcache.h"
Include dependency graph for sortsupport.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  SortSupportData
 

Typedefs

typedef struct SortSupportDataSortSupport
 
typedef struct SortSupportData SortSupportData
 

Functions

static int ApplySortComparator (Datum datum1, bool isNull1, Datum datum2, bool isNull2, SortSupport ssup)
 
static int ApplyUnsignedSortComparator (Datum datum1, bool isNull1, Datum datum2, bool isNull2, SortSupport ssup)
 
static int ApplyInt32SortComparator (Datum datum1, bool isNull1, Datum datum2, bool isNull2, SortSupport ssup)
 
static int ApplySortAbbrevFullComparator (Datum datum1, bool isNull1, Datum datum2, bool isNull2, SortSupport ssup)
 
int ssup_datum_unsigned_cmp (Datum x, Datum y, SortSupport ssup)
 
int ssup_datum_int32_cmp (Datum x, Datum y, SortSupport ssup)
 
void PrepareSortSupportComparisonShim (Oid cmpFunc, SortSupport ssup)
 
void PrepareSortSupportFromOrderingOp (Oid orderingOp, SortSupport ssup)
 
void PrepareSortSupportFromIndexRel (Relation indexRel, int16 strategy, SortSupport ssup)
 
void PrepareSortSupportFromGistIndexRel (Relation indexRel, SortSupport ssup)
 

Typedef Documentation

◆ SortSupport

typedef struct SortSupportData* SortSupport

Definition at line 58 of file sortsupport.h.

◆ SortSupportData

Function Documentation

◆ ApplyInt32SortComparator()

static int ApplyInt32SortComparator ( Datum  datum1,
bool  isNull1,
Datum  datum2,
bool  isNull2,
SortSupport  ssup 
)
inlinestatic

Definition at line 302 of file sortsupport.h.

305 {
306  int compare;
307 
308  if (isNull1)
309  {
310  if (isNull2)
311  compare = 0; /* NULL "=" NULL */
312  else if (ssup->ssup_nulls_first)
313  compare = -1; /* NULL "<" NOT_NULL */
314  else
315  compare = 1; /* NULL ">" NOT_NULL */
316  }
317  else if (isNull2)
318  {
319  if (ssup->ssup_nulls_first)
320  compare = 1; /* NOT_NULL ">" NULL */
321  else
322  compare = -1; /* NOT_NULL "<" NULL */
323  }
324  else
325  {
326  compare = DatumGetInt32(datum1) < DatumGetInt32(datum2) ? -1 :
327  DatumGetInt32(datum1) > DatumGetInt32(datum2) ? 1 : 0;
328  if (ssup->ssup_reverse)
330  }
331 
332  return compare;
333 }
#define INVERT_COMPARE_RESULT(var)
Definition: c.h:1085
static int compare(const void *arg1, const void *arg2)
Definition: geqo_pool.c:145
static int32 DatumGetInt32(Datum X)
Definition: postgres.h:202
bool ssup_nulls_first
Definition: sortsupport.h:75

References compare(), DatumGetInt32(), INVERT_COMPARE_RESULT, SortSupportData::ssup_nulls_first, and SortSupportData::ssup_reverse.

Referenced by qsort_tuple_int32_compare().

◆ ApplySortAbbrevFullComparator()

static int ApplySortAbbrevFullComparator ( Datum  datum1,
bool  isNull1,
Datum  datum2,
bool  isNull2,
SortSupport  ssup 
)
inlinestatic

Definition at line 341 of file sortsupport.h.

344 {
345  int compare;
346 
347  if (isNull1)
348  {
349  if (isNull2)
350  compare = 0; /* NULL "=" NULL */
351  else if (ssup->ssup_nulls_first)
352  compare = -1; /* NULL "<" NOT_NULL */
353  else
354  compare = 1; /* NULL ">" NOT_NULL */
355  }
356  else if (isNull2)
357  {
358  if (ssup->ssup_nulls_first)
359  compare = 1; /* NOT_NULL ">" NULL */
360  else
361  compare = -1; /* NOT_NULL "<" NULL */
362  }
363  else
364  {
365  compare = ssup->abbrev_full_comparator(datum1, datum2, ssup);
366  if (ssup->ssup_reverse)
368  }
369 
370  return compare;
371 }
int(* abbrev_full_comparator)(Datum x, Datum y, SortSupport ssup)
Definition: sortsupport.h:191

References SortSupportData::abbrev_full_comparator, compare(), INVERT_COMPARE_RESULT, SortSupportData::ssup_nulls_first, and SortSupportData::ssup_reverse.

Referenced by comparetup_cluster_tiebreak(), comparetup_datum_tiebreak(), comparetup_heap_tiebreak(), and comparetup_index_btree_tiebreak().

◆ ApplySortComparator()

static int ApplySortComparator ( Datum  datum1,
bool  isNull1,
Datum  datum2,
bool  isNull2,
SortSupport  ssup 
)
inlinestatic

Definition at line 200 of file sortsupport.h.

203 {
204  int compare;
205 
206  if (isNull1)
207  {
208  if (isNull2)
209  compare = 0; /* NULL "=" NULL */
210  else if (ssup->ssup_nulls_first)
211  compare = -1; /* NULL "<" NOT_NULL */
212  else
213  compare = 1; /* NULL ">" NOT_NULL */
214  }
215  else if (isNull2)
216  {
217  if (ssup->ssup_nulls_first)
218  compare = 1; /* NOT_NULL ">" NULL */
219  else
220  compare = -1; /* NOT_NULL "<" NULL */
221  }
222  else
223  {
224  compare = ssup->comparator(datum1, datum2, ssup);
225  if (ssup->ssup_reverse)
227  }
228 
229  return compare;
230 }
int(* comparator)(Datum x, Datum y, SortSupport ssup)
Definition: sortsupport.h:106

References SortSupportData::comparator, compare(), INVERT_COMPARE_RESULT, SortSupportData::ssup_nulls_first, and SortSupportData::ssup_reverse.

Referenced by _bt_load(), compare_datums_simple(), compare_scalars(), comparetup_cluster(), comparetup_cluster_tiebreak(), comparetup_datum(), comparetup_heap(), comparetup_heap_tiebreak(), comparetup_index_btree(), comparetup_index_btree_tiebreak(), heap_compare_slots(), MJCompare(), multi_sort_compare(), multi_sort_compare_dim(), multi_sort_compare_dims(), and sort_item_compare().

◆ ApplyUnsignedSortComparator()

static int ApplyUnsignedSortComparator ( Datum  datum1,
bool  isNull1,
Datum  datum2,
bool  isNull2,
SortSupport  ssup 
)
inlinestatic

Definition at line 233 of file sortsupport.h.

236 {
237  int compare;
238 
239  if (isNull1)
240  {
241  if (isNull2)
242  compare = 0; /* NULL "=" NULL */
243  else if (ssup->ssup_nulls_first)
244  compare = -1; /* NULL "<" NOT_NULL */
245  else
246  compare = 1; /* NULL ">" NOT_NULL */
247  }
248  else if (isNull2)
249  {
250  if (ssup->ssup_nulls_first)
251  compare = 1; /* NOT_NULL ">" NULL */
252  else
253  compare = -1; /* NOT_NULL "<" NULL */
254  }
255  else
256  {
257  compare = datum1 < datum2 ? -1 : datum1 > datum2 ? 1 : 0;
258  if (ssup->ssup_reverse)
260  }
261 
262  return compare;
263 }

References compare(), INVERT_COMPARE_RESULT, SortSupportData::ssup_nulls_first, and SortSupportData::ssup_reverse.

Referenced by qsort_tuple_unsigned_compare().

◆ PrepareSortSupportComparisonShim()

void PrepareSortSupportComparisonShim ( Oid  cmpFunc,
SortSupport  ssup 
)

Definition at line 68 of file sortsupport.c.

69 {
70  SortShimExtra *extra;
71 
72  extra = (SortShimExtra *) MemoryContextAlloc(ssup->ssup_cxt,
74 
75  /* Lookup the comparison function */
76  fmgr_info_cxt(cmpFunc, &extra->flinfo, ssup->ssup_cxt);
77 
78  /* We can initialize the callinfo just once and re-use it */
79  InitFunctionCallInfoData(extra->fcinfo, &extra->flinfo, 2,
80  ssup->ssup_collation, NULL, NULL);
81  extra->fcinfo.args[0].isnull = false;
82  extra->fcinfo.args[1].isnull = false;
83 
84  ssup->ssup_extra = extra;
86 }
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
Definition: fmgr.c:137
#define InitFunctionCallInfoData(Fcinfo, Flinfo, Nargs, Collation, Context, Resultinfo)
Definition: fmgr.h:150
void * MemoryContextAlloc(MemoryContext context, Size size)
Definition: mcxt.c:1181
static int comparison_shim(Datum x, Datum y, SortSupport ssup)
Definition: sortsupport.c:43
#define SizeForSortShimExtra(nargs)
Definition: sortsupport.c:33
NullableDatum args[FLEXIBLE_ARRAY_MEMBER]
Definition: fmgr.h:95
bool isnull
Definition: postgres.h:77
FmgrInfo flinfo
Definition: sortsupport.c:29
FunctionCallInfoBaseData fcinfo
Definition: sortsupport.c:30
void * ssup_extra
Definition: sortsupport.h:87
MemoryContext ssup_cxt
Definition: sortsupport.h:66

References FunctionCallInfoBaseData::args, SortSupportData::comparator, comparison_shim(), SortShimExtra::fcinfo, SortShimExtra::flinfo, fmgr_info_cxt(), InitFunctionCallInfoData, NullableDatum::isnull, MemoryContextAlloc(), SizeForSortShimExtra, SortSupportData::ssup_collation, SortSupportData::ssup_cxt, and SortSupportData::ssup_extra.

Referenced by FinishSortSupportFunction(), and MJExamineQuals().

◆ PrepareSortSupportFromGistIndexRel()

void PrepareSortSupportFromGistIndexRel ( Relation  indexRel,
SortSupport  ssup 
)

Definition at line 188 of file sortsupport.c.

189 {
190  Oid opfamily = indexRel->rd_opfamily[ssup->ssup_attno - 1];
191  Oid opcintype = indexRel->rd_opcintype[ssup->ssup_attno - 1];
192  Oid sortSupportFunction;
193 
194  Assert(ssup->comparator == NULL);
195 
196  if (indexRel->rd_rel->relam != GIST_AM_OID)
197  elog(ERROR, "unexpected non-gist AM: %u", indexRel->rd_rel->relam);
198  ssup->ssup_reverse = false;
199 
200  /*
201  * Look up the sort support function. This is simpler than for B-tree
202  * indexes because we don't support the old-style btree comparators.
203  */
204  sortSupportFunction = get_opfamily_proc(opfamily, opcintype, opcintype,
206  if (!OidIsValid(sortSupportFunction))
207  elog(ERROR, "missing support function %d(%u,%u) in opfamily %u",
208  GIST_SORTSUPPORT_PROC, opcintype, opcintype, opfamily);
209  OidFunctionCall1(sortSupportFunction, PointerGetDatum(ssup));
210 }
#define Assert(condition)
Definition: c.h:837
#define OidIsValid(objectId)
Definition: c.h:754
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
#define OidFunctionCall1(functionId, arg1)
Definition: fmgr.h:679
#define GIST_SORTSUPPORT_PROC
Definition: gist.h:41
Oid get_opfamily_proc(Oid opfamily, Oid lefttype, Oid righttype, int16 procnum)
Definition: lsyscache.c:796
static Datum PointerGetDatum(const void *X)
Definition: postgres.h:322
unsigned int Oid
Definition: postgres_ext.h:31
Oid * rd_opcintype
Definition: rel.h:208
Oid * rd_opfamily
Definition: rel.h:207
Form_pg_class rd_rel
Definition: rel.h:111
AttrNumber ssup_attno
Definition: sortsupport.h:81

References Assert, SortSupportData::comparator, elog, ERROR, get_opfamily_proc(), GIST_SORTSUPPORT_PROC, OidFunctionCall1, OidIsValid, PointerGetDatum(), RelationData::rd_opcintype, RelationData::rd_opfamily, RelationData::rd_rel, SortSupportData::ssup_attno, and SortSupportData::ssup_reverse.

Referenced by tuplesort_begin_index_gist().

◆ PrepareSortSupportFromIndexRel()

void PrepareSortSupportFromIndexRel ( Relation  indexRel,
int16  strategy,
SortSupport  ssup 
)

Definition at line 161 of file sortsupport.c.

163 {
164  Oid opfamily = indexRel->rd_opfamily[ssup->ssup_attno - 1];
165  Oid opcintype = indexRel->rd_opcintype[ssup->ssup_attno - 1];
166 
167  Assert(ssup->comparator == NULL);
168 
169  if (indexRel->rd_rel->relam != BTREE_AM_OID)
170  elog(ERROR, "unexpected non-btree AM: %u", indexRel->rd_rel->relam);
171  if (strategy != BTGreaterStrategyNumber &&
172  strategy != BTLessStrategyNumber)
173  elog(ERROR, "unexpected sort support strategy: %d", strategy);
174  ssup->ssup_reverse = (strategy == BTGreaterStrategyNumber);
175 
176  FinishSortSupportFunction(opfamily, opcintype, ssup);
177 }
static void FinishSortSupportFunction(Oid opfamily, Oid opcintype, SortSupport ssup)
Definition: sortsupport.c:94
#define BTGreaterStrategyNumber
Definition: stratnum.h:33
#define BTLessStrategyNumber
Definition: stratnum.h:29

References Assert, BTGreaterStrategyNumber, BTLessStrategyNumber, SortSupportData::comparator, elog, ERROR, FinishSortSupportFunction(), RelationData::rd_opcintype, RelationData::rd_opfamily, RelationData::rd_rel, SortSupportData::ssup_attno, and SortSupportData::ssup_reverse.

Referenced by _bt_load(), tuplesort_begin_cluster(), and tuplesort_begin_index_btree().

◆ PrepareSortSupportFromOrderingOp()

void PrepareSortSupportFromOrderingOp ( Oid  orderingOp,
SortSupport  ssup 
)

Definition at line 134 of file sortsupport.c.

135 {
136  Oid opfamily;
137  Oid opcintype;
138  int16 strategy;
139 
140  Assert(ssup->comparator == NULL);
141 
142  /* Find the operator in pg_amop */
143  if (!get_ordering_op_properties(orderingOp, &opfamily, &opcintype,
144  &strategy))
145  elog(ERROR, "operator %u is not a valid ordering operator",
146  orderingOp);
147  ssup->ssup_reverse = (strategy == BTGreaterStrategyNumber);
148 
149  FinishSortSupportFunction(opfamily, opcintype, ssup);
150 }
signed short int16
Definition: c.h:481
bool get_ordering_op_properties(Oid opno, Oid *opfamily, Oid *opcintype, int16 *strategy)
Definition: lsyscache.c:207

References Assert, BTGreaterStrategyNumber, SortSupportData::comparator, elog, ERROR, FinishSortSupportFunction(), get_ordering_op_properties(), and SortSupportData::ssup_reverse.

Referenced by compute_scalar_stats(), ExecInitGatherMerge(), ExecInitIndexScan(), ExecInitMergeAppend(), multi_sort_add_dimension(), statext_mcv_serialize(), tuplesort_begin_datum(), and tuplesort_begin_heap().

◆ ssup_datum_int32_cmp()

int ssup_datum_int32_cmp ( Datum  x,
Datum  y,
SortSupport  ssup 
)

Definition at line 3166 of file tuplesort.c.

3167 {
3168  int32 xx = DatumGetInt32(x);
3169  int32 yy = DatumGetInt32(y);
3170 
3171  if (xx < yy)
3172  return -1;
3173  else if (xx > yy)
3174  return 1;
3175  else
3176  return 0;
3177 }
signed int int32
Definition: c.h:482
int y
Definition: isn.c:71
int x
Definition: isn.c:70

References DatumGetInt32(), x, and y.

Referenced by btint4sortsupport(), date_sortsupport(), and tuplesort_sort_memtuples().

◆ ssup_datum_unsigned_cmp()

int ssup_datum_unsigned_cmp ( Datum  x,
Datum  y,
SortSupport  ssup 
)

Definition at line 3139 of file tuplesort.c.

3140 {
3141  if (x < y)
3142  return -1;
3143  else if (x > y)
3144  return 1;
3145  else
3146  return 0;
3147 }

References x, and y.

Referenced by gist_point_sortsupport(), macaddr_sortsupport(), network_sortsupport(), tuplesort_sort_memtuples(), uuid_sortsupport(), and varstr_sortsupport().