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:1063
static int compare(const void *arg1, const void *arg2)
Definition: geqo_pool.c:145
static int32 DatumGetInt32(Datum X)
Definition: postgres.h:207
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(), setop_compare_slots(), 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
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:82
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:815
#define OidIsValid(objectId)
Definition: c.h:732
#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:42
Oid get_opfamily_proc(Oid opfamily, Oid lefttype, Oid righttype, int16 procnum)
Definition: lsyscache.c:797
static Datum PointerGetDatum(const void *X)
Definition: postgres.h:327
unsigned int Oid
Definition: postgres_ext.h:32
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}
int16_t int16
Definition: c.h:483
bool get_ordering_op_properties(Oid opno, Oid *opfamily, Oid *opcintype, int16 *strategy)
Definition: lsyscache.c:208

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

Referenced by compute_scalar_stats(), ExecInitGatherMerge(), ExecInitIndexScan(), ExecInitMergeAppend(), ExecInitSetOp(), 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}
int32_t int32
Definition: c.h:484
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().