Header And Logo

PostgreSQL
| The world's most advanced open source database.

Data Structures | Functions

hashsort.c File Reference

#include "postgres.h"
#include "access/hash.h"
#include "miscadmin.h"
#include "utils/tuplesort.h"
Include dependency graph for hashsort.c:

Go to the source code of this file.

Data Structures

struct  HSpool

Functions

HSpool_h_spoolinit (Relation heap, Relation index, uint32 num_buckets)
void _h_spooldestroy (HSpool *hspool)
void _h_spool (IndexTuple itup, HSpool *hspool)
void _h_indexbuild (HSpool *hspool)

Function Documentation

void _h_indexbuild ( HSpool hspool  ) 

Definition at line 103 of file hashsort.c.

References _hash_doinsert(), HSpool::index, NULL, pfree(), HSpool::sortstate, tuplesort_getindextuple(), and tuplesort_performsort().

Referenced by hashbuild().

{
    IndexTuple  itup;
    bool        should_free;

    tuplesort_performsort(hspool->sortstate);

    while ((itup = tuplesort_getindextuple(hspool->sortstate,
                                           true, &should_free)) != NULL)
    {
        _hash_doinsert(hspool->index, itup);
        if (should_free)
            pfree(itup);
    }
}

void _h_spool ( IndexTuple  itup,
HSpool hspool 
)

Definition at line 93 of file hashsort.c.

References HSpool::sortstate, and tuplesort_putindextuple().

Referenced by hashbuildCallback().

{
    tuplesort_putindextuple(hspool->sortstate, itup);
}

void _h_spooldestroy ( HSpool hspool  ) 

Definition at line 83 of file hashsort.c.

References pfree(), HSpool::sortstate, and tuplesort_end().

Referenced by hashbuild().

{
    tuplesort_end(hspool->sortstate);
    pfree(hspool);
}

HSpool* _h_spoolinit ( Relation  heap,
Relation  index,
uint32  num_buckets 
)

Definition at line 47 of file hashsort.c.

References _hash_log2(), HSpool::index, maintenance_work_mem, palloc0(), HSpool::sortstate, and tuplesort_begin_index_hash().

Referenced by hashbuild().

{
    HSpool     *hspool = (HSpool *) palloc0(sizeof(HSpool));
    uint32      hash_mask;

    hspool->index = index;

    /*
     * Determine the bitmask for hash code values.  Since there are currently
     * num_buckets buckets in the index, the appropriate mask can be computed
     * as follows.
     *
     * Note: at present, the passed-in num_buckets is always a power of 2, so
     * we could just compute num_buckets - 1.  We prefer not to assume that
     * here, though.
     */
    hash_mask = (((uint32) 1) << _hash_log2(num_buckets)) - 1;

    /*
     * We size the sort area as maintenance_work_mem rather than work_mem to
     * speed index creation.  This should be OK since a single backend can't
     * run multiple index creations in parallel.
     */
    hspool->sortstate = tuplesort_begin_index_hash(heap,
                                                   index,
                                                   hash_mask,
                                                   maintenance_work_mem,
                                                   false);

    return hspool;
}