174#define BRINSORTTUPLE_SIZE(len) (offsetof(BrinSortTuple, tuple) + (len))
180 Oid *sortOperators,
Oid *sortCollations,
181 bool *nullsFirstFlags,
196 "begin tuple sort: nkeys = %d, workMem = %d, randomAccess = %c",
219 for (
i = 0;
i < nkeys;
i++)
271 "begin tuple sort: nkeys = %d, workMem = %d, randomAccess = %c",
298 if (
arg->indexInfo->ii_IndexAttrNumbers[0] == 0)
303 arg->tupDesc = tupDesc;
307 if (
arg->indexInfo->ii_Expressions != NULL)
360 bool uniqueNullsNotDistinct,
378 "begin index sort: unique = %c, workMem = %d, randomAccess = %c",
379 enforceUnique ?
't' :
'f',
399 arg->index.heapRel = heapRel;
400 arg->index.indexRel = indexRel;
401 arg->enforceUnique = enforceUnique;
402 arg->uniqueNullsNotDistinct = uniqueNullsNotDistinct;
459 "begin index sort: high_mask = 0x%x, low_mask = 0x%x, "
460 "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;
508 "begin index sort: workMem = %d, randomAccess = %c",
521 arg->index.heapRel = heapRel;
522 arg->index.indexRel = indexRel;
523 arg->enforceUnique =
false;
524 arg->uniqueNullsNotDistinct =
false;
563 "begin index sort: workMem = %d, randomAccess = %c",
597 "begin index sort: workMem = %d, randomAccess = %c",
652 bool nullsFirstFlag,
int workMem,
668 "begin datum sort: workMem = %d, randomAccess = %c",
688 arg->datumType = datumType;
692 arg->datumTypeLen = typlen;
763 !stup.isnull1, tuplen);
793 arg->indexInfo->ii_IndexAttrNumbers[0],
830 tuple->
t_tid = *self;
865 memcpy(&bstup->
tuple, tuple, size);
896 memcpy(ctup, tuple, size);
947 stup.datum1 = !isNull ?
val : (
Datum) 0;
948 stup.isnull1 = isNull;
953 stup.isnull1 =
false;
1085 return &btup->
tuple;
1156 *abbrev = stup.datum1;
1158 if (stup.isnull1 || !base->
tuples)
1161 *isNull = stup.isnull1;
1188 for (
i = 0;
i < count;
i++)
1213 b->datum1,
b->isnull1,
1248 datum1 =
heap_getattr(<up, attno, tupDesc, &isnull1);
1249 datum2 =
heap_getattr(&rtup, attno, tupDesc, &isnull2);
1259 for (nkey = 1; nkey < base->
nKeys; nkey++, sortKey++)
1263 datum1 =
heap_getattr(<up, attno, tupDesc, &isnull1);
1264 datum2 =
heap_getattr(&rtup, attno, tupDesc, &isnull2);
1287 unsigned int tuplen = tupbodylen +
sizeof(int);
1299 unsigned int tupbodylen =
len -
sizeof(int);
1307 tuple->
t_len = tuplen;
1311 stup->
tuple = tuple;
1333 for (
i = 0;
i < count;
i++)
1339 arg->indexInfo->ii_IndexAttrNumbers[0],
1357 b->datum1,
b->isnull1,
1385 tupDesc =
arg->tupDesc;
1390 if (sortKey->abbrev_converter)
1392 AttrNumber leading =
arg->indexInfo->ii_IndexAttrNumbers[0];
1394 datum1 =
heap_getattr(ltup, leading, tupDesc, &isnull1);
1395 datum2 =
heap_getattr(rtup, leading, tupDesc, &isnull2);
1413 if (
arg->indexInfo->ii_Expressions == NULL)
1417 for (; nkey < base->
nKeys; nkey++, sortKey++)
1419 AttrNumber attno =
arg->indexInfo->ii_IndexAttrNumbers[nkey];
1452 l_index_values, l_index_isnull);
1456 r_index_values, r_index_isnull);
1458 for (; nkey < base->
nKeys; nkey++, sortKey++)
1461 l_index_isnull[nkey],
1462 r_index_values[nkey],
1463 r_index_isnull[nkey],
1500 tuple->
t_len = t_len;
1508 stup->
tuple = tuple;
1512 arg->indexInfo->ii_IndexAttrNumbers[0],
1524 if (
arg->estate != NULL)
1548 for (
i = 0;
i < count;
i++)
1575 b->datum1,
b->isnull1,
1595 bool equal_hasnull =
false;
1605 keysz = base->
nKeys;
1608 if (sortKey->abbrev_converter)
1622 equal_hasnull =
true;
1625 for (nkey = 2; nkey <= keysz; nkey++, sortKey++)
1638 equal_hasnull =
true;
1651 if (
arg->enforceUnique && !(!
arg->uniqueNullsNotDistinct && equal_hasnull))
1663 Assert(tuple1 != tuple2);
1670 (
errcode(ERRCODE_UNIQUE_VIOLATION),
1671 errmsg(
"could not create unique index \"%s\"",
1673 key_desc ?
errdetail(
"Key %s is duplicated.", key_desc) :
1690 return (blk1 < blk2) ? -1 : 1;
1697 return (pos1 < pos2) ? -1 : 1;
1726 arg->max_buckets,
arg->high_mask,
1730 arg->max_buckets,
arg->high_mask,
1732 if (bucket1 > bucket2)
1734 else if (bucket1 < bucket2)
1746 else if (hash1 < hash2)
1762 return (blk1 < blk2) ? -1 : 1;
1769 return (pos1 < pos2) ? -1 : 1;
1796 unsigned int tuplen;
1811 unsigned int tuplen =
len -
sizeof(
unsigned int);
1817 stup->
tuple = tuple;
1834 for (
i = 0;
i < count;
i++)
1864 unsigned int tuplen = tuple->
tuplen;
1866 tuplen = tuplen +
sizeof(tuplen);
1879 unsigned int tuplen =
len -
sizeof(
unsigned int);
1893 stup->
tuple = tuple;
1907 elog(
ERROR,
"removeabbrev_index_gin not implemented");
1928 unsigned int tuplen = tuple->
tuplen;
1930 tuplen = tuplen +
sizeof(tuplen);
1943 unsigned int tuplen =
len -
sizeof(
unsigned int);
1956 stup->
tuple = (
void *) tuple;
1971 for (
i = 0;
i < count;
i++)
1982 b->datum1,
b->isnull1,
2011 unsigned int tuplen;
2012 unsigned int writtenlen;
2022 tuplen =
sizeof(
Datum);
2026 waddr = stup->
tuple;
2031 writtenlen = tuplen +
sizeof(
unsigned int);
2044 unsigned int tuplen =
len -
sizeof(
unsigned int);
2067 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)
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)
#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)