175#define BRINSORTTUPLE_SIZE(len) (offsetof(BrinSortTuple, tuple) + (len))
181 Oid *sortOperators,
Oid *sortCollations,
182 bool *nullsFirstFlags,
197 "begin tuple sort: nkeys = %d, workMem = %d, randomAccess = %c",
220 for (
i = 0;
i < nkeys;
i++)
272 "begin tuple sort: nkeys = %d, workMem = %d, randomAccess = %c",
299 if (
arg->indexInfo->ii_IndexAttrNumbers[0] == 0)
304 arg->tupDesc = tupDesc;
308 if (
arg->indexInfo->ii_Expressions != NULL)
361 bool uniqueNullsNotDistinct,
379 "begin index sort: unique = %c, workMem = %d, randomAccess = %c",
380 enforceUnique ?
't' :
'f',
400 arg->index.heapRel = heapRel;
401 arg->index.indexRel = indexRel;
402 arg->enforceUnique = enforceUnique;
403 arg->uniqueNullsNotDistinct = uniqueNullsNotDistinct;
460 "begin index sort: high_mask = 0x%x, low_mask = 0x%x, "
461 "max_buckets = 0x%x, workMem = %d, randomAccess = %c",
478 arg->index.heapRel = heapRel;
479 arg->index.indexRel = indexRel;
481 arg->high_mask = high_mask;
482 arg->low_mask = low_mask;
483 arg->max_buckets = max_buckets;
509 "begin index sort: workMem = %d, randomAccess = %c",
522 arg->index.heapRel = heapRel;
523 arg->index.indexRel = indexRel;
524 arg->enforceUnique =
false;
525 arg->uniqueNullsNotDistinct =
false;
564 "begin index sort: workMem = %d, randomAccess = %c",
598 "begin index sort: workMem = %d, randomAccess = %c",
653 bool nullsFirstFlag,
int workMem,
669 "begin datum sort: workMem = %d, randomAccess = %c",
689 arg->datumType = datumType;
693 arg->datumTypeLen = typlen;
764 !stup.isnull1, tuplen);
794 arg->indexInfo->ii_IndexAttrNumbers[0],
831 tuple->
t_tid = *self;
866 memcpy(&bstup->
tuple, tuple, size);
897 memcpy(ctup, tuple, size);
948 stup.datum1 = !isNull ?
val : (
Datum) 0;
949 stup.isnull1 = isNull;
954 stup.isnull1 =
false;
1086 return &btup->
tuple;
1157 *abbrev = stup.datum1;
1159 if (stup.isnull1 || !base->
tuples)
1162 *isNull = stup.isnull1;
1189 for (
i = 0;
i < count;
i++)
1214 b->datum1,
b->isnull1,
1249 datum1 =
heap_getattr(<up, attno, tupDesc, &isnull1);
1250 datum2 =
heap_getattr(&rtup, attno, tupDesc, &isnull2);
1260 for (nkey = 1; nkey < base->
nKeys; nkey++, sortKey++)
1264 datum1 =
heap_getattr(<up, attno, tupDesc, &isnull1);
1265 datum2 =
heap_getattr(&rtup, attno, tupDesc, &isnull2);
1288 unsigned int tuplen = tupbodylen +
sizeof(int);
1300 unsigned int tupbodylen =
len -
sizeof(int);
1308 tuple->
t_len = tuplen;
1312 stup->
tuple = tuple;
1334 for (
i = 0;
i < count;
i++)
1340 arg->indexInfo->ii_IndexAttrNumbers[0],
1358 b->datum1,
b->isnull1,
1386 tupDesc =
arg->tupDesc;
1391 if (sortKey->abbrev_converter)
1393 AttrNumber leading =
arg->indexInfo->ii_IndexAttrNumbers[0];
1395 datum1 =
heap_getattr(ltup, leading, tupDesc, &isnull1);
1396 datum2 =
heap_getattr(rtup, leading, tupDesc, &isnull2);
1414 if (
arg->indexInfo->ii_Expressions == NULL)
1418 for (; nkey < base->
nKeys; nkey++, sortKey++)
1420 AttrNumber attno =
arg->indexInfo->ii_IndexAttrNumbers[nkey];
1453 l_index_values, l_index_isnull);
1457 r_index_values, r_index_isnull);
1459 for (; nkey < base->
nKeys; nkey++, sortKey++)
1462 l_index_isnull[nkey],
1463 r_index_values[nkey],
1464 r_index_isnull[nkey],
1501 tuple->
t_len = t_len;
1509 stup->
tuple = tuple;
1513 arg->indexInfo->ii_IndexAttrNumbers[0],
1525 if (
arg->estate != NULL)
1549 for (
i = 0;
i < count;
i++)
1576 b->datum1,
b->isnull1,
1596 bool equal_hasnull =
false;
1606 keysz = base->
nKeys;
1609 if (sortKey->abbrev_converter)
1623 equal_hasnull =
true;
1626 for (nkey = 2; nkey <= keysz; nkey++, sortKey++)
1639 equal_hasnull =
true;
1652 if (
arg->enforceUnique && !(!
arg->uniqueNullsNotDistinct && equal_hasnull))
1664 Assert(tuple1 != tuple2);
1671 (
errcode(ERRCODE_UNIQUE_VIOLATION),
1672 errmsg(
"could not create unique index \"%s\"",
1674 key_desc ?
errdetail(
"Key %s is duplicated.", key_desc) :
1691 return (blk1 < blk2) ? -1 : 1;
1698 return (pos1 < pos2) ? -1 : 1;
1727 arg->max_buckets,
arg->high_mask,
1731 arg->max_buckets,
arg->high_mask,
1733 if (bucket1 > bucket2)
1735 else if (bucket1 < bucket2)
1747 else if (hash1 < hash2)
1763 return (blk1 < blk2) ? -1 : 1;
1770 return (pos1 < pos2) ? -1 : 1;
1797 unsigned int tuplen;
1812 unsigned int tuplen =
len -
sizeof(
unsigned int);
1818 stup->
tuple = tuple;
1835 for (
i = 0;
i < count;
i++)
1865 unsigned int tuplen = tuple->
tuplen;
1867 tuplen = tuplen +
sizeof(tuplen);
1880 unsigned int tuplen =
len -
sizeof(
unsigned int);
1894 stup->
tuple = tuple;
1908 elog(
ERROR,
"removeabbrev_index_gin not implemented");
1929 unsigned int tuplen = tuple->
tuplen;
1931 tuplen = tuplen +
sizeof(tuplen);
1944 unsigned int tuplen =
len -
sizeof(
unsigned int);
1957 stup->
tuple = (
void *) tuple;
1972 for (
i = 0;
i < count;
i++)
1983 b->datum1,
b->isnull1,
2012 unsigned int tuplen;
2013 unsigned int writtenlen;
2023 tuplen =
sizeof(
Datum);
2027 waddr = stup->
tuple;
2032 writtenlen = tuplen +
sizeof(
unsigned int);
2045 unsigned int tuplen =
len -
sizeof(
unsigned int);
2068 stup->
tuple = raddr;
static Datum values[MAXATTR]
#define OidIsValid(objectId)
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,...)
TupleTableSlot * MakeSingleTupleTableSlot(TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
TupleTableSlot * ExecStoreMinimalTuple(MinimalTuple mtup, TupleTableSlot *slot, bool shouldFree)
const TupleTableSlotOps TTSOpsHeapTuple
TupleTableSlot * ExecStoreHeapTuple(HeapTuple tuple, TupleTableSlot *slot, bool shouldFree)
void FreeExecutorState(EState *estate)
EState * CreateExecutorState(void)
#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)
int _gin_compare_tuples(GinTuple *a, GinTuple *b, SortSupport ssup)
Assert(PointerIsAligned(start, uint64))
Bucket _hash_hashkey2bucket(uint32 hashkey, uint32 maxbucket, uint32 highmask, uint32 lowmask)
HeapTuple heap_copytuple(HeapTuple tuple)
MinimalTuple heap_copy_minimal_tuple(MinimalTuple mtup, Size extra)
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
IndexInfo * BuildIndexInfo(Relation index)
void FormIndexDatum(IndexInfo *indexInfo, TupleTableSlot *slot, EState *estate, Datum *values, bool *isnull)
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
static Datum index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
static Size IndexTupleSize(const IndexTupleData *itup)
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 MemoryContext MemoryContextSwitchTo(MemoryContext context)
FormData_pg_attribute * Form_pg_attribute
static uint32 DatumGetUInt32(Datum X)
static Datum PointerGetDatum(const void *X)
static Pointer DatumGetPointer(Datum X)
static Datum UInt32GetDatum(uint32 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 PrepareSortSupportFromIndexRel(Relation indexRel, bool reverse, SortSupport ssup)
void PrepareSortSupportFromOrderingOp(Oid orderingOp, 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)
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
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
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)
Tuplesortstate * tuplesort_begin_index_gin(Relation heapRel, Relation indexRel, int workMem, SortCoordinate coordinate, int sortopt)
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)
static int comparetup_index_btree(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
GinTuple * tuplesort_getgintuple(Tuplesortstate *state, Size *len, bool forward)
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)
static void writetup_index_gin(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
void tuplesort_puttupleslot(Tuplesortstate *state, TupleTableSlot *slot)
static int comparetup_datum(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
Tuplesortstate * tuplesort_begin_index_brin(int workMem, SortCoordinate coordinate, int sortopt)
Tuplesortstate * tuplesort_begin_heap(TupleDesc tupDesc, int nkeys, AttrNumber *attNums, Oid *sortOperators, Oid *sortCollations, bool *nullsFirstFlags, int workMem, SortCoordinate coordinate, int sortopt)
Tuplesortstate * tuplesort_begin_cluster(TupleDesc tupDesc, Relation indexRel, int workMem, SortCoordinate coordinate, int sortopt)
BrinTuple * tuplesort_getbrintuple(Tuplesortstate *state, Size *len, bool forward)
static void removeabbrev_index(Tuplesortstate *state, SortTuple *stups, int count)
Tuplesortstate * tuplesort_begin_index_btree(Relation heapRel, Relation indexRel, bool enforceUnique, bool uniqueNullsNotDistinct, int workMem, SortCoordinate coordinate, int sortopt)
static int comparetup_datum_tiebreak(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
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)
Tuplesortstate * tuplesort_begin_index_gist(Relation heapRel, Relation indexRel, int workMem, SortCoordinate coordinate, int sortopt)
static void writetup_datum(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
struct BrinSortTuple BrinSortTuple
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)
void tuplesort_putgintuple(Tuplesortstate *state, GinTuple *tuple, Size size)
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_datum(Oid datumType, Oid sortOperator, Oid sortCollation, bool nullsFirstFlag, 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 void readtup_index_gin(Tuplesortstate *state, SortTuple *stup, LogicalTape *tape, unsigned int len)
static void removeabbrev_index_gin(Tuplesortstate *state, SortTuple *stups, int count)
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_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)
static void writetup_cluster(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup)
static void removeabbrev_cluster(Tuplesortstate *state, SortTuple *stups, int count)
static int comparetup_index_gin(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
static MinimalTuple ExecCopySlotMinimalTuple(TupleTableSlot *slot)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
TypeCacheEntry * lookup_type_cache(Oid type_id, int flags)