38 #define CLUSTER_SORT 3
136 Oid *sortOperators,
Oid *sortCollations,
137 bool *nullsFirstFlags,
153 "begin tuple sort: nkeys = %d, workMem = %d, randomAccess = %c",
176 for (
i = 0;
i < nkeys;
i++)
229 "begin tuple sort: nkeys = %d, workMem = %d, randomAccess = %c",
256 if (
arg->indexInfo->ii_IndexAttrNumbers[0] == 0)
261 arg->tupDesc = tupDesc;
265 if (
arg->indexInfo->ii_Expressions != NULL)
319 bool uniqueNullsNotDistinct,
338 "begin index sort: unique = %c, workMem = %d, randomAccess = %c",
339 enforceUnique ?
't' :
'f',
359 arg->index.heapRel = heapRel;
360 arg->index.indexRel = indexRel;
361 arg->enforceUnique = enforceUnique;
362 arg->uniqueNullsNotDistinct = uniqueNullsNotDistinct;
421 "begin index sort: high_mask = 0x%x, low_mask = 0x%x, "
422 "max_buckets = 0x%x, workMem = %d, randomAccess = %c",
439 arg->index.heapRel = heapRel;
440 arg->index.indexRel = indexRel;
442 arg->high_mask = high_mask;
443 arg->low_mask = low_mask;
444 arg->max_buckets = max_buckets;
471 "begin index sort: workMem = %d, randomAccess = %c",
484 arg->index.heapRel = heapRel;
485 arg->index.indexRel = indexRel;
486 arg->enforceUnique =
false;
487 arg->uniqueNullsNotDistinct =
false;
517 bool nullsFirstFlag,
int workMem,
534 "begin datum sort: workMem = %d, randomAccess = %c",
554 arg->datumType = datumType;
558 arg->datumTypeLen = typlen;
611 stup.tuple = (
void *) tuple;
642 stup.
tuple = (
void *) tup;
651 arg->indexInfo->ii_IndexAttrNumbers[0],
681 tuple->
t_tid = *
self;
725 stup.datum1 = !isNull ?
val : (
Datum) 0;
726 stup.isnull1 = isNull;
731 stup.isnull1 =
false;
882 *abbrev = stup.datum1;
884 if (stup.isnull1 || !base->
tuples)
887 *isNull = stup.isnull1;
914 for (
i = 0;
i < count;
i++)
948 b->datum1,
b->isnull1,
975 for (nkey = 1; nkey < base->
nKeys; nkey++, sortKey++)
1003 unsigned int tuplen = tupbodylen +
sizeof(int);
1015 unsigned int tupbodylen =
len -
sizeof(int);
1023 tuple->
t_len = tuplen;
1027 stup->
tuple = (
void *) tuple;
1049 for (
i = 0;
i < count;
i++)
1055 arg->indexInfo->ii_IndexAttrNumbers[0],
1081 tupDesc =
arg->tupDesc;
1087 b->datum1,
b->isnull1,
1092 if (sortKey->abbrev_converter)
1094 AttrNumber leading =
arg->indexInfo->ii_IndexAttrNumbers[0];
1096 datum1 =
heap_getattr(ltup, leading, tupDesc, &isnull1);
1097 datum2 =
heap_getattr(rtup, leading, tupDesc, &isnull2);
1115 if (
arg->indexInfo->ii_Expressions == NULL)
1119 for (; nkey < base->
nKeys; nkey++, sortKey++)
1121 AttrNumber attno =
arg->indexInfo->ii_IndexAttrNumbers[nkey];
1154 l_index_values, l_index_isnull);
1158 r_index_values, r_index_isnull);
1160 for (; nkey < base->
nKeys; nkey++, sortKey++)
1163 l_index_isnull[nkey],
1164 r_index_values[nkey],
1165 r_index_isnull[nkey],
1202 tuple->
t_len = t_len;
1210 stup->
tuple = (
void *) tuple;
1214 arg->indexInfo->ii_IndexAttrNumbers[0],
1226 if (
arg->estate != NULL)
1250 for (
i = 0;
i < count;
i++)
1278 bool equal_hasnull =
false;
1289 b->datum1,
b->isnull1,
1297 keysz = base->
nKeys;
1300 if (sortKey->abbrev_converter)
1314 equal_hasnull =
true;
1317 for (nkey = 2; nkey <= keysz; nkey++, sortKey++)
1330 equal_hasnull =
true;
1343 if (
arg->enforceUnique && !(!
arg->uniqueNullsNotDistinct && equal_hasnull))
1355 Assert(tuple1 != tuple2);
1362 (
errcode(ERRCODE_UNIQUE_VIOLATION),
1363 errmsg(
"could not create unique index \"%s\"",
1365 key_desc ?
errdetail(
"Key %s is duplicated.", key_desc) :
1382 return (blk1 < blk2) ? -1 : 1;
1389 return (pos1 < pos2) ? -1 : 1;
1418 arg->max_buckets,
arg->high_mask,
1422 arg->max_buckets,
arg->high_mask,
1424 if (bucket1 > bucket2)
1426 else if (bucket1 < bucket2)
1438 else if (hash1 < hash2)
1454 return (blk1 < blk2) ? -1 : 1;
1461 return (pos1 < pos2) ? -1 : 1;
1475 unsigned int tuplen;
1490 unsigned int tuplen =
len -
sizeof(
unsigned int);
1496 stup->
tuple = (
void *) tuple;
1513 for (
i = 0;
i < count;
i++)
1524 b->datum1,
b->isnull1,
1545 unsigned int tuplen;
1546 unsigned int writtenlen;
1556 tuplen =
sizeof(
Datum);
1560 waddr = stup->
tuple;
1565 writtenlen = tuplen +
sizeof(
unsigned int);
1578 unsigned int tuplen =
len -
sizeof(
unsigned int);
1601 stup->
tuple = raddr;
static Datum values[MAXATTR]
Datum datumCopy(Datum value, bool typByVal, int typLen)
Size datumGetSize(Datum value, bool typByVal, int typLen)
elog(ERROR, "%s: %s", p2, msg)
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, Datum *values, 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)
IndexTuple index_form_tuple_context(TupleDesc tupleDescriptor, Datum *values, bool *isnull, MemoryContext context)
void index_deform_tuple(IndexTuple tup, TupleDesc tupleDescriptor, Datum *values, bool *isnull)
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)
Assert(fmt[strlen(fmt) - 1] !='\n')
void LogicalTapeWrite(LogicalTape *lt, const void *ptr, size_t size)
void get_typlenbyval(Oid typid, int16 *typlen, bool *typbyval)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
#define SK_BT_NULLS_FIRST
BTScanInsert _bt_mkscankey(Relation rel, IndexTuple itup)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static uint32 DatumGetUInt32(Datum X)
static Datum PointerGetDatum(const void *X)
static Pointer DatumGetPointer(Datum X)
#define RelationGetDescr(relation)
#define RelationGetNumberOfAttributes(relation)
#define RelationGetRelationName(relation)
#define IndexRelationGetNumberOfKeyAttributes(relation)
int errtableconstraint(Relation rel, const char *conname)
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
struct TupleDescData * TupleDesc
Tuplesortstate * tuplesort_begin_common(int workMem, SortCoordinate coordinate, int sortopt)
void tuplesort_puttuple_common(Tuplesortstate *state, SortTuple *tuple, bool useAbbrev)
bool tuplesort_gettuple_common(Tuplesortstate *state, bool forward, SortTuple *stup)
void * tuplesort_readtup_alloc(Tuplesortstate *state, Size tuplen)
#define PARALLEL_SORT(coordinate)
#define TUPLESORT_RANDOMACCESS
#define LogicalTapeReadExact(tape, ptr, len)
#define TuplesortstateGetPublic(state)
IndexTuple tuplesort_getindextuple(Tuplesortstate *state, bool forward)
HeapTuple tuplesort_getheaptuple(Tuplesortstate *state, bool forward)
static void removeabbrev_datum(Tuplesortstate *state, SortTuple *stups, int count)
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)
static void readtup_index(Tuplesortstate *state, SortTuple *stup, LogicalTape *tape, unsigned int len)
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 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)
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 int comparetup_index_hash(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
Tuplesortstate * tuplesort_begin_cluster(TupleDesc tupDesc, Relation indexRel, int workMem, SortCoordinate coordinate, int sortopt)
static void writetup_heap(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
static void writetup_index(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
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)
bool tuplesort_getdatum(Tuplesortstate *state, bool forward, bool copy, Datum *val, bool *isNull, Datum *abbrev)
static void writetup_cluster(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
void tuplesort_putindextuplevalues(Tuplesortstate *state, Relation rel, ItemPointer self, Datum *values, bool *isnull)
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)