mirror of
https://github.com/postgres/postgres.git
synced 2025-06-05 23:56:58 +03:00
Adjust TupleHashTables to use MinimalTuple format for contained tuples.
This commit is contained in:
parent
15897332ed
commit
cfc710312e
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/executor/execGrouping.c,v 1.18 2006/03/05 15:58:25 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/executor/execGrouping.c,v 1.19 2006/06/28 17:05:49 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -389,7 +389,7 @@ LookupTupleHashEntry(TupleHashTable hashtable, TupleTableSlot *slot,
|
|||||||
|
|
||||||
/* Copy the first tuple into the table context */
|
/* Copy the first tuple into the table context */
|
||||||
MemoryContextSwitchTo(hashtable->tablecxt);
|
MemoryContextSwitchTo(hashtable->tablecxt);
|
||||||
entry->firstTuple = ExecCopySlotTuple(slot);
|
entry->firstTuple = ExecCopySlotMinimalTuple(slot);
|
||||||
|
|
||||||
*isnew = true;
|
*isnew = true;
|
||||||
}
|
}
|
||||||
@ -405,23 +405,23 @@ LookupTupleHashEntry(TupleHashTable hashtable, TupleTableSlot *slot,
|
|||||||
/*
|
/*
|
||||||
* Compute the hash value for a tuple
|
* Compute the hash value for a tuple
|
||||||
*
|
*
|
||||||
* The passed-in key is a pointer to TupleHashEntryData. In an actual
|
* The passed-in key is a pointer to TupleHashEntryData. In an actual hash
|
||||||
* hash table entry, the firstTuple field therein points to a physical
|
* table entry, the firstTuple field points to a tuple (in MinimalTuple
|
||||||
* tuple. LookupTupleHashEntry sets up a dummy TupleHashEntryData with
|
* format). LookupTupleHashEntry sets up a dummy TupleHashEntryData with a
|
||||||
* a NULL firstTuple field --- that cues us to look at the inputslot instead.
|
* NULL firstTuple field --- that cues us to look at the inputslot instead.
|
||||||
* This convention avoids the need to materialize virtual input tuples
|
* This convention avoids the need to materialize virtual input tuples unless
|
||||||
* unless they actually need to get copied into the table.
|
* they actually need to get copied into the table.
|
||||||
*
|
*
|
||||||
* CurTupleHashTable must be set before calling this, since dynahash.c
|
* CurTupleHashTable must be set before calling this, since dynahash.c
|
||||||
* doesn't provide any API that would let us get at the hashtable otherwise.
|
* doesn't provide any API that would let us get at the hashtable otherwise.
|
||||||
*
|
*
|
||||||
* Also, the caller must select an appropriate memory context for running
|
* Also, the caller must select an appropriate memory context for running
|
||||||
* the hash functions. (dynahash.c doesn't change CurrentMemoryContext.)
|
* the hash functions. (dynahash.c doesn't change CurrentMemoryContext.)
|
||||||
*/
|
*/
|
||||||
static uint32
|
static uint32
|
||||||
TupleHashTableHash(const void *key, Size keysize)
|
TupleHashTableHash(const void *key, Size keysize)
|
||||||
{
|
{
|
||||||
HeapTuple tuple = ((const TupleHashEntryData *) key)->firstTuple;
|
MinimalTuple tuple = ((const TupleHashEntryData *) key)->firstTuple;
|
||||||
TupleTableSlot *slot;
|
TupleTableSlot *slot;
|
||||||
TupleHashTable hashtable = CurTupleHashTable;
|
TupleHashTable hashtable = CurTupleHashTable;
|
||||||
int numCols = hashtable->numCols;
|
int numCols = hashtable->numCols;
|
||||||
@ -439,7 +439,7 @@ TupleHashTableHash(const void *key, Size keysize)
|
|||||||
/* Process a tuple already stored in the table */
|
/* Process a tuple already stored in the table */
|
||||||
/* (this case never actually occurs in current dynahash.c code) */
|
/* (this case never actually occurs in current dynahash.c code) */
|
||||||
slot = hashtable->tableslot;
|
slot = hashtable->tableslot;
|
||||||
ExecStoreTuple(tuple, slot, InvalidBuffer, false);
|
ExecStoreMinimalTuple(tuple, slot, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < numCols; i++)
|
for (i = 0; i < numCols; i++)
|
||||||
@ -480,10 +480,10 @@ TupleHashTableHash(const void *key, Size keysize)
|
|||||||
static int
|
static int
|
||||||
TupleHashTableMatch(const void *key1, const void *key2, Size keysize)
|
TupleHashTableMatch(const void *key1, const void *key2, Size keysize)
|
||||||
{
|
{
|
||||||
HeapTuple tuple1 = ((const TupleHashEntryData *) key1)->firstTuple;
|
MinimalTuple tuple1 = ((const TupleHashEntryData *) key1)->firstTuple;
|
||||||
|
|
||||||
#ifdef USE_ASSERT_CHECKING
|
#ifdef USE_ASSERT_CHECKING
|
||||||
HeapTuple tuple2 = ((const TupleHashEntryData *) key2)->firstTuple;
|
MinimalTuple tuple2 = ((const TupleHashEntryData *) key2)->firstTuple;
|
||||||
#endif
|
#endif
|
||||||
TupleTableSlot *slot1;
|
TupleTableSlot *slot1;
|
||||||
TupleTableSlot *slot2;
|
TupleTableSlot *slot2;
|
||||||
@ -497,7 +497,7 @@ TupleHashTableMatch(const void *key1, const void *key2, Size keysize)
|
|||||||
*/
|
*/
|
||||||
Assert(tuple1 != NULL);
|
Assert(tuple1 != NULL);
|
||||||
slot1 = hashtable->tableslot;
|
slot1 = hashtable->tableslot;
|
||||||
ExecStoreTuple(tuple1, slot1, InvalidBuffer, false);
|
ExecStoreMinimalTuple(tuple1, slot1, false);
|
||||||
Assert(tuple2 == NULL);
|
Assert(tuple2 == NULL);
|
||||||
slot2 = hashtable->inputslot;
|
slot2 = hashtable->inputslot;
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@
|
|||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.140 2006/06/21 18:39:42 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.141 2006/06/28 17:05:49 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -957,10 +957,9 @@ agg_retrieve_hash_table(AggState *aggstate)
|
|||||||
* Store the copied first input tuple in the tuple table slot reserved
|
* Store the copied first input tuple in the tuple table slot reserved
|
||||||
* for it, so that it can be used in ExecProject.
|
* for it, so that it can be used in ExecProject.
|
||||||
*/
|
*/
|
||||||
ExecStoreTuple(entry->shared.firstTuple,
|
ExecStoreMinimalTuple(entry->shared.firstTuple,
|
||||||
firstSlot,
|
firstSlot,
|
||||||
InvalidBuffer,
|
false);
|
||||||
false);
|
|
||||||
|
|
||||||
pergroup = entry->pergroup;
|
pergroup = entry->pergroup;
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/executor/nodeSubplan.c,v 1.75 2006/06/16 18:42:22 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/executor/nodeSubplan.c,v 1.76 2006/06/28 17:05:49 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -572,8 +572,7 @@ findPartialMatch(TupleHashTable hashtable, TupleTableSlot *slot)
|
|||||||
ResetTupleHashIterator(hashtable, &hashiter);
|
ResetTupleHashIterator(hashtable, &hashiter);
|
||||||
while ((entry = ScanTupleHashTable(&hashiter)) != NULL)
|
while ((entry = ScanTupleHashTable(&hashiter)) != NULL)
|
||||||
{
|
{
|
||||||
ExecStoreTuple(entry->firstTuple, hashtable->tableslot,
|
ExecStoreMinimalTuple(entry->firstTuple, hashtable->tableslot, false);
|
||||||
InvalidBuffer, false);
|
|
||||||
if (!execTuplesUnequal(hashtable->tableslot, slot,
|
if (!execTuplesUnequal(hashtable->tableslot, slot,
|
||||||
numCols, keyColIdx,
|
numCols, keyColIdx,
|
||||||
hashtable->eqfunctions,
|
hashtable->eqfunctions,
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/nodes/execnodes.h,v 1.150 2006/04/30 18:30:40 tgl Exp $
|
* $PostgreSQL: pgsql/src/include/nodes/execnodes.h,v 1.151 2006/06/28 17:05:49 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -367,7 +367,7 @@ typedef struct TupleHashTableData *TupleHashTable;
|
|||||||
typedef struct TupleHashEntryData
|
typedef struct TupleHashEntryData
|
||||||
{
|
{
|
||||||
/* firstTuple must be the first field in this struct! */
|
/* firstTuple must be the first field in this struct! */
|
||||||
HeapTuple firstTuple; /* copy of first tuple in this group */
|
MinimalTuple firstTuple; /* copy of first tuple in this group */
|
||||||
/* there may be additional data beyond the end of this struct */
|
/* there may be additional data beyond the end of this struct */
|
||||||
} TupleHashEntryData; /* VARIABLE LENGTH STRUCT */
|
} TupleHashEntryData; /* VARIABLE LENGTH STRUCT */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user