summaryrefslogtreecommitdiff
path: root/src/include/executor/hashjoin.h
blob: e705c5c77d63a687248a4f6e0af8b04ab17abebf (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.4 1997/09/07 04:57:49 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 */