39 #define CLUSTER_SORT 3
164 #define BRINSORTTUPLE_SIZE(len) (offsetof(BrinSortTuple, tuple) + (len))
170 Oid *sortOperators,
Oid *sortCollations,
171 bool *nullsFirstFlags,
187 "begin tuple sort: nkeys = %d, workMem = %d, randomAccess = %c",
211 for (
i = 0;
i < nkeys;
i++)
264 "begin tuple sort: nkeys = %d, workMem = %d, randomAccess = %c",
292 if (
arg->indexInfo->ii_IndexAttrNumbers[0] == 0)
297 arg->tupDesc = tupDesc;
301 if (
arg->indexInfo->ii_Expressions != NULL)
355 bool uniqueNullsNotDistinct,
374 "begin index sort: unique = %c, workMem = %d, randomAccess = %c",
375 enforceUnique ?
't' :
'f',
396 arg->index.heapRel = heapRel;
397 arg->index.indexRel = indexRel;
398 arg->enforceUnique = enforceUnique;
399 arg->uniqueNullsNotDistinct = uniqueNullsNotDistinct;
458 "begin index sort: high_mask = 0x%x, low_mask = 0x%x, "
459 "max_buckets = 0x%x, workMem = %d, randomAccess = %c",
477 arg->index.heapRel = heapRel;
478 arg->index.indexRel = indexRel;
480 arg->high_mask = high_mask;
481 arg->low_mask = low_mask;
482 arg->max_buckets = max_buckets;
509 "begin index sort: workMem = %d, randomAccess = %c",
523 arg->index.heapRel = heapRel;
524 arg->index.indexRel = indexRel;
525 arg->enforceUnique =
false;
526 arg->uniqueNullsNotDistinct =
false;
566 "begin index sort: workMem = %d, randomAccess = %c",
585 bool nullsFirstFlag,
int workMem,
602 "begin datum sort: workMem = %d, randomAccess = %c",
623 arg->datumType = datumType;
627 arg->datumTypeLen = typlen;
681 stup.tuple = (
void *) tuple;
698 !stup.isnull1, tuplen);
719 stup.
tuple = (
void *) tup;
728 arg->indexInfo->ii_IndexAttrNumbers[0],
765 tuple->
t_tid = *
self;
851 stup.datum1 = !isNull ?
val : (
Datum) 0;
852 stup.isnull1 = isNull;
857 stup.isnull1 =
false;
1037 *abbrev = stup.datum1;
1039 if (stup.isnull1 || !base->
tuples)
1042 *isNull = stup.isnull1;
1069 for (
i = 0;
i < count;
i++)
1094 b->datum1,
b->isnull1,
1129 datum1 =
heap_getattr(<up, attno, tupDesc, &isnull1);
1130 datum2 =
heap_getattr(&rtup, attno, tupDesc, &isnull2);
1140 for (nkey = 1; nkey < base->
nKeys; nkey++, sortKey++)
1144 datum1 =
heap_getattr(<up, attno, tupDesc, &isnull1);
1145 datum2 =
heap_getattr(&rtup, attno, tupDesc, &isnull2);
1168 unsigned int tuplen = tupbodylen +
sizeof(int);
1180 unsigned int tupbodylen =
len -
sizeof(int);
1188 tuple->
t_len = tuplen;
1192 stup->
tuple = (
void *) tuple;
1214 for (
i = 0;
i < count;
i++)
1220 arg->indexInfo->ii_IndexAttrNumbers[0],
1238 b->datum1,
b->isnull1,
1266 tupDesc =
arg->tupDesc;
1271 if (sortKey->abbrev_converter)
1273 AttrNumber leading =
arg->indexInfo->ii_IndexAttrNumbers[0];
1275 datum1 =
heap_getattr(ltup, leading, tupDesc, &isnull1);
1276 datum2 =
heap_getattr(rtup, leading, tupDesc, &isnull2);
1294 if (
arg->indexInfo->ii_Expressions == NULL)
1298 for (; nkey < base->
nKeys; nkey++, sortKey++)
1300 AttrNumber attno =
arg->indexInfo->ii_IndexAttrNumbers[nkey];
1333 l_index_values, l_index_isnull);
1337 r_index_values, r_index_isnull);
1339 for (; nkey < base->
nKeys; nkey++, sortKey++)
1342 l_index_isnull[nkey],
1343 r_index_values[nkey],
1344 r_index_isnull[nkey],
1381 tuple->
t_len = t_len;
1389 stup->
tuple = (
void *) tuple;
1393 arg->indexInfo->ii_IndexAttrNumbers[0],
1405 if (
arg->estate != NULL)
1429 for (
i = 0;
i < count;
i++)
1456 b->datum1,
b->isnull1,
1476 bool equal_hasnull =
false;
1486 keysz = base->
nKeys;
1489 if (sortKey->abbrev_converter)
1503 equal_hasnull =
true;
1506 for (nkey = 2; nkey <= keysz; nkey++, sortKey++)
1519 equal_hasnull =
true;
1532 if (
arg->enforceUnique && !(!
arg->uniqueNullsNotDistinct && equal_hasnull))
1544 Assert(tuple1 != tuple2);
1551 (
errcode(ERRCODE_UNIQUE_VIOLATION),
1552 errmsg(
"could not create unique index \"%s\"",
1554 key_desc ?
errdetail(
"Key %s is duplicated.", key_desc) :
1571 return (blk1 < blk2) ? -1 : 1;
1578 return (pos1 < pos2) ? -1 : 1;
1607 arg->max_buckets,
arg->high_mask,
1611 arg->max_buckets,
arg->high_mask,
1613 if (bucket1 > bucket2)
1615 else if (bucket1 < bucket2)
1627 else if (hash1 < hash2)
1643 return (blk1 < blk2) ? -1 : 1;
1650 return (pos1 < pos2) ? -1 : 1;
1677 unsigned int tuplen;
1692 unsigned int tuplen =
len -
sizeof(
unsigned int);
1698 stup->
tuple = (
void *) tuple;
1715 for (
i = 0;
i < count;
i++)
1745 unsigned int tuplen = tuple->
tuplen;
1747 tuplen = tuplen +
sizeof(tuplen);
1760 unsigned int tuplen =
len -
sizeof(
unsigned int);
1774 stup->
tuple = (
void *) tuple;
1789 for (
i = 0;
i < count;
i++)
1800 b->datum1,
b->isnull1,
1829 unsigned int tuplen;
1830 unsigned int writtenlen;
1840 tuplen =
sizeof(
Datum);
1844 waddr = stup->
tuple;
1849 writtenlen = tuplen +
sizeof(
unsigned int);
1862 unsigned int tuplen =
len -
sizeof(
unsigned int);
1885 stup->
tuple = raddr;
static Datum values[MAXATTR]
#define Assert(condition)
Datum datumCopy(Datum value, bool typByVal, int typLen)
Size datumGetSize(Datum value, bool typByVal, int typLen)
int errdetail(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
TupleTableSlot * ExecStoreMinimalTuple(MinimalTuple mtup, TupleTableSlot *slot, bool shouldFree)
TupleTableSlot * ExecStoreHeapTuple(HeapTuple tuple, TupleTableSlot *slot, bool shouldFree)
const TupleTableSlotOps TTSOpsHeapTuple
TupleTableSlot * MakeSingleTupleTableSlot(TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
EState * CreateExecutorState(void)
void FreeExecutorState(EState *estate)
#define ResetPerTupleExprContext(estate)
#define GetPerTupleExprContext(estate)
char * BuildIndexValueDescription(Relation indexRelation, const Datum *values, const bool *isnull)
static int compare(const void *arg1, const void *arg2)
Bucket _hash_hashkey2bucket(uint32 hashkey, uint32 maxbucket, uint32 highmask, uint32 lowmask)
HeapTuple heap_copytuple(HeapTuple tuple)
MinimalTuple heap_copy_minimal_tuple(MinimalTuple mtup)
HeapTupleData * HeapTuple
MinimalTupleData * MinimalTuple
HeapTupleHeaderData * HeapTupleHeader
#define MINIMAL_TUPLE_OFFSET
static Datum heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
#define MINIMAL_TUPLE_DATA_OFFSET
void FormIndexDatum(IndexInfo *indexInfo, TupleTableSlot *slot, EState *estate, Datum *values, bool *isnull)
IndexInfo * BuildIndexInfo(Relation index)
void index_deform_tuple(IndexTuple tup, TupleDesc tupleDescriptor, Datum *values, bool *isnull)
IndexTuple index_form_tuple_context(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull, MemoryContext context)
if(TABLE==NULL||TABLE_index==NULL)
static OffsetNumber ItemPointerGetOffsetNumber(const ItemPointerData *pointer)
static BlockNumber ItemPointerGetBlockNumber(const ItemPointerData *pointer)
IndexTupleData * IndexTuple
#define IndexTupleSize(itup)
static Datum index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
void LogicalTapeWrite(LogicalTape *lt, const void *ptr, size_t size)
void get_typlenbyval(Oid typid, int16 *typlen, bool *typbyval)
void pfree(void *pointer)
Size GetMemoryChunkSpace(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
#define SK_BT_NULLS_FIRST
BTScanInsert _bt_mkscankey(Relation rel, IndexTuple itup)
static uint32 DatumGetUInt32(Datum X)
static Datum PointerGetDatum(const void *X)
static Pointer DatumGetPointer(Datum X)
MemoryContextSwitchTo(old_ctx)
#define RelationGetDescr(relation)
#define RelationGetNumberOfAttributes(relation)
#define RelationGetRelationName(relation)
#define IndexRelationGetNumberOfKeyAttributes(relation)
int errtableconstraint(Relation rel, const char *conname)
static pg_noinline void Size size
void PrepareSortSupportFromGistIndexRel(Relation indexRel, SortSupport ssup)
void PrepareSortSupportFromOrderingOp(Oid orderingOp, SortSupport ssup)
void PrepareSortSupportFromIndexRel(Relation indexRel, int16 strategy, SortSupport ssup)
static int ApplySortAbbrevFullComparator(Datum datum1, bool isNull1, Datum datum2, bool isNull2, SortSupport ssup)
struct SortSupportData * SortSupport
static int ApplySortComparator(Datum datum1, bool isNull1, Datum datum2, bool isNull2, SortSupport ssup)
#define BTGreaterStrategyNumber
#define BTLessStrategyNumber
ScanKeyData scankeys[INDEX_MAX_KEYS]
TupleTableSlot * ecxt_scantuple
Datum(* abbrev_converter)(Datum original, SortSupport ssup)
bool uniqueNullsNotDistinct
MemoryContext maincontext
void(* writetup)(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
void(* removeabbrev)(Tuplesortstate *state, SortTuple *stups, int count)
void(* freestate)(Tuplesortstate *state)
MemoryContext tuplecontext
MemoryContext sortcontext
void(* readtup)(Tuplesortstate *state, SortTuple *stup, LogicalTape *tape, unsigned int len)
SortTupleComparator comparetup
SortTupleComparator comparetup_tiebreak
struct TupleDescData * TupleDesc
Tuplesortstate * tuplesort_begin_common(int workMem, SortCoordinate coordinate, int sortopt)
void tuplesort_puttuple_common(Tuplesortstate *state, SortTuple *tuple, bool useAbbrev, Size tuplen)
bool tuplesort_gettuple_common(Tuplesortstate *state, bool forward, SortTuple *stup)
void * tuplesort_readtup_alloc(Tuplesortstate *state, Size tuplen)
#define TupleSortUseBumpTupleCxt(opt)
#define PARALLEL_SORT(coordinate)
#define TUPLESORT_RANDOMACCESS
#define LogicalTapeReadExact(tape, ptr, len)
#define TuplesortstateGetPublic(state)
IndexTuple tuplesort_getindextuple(Tuplesortstate *state, bool forward)
static void writetup_index_brin(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
HeapTuple tuplesort_getheaptuple(Tuplesortstate *state, bool forward)
static void removeabbrev_datum(Tuplesortstate *state, SortTuple *stups, int count)
static int comparetup_index_btree_tiebreak(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
void tuplesort_putdatum(Tuplesortstate *state, Datum val, bool isNull)
Tuplesortstate * tuplesort_begin_index_hash(Relation heapRel, Relation indexRel, uint32 high_mask, uint32 low_mask, uint32 max_buckets, int workMem, SortCoordinate coordinate, int sortopt)
static int comparetup_index_btree(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
void tuplesort_putindextuplevalues(Tuplesortstate *state, Relation rel, ItemPointer self, const Datum *values, const bool *isnull)
static void readtup_index(Tuplesortstate *state, SortTuple *stup, LogicalTape *tape, unsigned int len)
static int comparetup_cluster_tiebreak(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
void tuplesort_puttupleslot(Tuplesortstate *state, TupleTableSlot *slot)
static int comparetup_datum(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
Tuplesortstate * tuplesort_begin_index_gist(Relation heapRel, Relation indexRel, int workMem, SortCoordinate coordinate, int sortopt)
Tuplesortstate * tuplesort_begin_index_btree(Relation heapRel, Relation indexRel, bool enforceUnique, bool uniqueNullsNotDistinct, int workMem, SortCoordinate coordinate, int sortopt)
static void removeabbrev_index(Tuplesortstate *state, SortTuple *stups, int count)
static int comparetup_datum_tiebreak(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
Tuplesortstate * tuplesort_begin_index_brin(int workMem, SortCoordinate coordinate, int sortopt)
static void readtup_datum(Tuplesortstate *state, SortTuple *stup, LogicalTape *tape, unsigned int len)
static void readtup_heap(Tuplesortstate *state, SortTuple *stup, LogicalTape *tape, unsigned int len)
static void readtup_cluster(Tuplesortstate *state, SortTuple *stup, LogicalTape *tape, unsigned int tuplen)
static void writetup_datum(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
struct BrinSortTuple BrinSortTuple
Tuplesortstate * tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation, bool nullsFirstFlag, int workMem, SortCoordinate coordinate, int sortopt)
static int comparetup_heap(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
bool tuplesort_gettupleslot(Tuplesortstate *state, bool forward, bool copy, TupleTableSlot *slot, Datum *abbrev)
static void removeabbrev_index_brin(Tuplesortstate *state, SortTuple *stups, int count)
#define BRINSORTTUPLE_SIZE(len)
static int comparetup_index_hash(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
static void readtup_index_brin(Tuplesortstate *state, SortTuple *stup, LogicalTape *tape, unsigned int len)
Tuplesortstate * tuplesort_begin_cluster(TupleDesc tupDesc, Relation indexRel, int workMem, SortCoordinate coordinate, int sortopt)
void tuplesort_putbrintuple(Tuplesortstate *state, BrinTuple *tuple, Size size)
static void writetup_heap(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
static void writetup_index(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
static int comparetup_heap_tiebreak(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
static void freestate_cluster(Tuplesortstate *state)
static void removeabbrev_heap(Tuplesortstate *state, SortTuple *stups, int count)
void tuplesort_putheaptuple(Tuplesortstate *state, HeapTuple tup)
static int comparetup_cluster(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
static int comparetup_index_brin(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
static int comparetup_index_hash_tiebreak(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
bool tuplesort_getdatum(Tuplesortstate *state, bool forward, bool copy, Datum *val, bool *isNull, Datum *abbrev)
BrinTuple * tuplesort_getbrintuple(Tuplesortstate *state, Size *len, bool forward)
static void writetup_cluster(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
static void removeabbrev_cluster(Tuplesortstate *state, SortTuple *stups, int count)
Tuplesortstate * tuplesort_begin_heap(TupleDesc tupDesc, int nkeys, AttrNumber *attNums, Oid *sortOperators, Oid *sortCollations, bool *nullsFirstFlags, int workMem, SortCoordinate coordinate, int sortopt)
static MinimalTuple ExecCopySlotMinimalTuple(TupleTableSlot *slot)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)