aboutsummaryrefslogtreecommitdiff
path: root/src/include/executor/hashjoin.h
blob: e6f0766b72016b3a869f00e99984bab957ae7fbe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*-------------------------------------------------------------------------
 *
 * hashjoin.h--
 *	  internal structures for hash table and buckets
 *
 *
 * Copyright (c) 1994, Regents of the University of California
 *
 * $Id: hashjoin.h,v 1.6 1997/09/08 21:52:00 momjian Exp $
 *
 *-------------------------------------------------------------------------
 */
#ifndef HASHJOIN_H
#define HASHJOIN_H

#include <storage/ipc.h>

/* -----------------
 *	have to use relative address as pointers in the hashtable
 *	because the hashtable may reallocate in difference processes
 * -----------------
 */
typedef int RelativeAddr;

/* ------------------
 *	the relative addresses are always relative to the head of the
 *	hashtable, the following macro converts them to absolute address.
 * ------------------
 */
#define ABSADDR(X)		((X) < 0 ? NULL: (char*)hashtable + X)
#define RELADDR(X)		(RelativeAddr)((char*)(X) - (char*)hashtable)

typedef char **charPP;
typedef int *intP;

/* ----------------------------------------------------------------
 *				hash-join hash table structures
 * ----------------------------------------------------------------
 */
typedef struct HashTableData
{
	int			nbuckets;
	int			totalbuckets;
	int			bucketsize;
	IpcMemoryId shmid;
	RelativeAddr top;			/* char* */
	RelativeAddr bottom;		/* char* */
	RelativeAddr overflownext;	/* char* */
	RelativeAddr batch;			/* char* */
	RelativeAddr readbuf;		/* char* */
	int			nbatch;
	RelativeAddr outerbatchNames;		/* RelativeAddr* */
	RelativeAddr outerbatchPos; /* RelativeAddr* */
	RelativeAddr innerbatchNames;		/* RelativeAddr* */
	RelativeAddr innerbatchPos; /* RelativeAddr* */
	RelativeAddr innerbatchSizes;		/* int* */
	int			curbatch;
	int			nprocess;
	int			pcount;
} HashTableData;				/* real hash table follows here */

typedef HashTableData *HashJoinTable;

typedef struct OverflowTupleData
{
	RelativeAddr tuple;			/* HeapTuple */
	RelativeAddr next;			/* struct OverflowTupleData * */
} OverflowTupleData;			/* real tuple follows here */

typedef OverflowTupleData *OverflowTuple;

typedef struct HashBucketData
{
	RelativeAddr top;			/* HeapTuple */
	RelativeAddr bottom;		/* HeapTuple */
	RelativeAddr firstotuple;	/* OverflowTuple */
	RelativeAddr lastotuple;	/* OverflowTuple */
} HashBucketData;				/* real bucket follows here */

typedef HashBucketData *HashBucket;

#define HASH_PERMISSION			0700

#endif							/* HASHJOIN_H */