PostgreSQL Source Code git master
Loading...
Searching...
No Matches
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 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_signed_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, bool reverse, SortSupport ssup)
 
void PrepareSortSupportFromGistIndexRel (Relation indexRel, SortSupport ssup)
 

Typedef Documentation

◆ SortSupport

Definition at line 58 of file sortsupport.h.

◆ SortSupportData

Function Documentation

◆ ApplySortAbbrevFullComparator()

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

Definition at line 238 of file sortsupport.h.

241{
242 int compare;
243
244 if (isNull1)
245 {
246 if (isNull2)
247 compare = 0; /* NULL "=" NULL */
248 else if (ssup->ssup_nulls_first)
249 compare = -1; /* NULL "<" NOT_NULL */
250 else
251 compare = 1; /* NULL ">" NOT_NULL */
252 }
253 else if (isNull2)
254 {
255 if (ssup->ssup_nulls_first)
256 compare = 1; /* NOT_NULL ">" NULL */
257 else
258 compare = -1; /* NOT_NULL "<" NULL */
259 }
260 else
261 {
262 compare = ssup->abbrev_full_comparator(datum1, datum2, ssup);
263 if (ssup->ssup_reverse)
265 }
266
267 return compare;
268}
#define INVERT_COMPARE_RESULT(var)
Definition c.h:1121
static int compare(const void *arg1, const void *arg2)
Definition geqo_pool.c:144
static int fb(int x)
int(* abbrev_full_comparator)(Datum x, Datum y, SortSupport ssup)

References SortSupportData::abbrev_full_comparator, compare(), fb(), 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)

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

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

◆ PrepareSortSupportComparisonShim()

void PrepareSortSupportComparisonShim ( Oid  cmpFunc,
SortSupport  ssup 
)
extern

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:138
#define InitFunctionCallInfoData(Fcinfo, Flinfo, Nargs, Collation, Context, Resultinfo)
Definition fmgr.h:150
void * MemoryContextAlloc(MemoryContext context, Size size)
Definition mcxt.c:1232
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
FmgrInfo flinfo
Definition sortsupport.c:29
FunctionCallInfoBaseData fcinfo
Definition sortsupport.c:30
MemoryContext ssup_cxt
Definition sortsupport.h:66

References FunctionCallInfoBaseData::args, SortSupportData::comparator, comparison_shim(), fb(), 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(), GinBufferInit(), MJExamineQuals(), and tuplesort_begin_index_gin().

◆ PrepareSortSupportFromGistIndexRel()

void PrepareSortSupportFromGistIndexRel ( Relation  indexRel,
SortSupport  ssup 
)
extern

Definition at line 185 of file sortsupport.c.

186{
187 Oid opfamily = indexRel->rd_opfamily[ssup->ssup_attno - 1];
188 Oid opcintype = indexRel->rd_opcintype[ssup->ssup_attno - 1];
190
191 Assert(ssup->comparator == NULL);
192
193 if (indexRel->rd_rel->relam != GIST_AM_OID)
194 elog(ERROR, "unexpected non-gist AM: %u", indexRel->rd_rel->relam);
195 ssup->ssup_reverse = false;
196
197 /*
198 * Look up the sort support function. This is simpler than for B-tree
199 * indexes because we don't support the old-style btree comparators.
200 */
201 sortSupportFunction = get_opfamily_proc(opfamily, opcintype, opcintype,
204 elog(ERROR, "missing support function %d(%u,%u) in opfamily %u",
205 GIST_SORTSUPPORT_PROC, opcintype, opcintype, opfamily);
207}
#define Assert(condition)
Definition c.h:885
#define OidIsValid(objectId)
Definition c.h:800
#define ERROR
Definition elog.h:39
#define elog(elevel,...)
Definition elog.h:226
#define OidFunctionCall1(functionId, arg1)
Definition fmgr.h:722
#define GIST_SORTSUPPORT_PROC
Definition gist.h:42
Oid get_opfamily_proc(Oid opfamily, Oid lefttype, Oid righttype, int16 procnum)
Definition lsyscache.c:872
static Datum PointerGetDatum(const void *X)
Definition postgres.h:352
unsigned int Oid
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, fb(), 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,
bool  reverse,
SortSupport  ssup 
)
extern

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_indam->amcanorder)
170 elog(ERROR, "unexpected non-amcanorder AM: %u", indexRel->rd_rel->relam);
171 ssup->ssup_reverse = reverse;
172
173 FinishSortSupportFunction(opfamily, opcintype, ssup);
174}
static void FinishSortSupportFunction(Oid opfamily, Oid opcintype, SortSupport ssup)
Definition sortsupport.c:94
bool amcanorder
Definition amapi.h:246
const struct IndexAmRoutine * rd_indam
Definition rel.h:206

References IndexAmRoutine::amcanorder, Assert, SortSupportData::comparator, elog, ERROR, fb(), FinishSortSupportFunction(), RelationData::rd_indam, 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 
)
extern

Definition at line 134 of file sortsupport.c.

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

References Assert, SortSupportData::comparator, COMPARE_GT, elog, ERROR, fb(), 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 
)
extern

Definition at line 3436 of file tuplesort.c.

3437{
3440
3441 if (xx < yy)
3442 return -1;
3443 else if (xx > yy)
3444 return 1;
3445 else
3446 return 0;
3447}
int32_t int32
Definition c.h:554
int y
Definition isn.c:76
int x
Definition isn.c:75
static int32 DatumGetInt32(Datum X)
Definition postgres.h:212

References DatumGetInt32(), fb(), x, and y.

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

◆ ssup_datum_signed_cmp()

int ssup_datum_signed_cmp ( Datum  x,
Datum  y,
SortSupport  ssup 
)
extern

Definition at line 3422 of file tuplesort.c.

3423{
3426
3427 if (xx < yy)
3428 return -1;
3429 else if (xx > yy)
3430 return 1;
3431 else
3432 return 0;
3433}
int64_t int64
Definition c.h:555
static int64 DatumGetInt64(Datum X)
Definition postgres.h:413

References DatumGetInt64(), fb(), x, and y.

Referenced by btint8sortsupport(), normalize_datum(), timestamp_sortsupport(), and tuplesort_sort_memtuples().

◆ ssup_datum_unsigned_cmp()

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

Definition at line 3411 of file tuplesort.c.

3412{
3413 if (x < y)
3414 return -1;
3415 else if (x > y)
3416 return 1;
3417 else
3418 return 0;
3419}

References x, and y.

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