1999-10-18 00:15:09 +02:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
* tuplesort.h
|
|
|
|
* Generalized tuple sorting routines.
|
|
|
|
*
|
1999-12-13 02:27:21 +01:00
|
|
|
* This module handles sorting of heap tuples, index tuples, or single
|
|
|
|
* Datums (and could easily support other kinds of sortable objects,
|
1999-10-18 00:15:09 +02:00
|
|
|
* if necessary). It works efficiently for both small and large amounts
|
|
|
|
* of data. Small amounts are sorted in-memory using qsort(). Large
|
|
|
|
* amounts are sorted using temporary files and a standard external sort
|
|
|
|
* algorithm.
|
|
|
|
*
|
2000-01-26 06:58:53 +01:00
|
|
|
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
|
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
1999-10-18 00:15:09 +02:00
|
|
|
*
|
2000-01-26 06:58:53 +01:00
|
|
|
* $Id: tuplesort.h,v 1.3 2000/01/26 05:58:38 momjian Exp $
|
1999-10-18 00:15:09 +02:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
#ifndef TUPLESORT_H
|
|
|
|
#define TUPLESORT_H
|
|
|
|
|
|
|
|
#include "access/htup.h"
|
|
|
|
#include "access/itup.h"
|
|
|
|
#include "access/skey.h"
|
|
|
|
#include "access/tupdesc.h"
|
|
|
|
#include "utils/rel.h"
|
|
|
|
|
|
|
|
/* Tuplesortstate is an opaque type whose details are not known outside tuplesort.c. */
|
|
|
|
|
|
|
|
typedef struct Tuplesortstate Tuplesortstate;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* We provide two different interfaces to what is essentially the same
|
|
|
|
* code: one for sorting HeapTuples and one for sorting IndexTuples.
|
|
|
|
* They differ primarily in the way that the sort key information is
|
|
|
|
* supplied.
|
1999-12-13 02:27:21 +01:00
|
|
|
* Yet a third slightly different interface supports sorting bare Datums.
|
1999-10-18 00:15:09 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
extern Tuplesortstate *tuplesort_begin_heap(TupleDesc tupDesc,
|
|
|
|
int nkeys, ScanKey keys,
|
|
|
|
bool randomAccess);
|
|
|
|
extern Tuplesortstate *tuplesort_begin_index(Relation indexRel,
|
|
|
|
bool enforceUnique,
|
|
|
|
bool randomAccess);
|
1999-12-13 02:27:21 +01:00
|
|
|
extern Tuplesortstate *tuplesort_begin_datum(Oid datumType,
|
|
|
|
Oid sortOperator,
|
|
|
|
bool randomAccess);
|
1999-10-18 00:15:09 +02:00
|
|
|
|
|
|
|
extern void tuplesort_puttuple(Tuplesortstate *state, void *tuple);
|
|
|
|
|
1999-12-13 02:27:21 +01:00
|
|
|
extern void tuplesort_putdatum(Tuplesortstate *state, Datum val,
|
|
|
|
bool isNull);
|
|
|
|
|
1999-10-18 00:15:09 +02:00
|
|
|
extern void tuplesort_performsort(Tuplesortstate *state);
|
|
|
|
|
|
|
|
extern void *tuplesort_gettuple(Tuplesortstate *state, bool forward,
|
|
|
|
bool *should_free);
|
|
|
|
#define tuplesort_getheaptuple(state, forward, should_free) \
|
|
|
|
((HeapTuple) tuplesort_gettuple(state, forward, should_free))
|
|
|
|
#define tuplesort_getindextuple(state, forward, should_free) \
|
|
|
|
((IndexTuple) tuplesort_gettuple(state, forward, should_free))
|
|
|
|
|
1999-12-13 02:27:21 +01:00
|
|
|
extern bool tuplesort_getdatum(Tuplesortstate *state, bool forward,
|
|
|
|
Datum *val, bool *isNull);
|
|
|
|
|
1999-10-18 00:15:09 +02:00
|
|
|
extern void tuplesort_end(Tuplesortstate *state);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* These routines may only be called if randomAccess was specified 'true'.
|
1999-12-13 02:27:21 +01:00
|
|
|
* Likewise, backwards scan in gettuple/getdatum is only allowed if
|
|
|
|
* randomAccess was specified.
|
1999-10-18 00:15:09 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
extern void tuplesort_rescan(Tuplesortstate *state);
|
|
|
|
extern void tuplesort_markpos(Tuplesortstate *state);
|
|
|
|
extern void tuplesort_restorepos(Tuplesortstate *state);
|
|
|
|
|
|
|
|
#endif /* TUPLESORT_H */
|